Monday, December 22, 2008

..*~'"*..*"`'*..."~`*..Merry Christmas..*~'"*..*"`'*..."~`*..

My favorite Christmas songs/videos: (although I do not celebrate Christmas because I am a Buddhist, but let's have fun!!)

Thursday, December 18, 2008

Automate graph drawing with Grapviz

The picture shows an example of using Graphviz to draw a graph for Traffic Information module. The arrows depict the objects's communication using Observer Pattern.

digraph TIComponent {

graph [ label = "\nTraffic Infomation's communication",
size = "11",
fontsize = 20,


node [ //shape = box,

color = darkslateblue,

style = filled,

fillcolor = deepskyblue1];

edge [ decorate = false ]


subgraph cluster_TI {
abel="TI Kernel";





subgraph cluster_Device {
//node [shape = box]





subgraph cluster_App {



"Client 1";
"Client 2";

Tuner->"Client 1" [label="new station", labelfloat=false, color=darkgreen, fontcolor=darkgreen];
Tuner->Receiver [label="status of band scan",color=magenta, fontcolor=magenta];
Receiver->Cache [label="TrafficData", color=firebrick3, fontcolor=firebrick3];
Receiver->Tuner [label="search next station", color=gold2, fontcolor=gold2];
Cache->"Client 2" [label="message update", color=violet, fontcolor=violet];
Cache->"Client 1" [label="message update", color=violet, fontcolor=violet];
Database->Cache [arrowhead="dot", minlen=2];
Device->Receiver [arrowhead="dot", minlen=0];
Device->Tuner [headlabel="new station", labelfloat=true, color=darkgreen, minlen=2, labeldistance=2, fontcolor=darkgreen];
Tuner->Device [label="search next station", labelfloat=true, color=gold2, minlen=1, fontcolor=gold2];


To generate output as png from the dot, type

$ dot -Tpng -ooutput.png

Tuesday, December 16, 2008

File browser application for S60 developer: "Y Browser"

It is designed for S60 3rd edition devices (Symbian OS 9.x) similar to FileBrowser in RnD Tools from mobile phone manufacture, which you can change files in private directory on C drive.

You can get it directly from Dr.Jukka's website:

Programming fiasco :: "static" initialization

You write two applications using same library, you end up in sudden crash in the library in one application but not another. You expect your compiler might give you a hint lead to that failure but it doesn't.

Check out the following topics from C++ FAQ Lite:

Friday, December 12, 2008

Automate self-extraction file using Rar (WinRar)

Purpose: We have several directories and we want to automate packing process for all of directories specified in configuation file to be each self-extraction.
To make the self extraction file for DVD installer using Rar.exe (console version of WinRar)

%dirZipNames is the hash which contains the list of input directories and output file names.
$rarPath is the executable "Rar.exe" and its path.
$inputDir is the directory which contains the input directories for packing.


## Start packing..
for $_ (keys %dirZipNames) {
my $dir = $inputDir . "\\" . $_;
my $zipExe = $inputDir . "\\" . $dirZipNames{$_} . ".exe";
if ( -d $dir && ! -e $zipExe) {
my $dirAll = $dir . "\\*.*";
print "Start packing $dirAll ...proceeding...\n";
print "Or check the progress in make_exe.log...";
system (qq{"$rarPath" a -r -m5 -sfx "$zipExe" "$dirAll" >> "$inputDir\\make_exe.log"});
print "\nOK: $zipExe is done!\n";
else {
print "\nError: Directory $dir does not exist \n\tor the $zipExe is already created!\n";

A sample to employ "epocrc" for automatic resource file creation

Example of using "epocrc" from SDK 3rd Edition FP1

> epocrc -I\symbian\epoc32\include\ -u ex.rss -oex.rsc -hex.rsg

What we want to do here is to generate any "oemid" any time when requested without recompiling the whole resources.

In the example, I have default setting of oemid 1000 and I will replace 1000 with any new id for the resource file which passed to the makeResource function, whereas the output has the same name appended with its new id.

sub makeResource {

my $baseRssFile = "oempid_0x2000AAAA";


my $pid = $_[0];
my $rssFile = $baseRssFile . ".rss";
my $newRssFile = $baseRssFile . "_" . $pid . ".rss";
open(RSSFILE, $rssFile) or die "Error: Cannot open $1 : $!\n";

my @file = ;

open(NEWRSSFILE, ">$newRssFile") or die "Error: Cannot open $1 : $!\n";
foreach $_ (@file) {
if ( $_ =~ m/1000/ && $_ =~ /buf/) {
$_ =~ s/1000/$pid/g;

print NEWRSSFILE $_;

my $rscFile = $baseRssFile . "_" . $pid . ".rsc";
system("epocrc -I$symbPath -u $newRssFile -o$rscFile");
system("del $newRssFile");
print "$rscFile is done\n";

The following part is to read the arguments which may be passed as range of integer or non range integer seperated each entries by comma.

my @num = split(/,/, $args{i});

foreach $_ (@num) { // Input may look like 1,4,7-10,200
my $pid = "";
if ( $_ =~ /(.+)-(.+)/ ) { //search if the input is in range
foreach( $1 .. $2 ) {
&makeResource( $_ );

else { // non-range argument
&makeResource( $_ );


Thursday, December 11, 2008

Wrap around the text with double quote using sed

Purpose: To convert a resource file from excel to be readable by Symbian resource compiler.
Tools: sed
Input: file exported from excel
Output: file with double quotes wraped around the 2nd column text

Format of the file exported from excel with 2 columns separated by tab may look like this:


//Description of this group xxxxxxxxxxxxx
// String : Message group
// Max length: 256

#define qtn_app_update_message \nUpdateMessage
#define qtn_app_cancel_message Cancel Message


Here, I would like to wrap the 2nd column with double quote just for the texts which start with #define, but do not insert the quote otherwise.

$ sed -e '/^#/ s/\t/&"/g' -e '/^#/ s/$/"&/' input > output

We try with the combination of two substitions. The first is to insert the double quote after the tab found, the later is to insert
double quote before the line ending. Both substitions are executed only when the lines started with hash.

Obligatory Perforce commands

I am used to with P4V or P4Win but from time to time, I need the "p4" from command line to pass the output to the script.
I found the following p4 commands are obligatory.

To view the current p4 setting, type:
>p4 info

To view it from windows environment:

You can see P4CLIENT and other P4's setting parameters.

To remove p4 client :
>p4 client -d client_name

Otherwise try to create a new one or edit the default one with :
>p4 client

it will give you a temp file to be edited. You can then change to any new client's names
which map to your mapping directories. We usually simply change the "client" and "view" entries where the client can be new name while views are your mappings.
(mind you, take care not to put the new line ending at the end of your views entries otherwise you will get the error message)

Or set it with:
>set P4CLIENT=new_client_name

Now, check if the P4CLIENT is set properly
>echo %P4CLIENT%

Normally, we just need the setting to P4USER (default is automatic set from windows's login account), P4EDITOR (default is notepad for Windows) and P4PORT (it must be manually set). However under Linux, we might need to explicitly export the P4USER in .bashrc if it is not set.
This is my case, I simply added the following lines in my .bashrc:

export P4USER=pattreeya
export P4EDITOR=vim
export P4PORT=scm-srv:1666

To list all p4 environment variables used by Perforce:
>p4 help environment

To diff the local files and the ones in depot, type:
>p4 diff -du20 > diff.txt
The option -du is the unified different and contain 20 lines prior each difference.

To diff between two branches, try:
>p4 diff2 -dub20 -u //work/dev_01/... //work/dev_02/... > diffs.txt

To list the current workspace owned by a user:
>p4 clients -u username

For more detail of p4 commands, type "p4" or "p4 help simple" or "p4 help commands".