Tools I use

I think the tools that we use and the way we use them define us in some ways. Some people prefer to work with command prompts even though a GUI is available, some people always stick with their editors that they use and switching to a new editor is very unsettling. As you progress as a developer you become greatly attached to these tools and the first thing that we do on a new PC is setup the tools the way we want. So here goes the list of tools that I use.

TextPad
TextPad has always been the editor for me. Its a simple to use editor with powerful features. Be it its support for regular expressions, built in clip library or its smart cursor placement, all work flawlessly. I like its text search options and searching for texts in files isn’t very bad too. You can search for it in download dot com, a free to use version is available.

Everything (Search tool)
Well, I found this tool by chance and it is one of the best search tools that I have used. You can search for any file or folder on your PC by just typing a few characters of the file/folder name. The searches are lightning fast, literally, once it has indexed the files of course. A very light weight and easy to use tool and if you are a person who constantly has to look for files because you don’t remember where you put them, then this tool is for you. You still need to remember the file name though, well, at least a part of it. No tool is idiot proof you see.

You can find the tool here:
http://download.cnet.com/Everything/3000-2379_4-10890746.html?tag=mncol

Examine 32 (Searches for texts within files)

This is a tool that I use to search for texts within files. The interface isn’t very sleek but it gets the job done pretty well. I like the way it displays the search results and it allows me to open a particular file just by clicking on the search results.

You can find the tool here:

http://download.cnet.com/Examine32-Text-Search/3000-2248_4-10059590.html?tag=mncol


Source Insight
Now this is a great tool for source code browsing. You just build your project by adding all your source files into it and you’re done. You can open any file, jump to any symbol, go to definitions, go back to previous cursor positions, see the call graph and tons of more features.


Object Dock
I used this tool for a while to quickly access my most frequently used programs. I like to keep my desktop clean.  But sometimes it takes up too much cpu for too much long and that is not very pleasing. I still use it occasionally though.


If you want to try it, follow the link:

Update: Object Dock is out and SlickRun is in. Object Dock was hogging to much cpu.

Google
You could raise your eyebrows but its one of the best tools available out there. I always setup google as my homepage and the search results that I get work for me.




Well, thats about the tools I use. If you have any such tools which you find make you more productive, be sure to leave a note.


Update:8thApr09



Command prompt here powertoy
I forgot to mention another useful tool, Command Prompt here power toy.  Its a small utility program that adds a menu item to the explorer context menu which allows you to open the command prompt with the current directory set to the directory you clicked on. It saves a lot of time trying to navigate to a particular directory in command prompt, so you just right click, select ‘Open command prompt here..’ and off you go. The tool is free and can be downloaded from the link below:


http://download.cnet.com/Vista-XP-Command-Prompt-Here/3000-2248_4-10698774.html

Update:10thApr09

Beyond Compare
Beyond compare is a file and directory compare tool that I use at work. It is quite fast and the interface is neat. Compare options show up in the explorer context menus which is nice.

WinMerge is also used to do the same. One advantage WinMerge has over Beyond Compare is that its free. You can download it from the link below:

http://winmerge.org/



Applications: Creating a simple UI application for Windows Mobile 6 using Visual Studio 2005: Part 1

Time to do some actual work. As the title suggests, I will be creating a simple UI application for windows mobile 6 professional device using visual studio 2005 and improve it step by step. I will cover the developments over maybe 2 or 3 posts and lets see how it goes.



Make sure you have installed Visual Studio 2005 and Windows Mobile 6 professional SDK before you proceed.



Note: When creating new smart device projects with VS2005 you might get a script failure error saying that the project creation failed, its a known issue and happens when you have IE7 or IE8 installed. Strangely, I have IE6 SP2 on my machine but the same error still showed up. Follow the instructions here to resolve the problem:



http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx





Open VS2005, select File->new->Project. The project wizard shows up. In "Project Types" select "Smart Device" under "Visual C++". On the right side select "Win32 Smart Device Project" and choose a name and location for this project. Lets call it "HelloWorld".

The project wizard now shows up asking you to select the platform and other project settings. Select "Next". Your Windows Mobile 6 professional sdk should show up on the list of installed sdk’s. Add this sdk to the "Selected SDK’s list" and lets remove "Pocket PC 2003" which will be selected by default. Click Next. The final page lets you select the type of your project and other options. Select "Windows Application" and leave the "Additional Options" and "Add support for" sections as is. Do not select "Empty Project" or "ATL" or "MFC". We will see how to go about creating an empty project in a later post. Click "Finish" and you are done. Source files and resource files which were automatically generated by the project wizard will now show up in solution explorer.



I prefer to work with "Windows Mobile 6 professional emulator" rather than the classic emulator. Basically, the classic emulator does not support phone functionality, you can see that the ‘Talk’ and ‘End’ buttons are not present. I will cover using the phone functionality in the emulator in later posts. So for now, just select the professional emulator. (With default settings, there should be a drop down list box on the top-left which enables you to select the type of emulator.)



Open stdafx.cpp and compile it (ctrl+F7). Open HelloWorld.cpp and compile. Now build the solution (F7). This should build our project without any errors. HelloWorld.exe should now be present under the debug folder in our project path. In my case it is: F:\MyProjects\HelloWorld\HelloWorld\Windows Mobile 6 Professional SDK (ARMV4I)\Debug->HelloWorld.exe



From the "Debug" menu select "Start Debugging", the emulator will now start and your application should deploy on it. This is how the application should look:



Application running on emulator





So there it is. A dumb application really. Let us add some functionality to it in the next post.

Part 2
Part 3

Applications: Creating a simple UI application for Windows Mobile 6 using Visual Studio 2005: Part 2

Ok now that we have our basic application up and running, lets make some changes. First, I want to change the right soft key from "HELP" to "Menu", somehow "HELP" is not very appealing. One more thing, I use the resource editor only to add new resources to the project, any further changes or modification I like to do it by manually editing the resource files (To do that, just right click on the .rc file and select "View Code").



If you open HelloWorld.cpp and in function WndProc go to the case where WM_CREATE is handled, you will see that the menu bar is getting created there using the SHCreateMenuBar api. The nToolBarId member of SHMENUBARINFO contains IDR_MENU, which is the resource identifier of the menu bar. Now open HelloWorldppc.rc2 and you will see that the menu bar is defined as below:



IDR_MENU SHMENUBAR DISCARDABLE

BEGIN

    IDR_MENU_POPUP,

    2,



    I_IMAGENONE, IDM_OK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,

    IDS_OK, 0, NOMENU,

   

    I_IMAGENONE, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE,

    IDS_HELP, 0, 0,

END



The first line says that IDR_MENU is a menubar. Everything in between BEGIN and END defines the menu bar. The first line under BEGIN identifies the popup menu which will be displayed when the user clicks on the MENU. If your MENUBAR does not have any popup menu’s, then you can specify a value of 0 here. In this case, the popup menu that will be displayed here, when the user clicks on "Menu" is IDR_MENU_POPUP, which we will define later. "2" specifies that the menu bar will have two entries, one left soft key and one right soft key. The first entry after "2" defines the left soft key and the next entry defines the right softkey. You can see that the left entry is for "OK" and the right entry is for "HELP". We will not change the first entry. Lets modify the second entry so that it defines our new entry, which is "Menu". So we change



    I_IMAGENONE, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 0,



to



       I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENU, 0, 0,



This change is not absolutely necessary but I like to name my variables just right.



Now open resourceppc.h and make the same changes. Rename IDS_HELP to IDS_MENU and IDM_HELP to IDM_MENU. A few more changes and we are done. Open HelloWorld.rc and search for the string table that defines the value for IDS_HELP. Will be something like:



STRINGTABLE 

BEGIN

   .

   .

   IDS_HELP    "HELP"

END



Change this to:



STRINGTABLE 

BEGIN

   .

   .

   IDS_MENU    "Menu"

END





The items under the popup menu will be defined in HelloWorld.rc file. Although you can define it .rc2 file as well, but by default it will be present in the .rc file.



IDR_MENU_POPUP MENU DISCARDABLE

BEGIN

    POPUP "Help"

    BEGIN

        MENUITEM "About",        IDM_HELP_ABOUT

    END

END



This defines our original right soft key menu which is a popup. Change this entry so that "Menu" shows up instead of "HELP":



IDR_MENU_POPUP MENU DISCARDABLE

BEGIN

    POPUP "Menu"

    BEGIN

        MENUITEM "About",        IDM_HELP_ABOUT

    END

END



Thats it. The right soft key should now be renamed to "Menu". You might think that this is a lot of work just to rename a menu entry. But its not much. The changes in the .rc2 file were just for the sake of naming convention and you can leave that part if you wish but make sure that all your ID*_ macros are in sync.



Build the project and run. The application should now look like this:







Lets quickly add one more entry under Menu called "System Metric", which will show the screen width and height in a message box. Adding a menu entry is simple. Open HelloWorld.rc file where the popup items for the right menu are defined. They will be defined like this:



IDR_MENU_POPUP MENU DISCARDABLE

BEGIN

    POPUP "Menu"

    BEGIN

       MENUITEM "About",            IDM_HELP_ABOUT

    END

END



Just add another MENUITEM entry for "System Metric":



IDR_MENU_POPUP MENU DISCARDABLE

BEGIN

    POPUP "Menu"

    BEGIN

        MENUITEM "System Metric",    IDM_SYSTEM_METRIC

        MENUITEM "About",            IDM_HELP_ABOUT

    END

END



IDM_SYSTEM_METRIC is the command (or simply a number) that will be sent to our application when the user selects it. So you need to define this in the resourceppc.h header file so that the compiler can find it. You can add a menu separator by adding MENUITEM SEPARATOR as one of the items in the menu.



Add  "#define IDM_SYSTEM_METRIC 40003" to resourceppc.h. I chose 40003 because that number wasn’t yet used in my header file. The number doesn’t matter, just make sure that the number you use is unique and is not used already in this or some other header file. In large projects with many resources this could get messy, manually keeping track of numbers. When creating resources using the resource editor these entries are automatically created and unique.



Now we need to handle this menu item. That is, what happens when the user clicks on it. When the user selects the menu item, a WM_COMMAND will be sent to our application. This will end up in WndProc function. The LPARAM and WPARAM parameters will contain more information about which item in our application caused the WM_COMMAND message to be sent. In the WndProc function go the section which is handling WM_COMMAND. Under WM_COMMAND handling you will see that other messages like IDM_HELP_ABOUT and ID_OK are already being handled. This is where we need to add the entry for our IDM_SYSTEM_METRIC. Create the following entry just after the IDM_OK case:



case IDM_SYSTEM_METRIC:

{

    int width = -1, height = -1;

    WCHAR wOutStr[64] = L"";

    WCHAR wCaption[16] = L"";



    width =  GetSystemMetrics(SM_CXSCREEN);

    height = GetSystemMetrics(SM_CYSCREEN);



    if(!width || !height)

    {

        wsprintf(wOutStr, L"Failed to get system metrics.");

        wsprintf(wCaption, L"Error");

    }

    else

    {

        wsprintf(wOutStr, L"System width :%d\nSystem Height:%d", width, height);

        wsprintf(wCaption, L"Info");

    }



    MessageBox(hWnd, wOutStr, wCaption, MB_OK);



}

break;



In the message handling I use the GetSystemMetrics api to get the system width and system height values. If the api’s return error (zero) I contruct an error string otherwise I construct a string with the values I got and then show the string using a MessageBox. Simple.



This is how the UI looks:







and,








Part 1
Part 3

Applications: Creating a simple UI application for Windows Mobile 6 using Visual Studio 2005: Part 3

So now our program displays the system width and height in a Message box. Let us see how this message box evolves into a Dialog box.

 

Instead of displaying the system metrics in a Message box, we will display the same information in a full screen dialog box. The dialog box will have a menu bar, with the left soft key as "Back" and the right soft key as "Refresh". We’ll see what "Refresh" will do later.



First lets add the dialog box resource to our project. You can add a new dialog using the resource editor. Go to Resource view, right click on Dialog and "Add Resource..", from the list select POCKETPC_PORTRAIT dialog. This will add a new dialog resource to the project. Rename the dialog id to IDD_DIALOG_SYSMETRIC and change the title to "System Metric". Now add four static texts to the dialog. 2 containing the text "System Width:" and "System Height:" and the other two will contain the actual numbers.  Lets name the controls which will contain the width and height as IDC_STATIC_SYSWIDTH and IDS_STATIC_SYSHEIGHT. The dialog will now look like:

Lets create the menu bar for our new dialog. Add the following piece of code to HelloWorldppc.rc2:


IDR_MENU_SYSMETRIC SHMENUBAR DISCARDABLE

BEGIN

    IDR_MENU_SYSMETRIC,

    2,



    I_IMAGENONE, IDM_BACK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,

    IDS_BACK, 0, NOMENU,

   

    I_IMAGENONE, IDM_REFRESH, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,

    IDS_REFRESH, 0, NOMENU,

END

This defines the new menu bar, IDR_MENU_SYSMETRIC, for an explanation of the above see my previous post "Applications: Creating a simple UI application for Windows Mobile 6 using Visual Studio 2005: Part 2"



This menu bar does not have any popup menu. You can see that both the entries are TBSTYLE_BUTTON and NOMENU.



Now you need to #define the entries for IDR_MENU_SYSMETRIC, IDM_BACK, IDS_BACK, IDM_REFRESH, IDS_REFRESH in resourceppc.h. Make sure that the numbers you assign to these macros are unique.



The dialog and the menu bar are ready, now we just need to call DialogBox in our main code. So, in HelloWorld.cpp, replace the call to MessageBox under IDM_SYSTEM_METRIC with:



DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG_SYSMETRIC), hWnd, SysMetricDlgProc);



The first parameter contains the instance handle of the module which contains the resource template of the dialog. The MAKEINTRESOURCE macro converts the number IDD_DIALOG_SYSMETRIC to a resource type, required by DialogBox. Third parameter specifies the parent window of the Dialog box. And the last parameter is the callback function which will handle the messages of our dialog.



Also, forward declare the callback function as follows:



BOOL CALLBACK SysMetricDlgProc(HWND, UINT, WPARAM, LPARAM);





Here is the code for the Dilaog proc, SysMetricDlgProc

BOOL CALLBACK SysMetricDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)

{

    int wmId, wmEvent;



    switch (uMessage)

    {

        case WM_INITDIALOG:

            {

                // Create a Done button and size it. 

                SHINITDLGINFO shidi;

                SHMENUBARINFO mbi;



                shidi.dwMask = SHIDIM_FLAGS;

                shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;

                shidi.hDlg = hDlg;

                SHInitDialog(&shidi);





                memset(&mbi, 0, sizeof(SHMENUBARINFO));

                mbi.cbSize     = sizeof(SHMENUBARINFO);

                mbi.hwndParent = hDlg;

                mbi.nToolBarId = IDR_MENU_SYSMETRIC;

                mbi.hInstRes   = g_hInst;



                if (!SHCreateMenuBar(&mbi))

                {

                    printf("SHCreateMenuBar failed err code:%d\n", GetLastError());

                }

                else

                {

                }



                UpdateSystemMetric(hDlg);

            }

            return TRUE;



        case WM_COMMAND:

            wmId = LOWORD(wParam);

            wmEvent = HIWORD(wParam);



            switch(wmId)

            {

                case IDOK:

                    EndDialog(hDlg, uMessage);

                    return TRUE;



                case IDM_REFRESH:

                    //MessageBox(NULL, L"Pressed refresh",L"Info", MB_OK);

                    UpdateSystemMetric(hDlg);

                    return TRUE;



                case IDM_BACK:

                    EndDialog(hDlg, uMessage);

                    return TRUE;

            }

            break;



        case WM_CLOSE:

            EndDialog(hDlg, uMessage);

            return TRUE;



    }



    return FALSE;

}





In WM_INITDIALOG, we initialise the dialog as full screen and also add the menu bar. The UpdateSystemMetric() function updates the dialog with the system width and system height.


BOOL UpdateSystemMetric(HWND hDlg)

{

    int width = -1, height = -1;



    width =  GetSystemMetrics(SM_CXSCREEN);

    height = GetSystemMetrics(SM_CYSCREEN);



    SetDlgItemInt(hDlg, IDC_STATIC_SYSWIDTH, width, FALSE);

    SetDlgItemInt(hDlg, IDC_STATIC_SYSHEIGHT, height, FALSE);



    return TRUE;

}

UpdateSystemMetric() function uses the same api to get the screen width and height. And it uses SetDlgItemInt() api to set the contents of IDC_STATIC_SYSWIDTH static control to width, and the same for height.





Now we handle IDM_BACK and IDM_REFRESH under WM_COMMAND. IDM_BACK simply ends the dialog and returns to the main screen, IDM_REFRESH, re-calculates the width and height and updates the values in the UI.





Now when we select the "System Metric" menu item, the dialog box will show up as below:





and when we switch the emulator to landscape mode and hit "Refresh", the values are updated in the UI.

Part 1
Part 2

Applications: Adding Image to your application

Well, back from work and I was sitting idle. I thought the first screen of my application looks a bit stale really, so, I decided to add a small picture to the main screen.

 

Adding an image resource to your project:
This is really easy.

 

1. Copy the bitmap file into you project directory.
2. Go to Resource View, right click and select "Add Resource.."
3. Select "Bitmap" and click on "Import.."
4. Point it to the file you copied in step 1
5. Note the ID assigned to your bitmap. In my case it was IDB_BITMAP1

 

And thats it! The resource is now present within your project, you just need to write code to use it.

 

In my WndProc function, just before breaking under WM_CREATE, I make a call to this function AlignComponents(), which looks like this:

void AlignComponents(HWND hWnd)

{

    RECT rect;

    int imageWidth = 32, imageHeight = 32;

    int imageX = 0, imageY = 0;

    int captionX = 0, captionY = 0;

    const int offset = 25;

    TCHAR captionText[] = TEXT("TechTwaddle\n Copyright (c) 2009");



    GetClientRect(hWnd, &rect);



    imageX = rect.right/2 – imageWidth/2;

    imageY = rect.bottom/2 – imageHeight*2;

   

    HWND hStatic = CreateWindowEx (0, L"STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP,

                                    imageX, imageY, imageWidth, imageHeight, hWnd, 0, g_hInst, NULL);



    if (hStatic)

    {

        HBITMAP hImage = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));

        SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage);

    }



    captionX = rect.left + offset;

    captionY = imageY + imageHeight + 3;



    HWND hStaticCaption = CreateWindowEx(0, L"STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_CENTER,

                                    captionX, captionY, rect.right – offset*2, 30, hWnd, 0, g_hInst, NULL);



    if(hStaticCaption)

    {

        SendMessage(hStaticCaption, WM_SETTEXT, 0, (LPARAM)captionText);

    }

}

The above code gets the client rect of the main window and calculates the X and Y position of the image based on the rect. I then use CreateWindowEx to create a static control which will show my bitmap. Use LoadBitmap to load the bitmap and get a handle to it and then send STM_SETIMAGE message, passing the bitmap handle so that the image can be shown in the control. Note that the static control was created using SS_BITMAP as one of its styles. Without this style the static control will not show the image.


Then I create another static control positionally relative to the image. And send WM_SETTEXT message to it to set the text. Note that the SS_BITMAP style is not mentioned in this static control. I had just copy pasted the code from above with SS_BITMAP set and sat wondering for a few minutes why the text was not showing up.
 

Anyways, my main screen now looks like:

A lot better than before. I thought I’ll change the font of the text but was too lazy. Maybe tomorrow.

Applications: That thing called Gradience

I added a little gradient fill to the main screen. And it is quite easy really. By the way, here’s what my main screen looks like now, cool eh (:

Lets look at GradientFill first. The function is prototyped as:

 

BOOL GradientFill(HDC hdc, PTRIVERTEX pVertex, ULONG numVertex, PVOID pMesh, ULONG numMesh, ULONG mode);

 

The first parameter is the handle to the device context. The second parameter, pVertex, is a pointer to an array of TRIVERTEX structures. The third parameter contains the number of elements in the array pointed to by pVertex.

TRIVERTEX structure:

struct _TRIVERTEX

{

    LONG x;

    LONG y;

    COLOR16 Red;

    COLOR16 Green;

    COLOR16 Blue;

    COLOR16 Alpha;

} TRIVERTEX;

The structure defines a point x,y in the device context and its color. Alpha define the transparency of the point x,y. The points in the array should define the upper left and the lower right corners of the rectangle being filled. The fourth parameter pMesh points to a GRADIENT_RECT structure.

struct _GRADIENT_RECT

{

    ULONG topLeft;

    ULONG bottomRight;

} GRADIENT_RECT;

The GRADIENT_RECT structure specifies which entry in the array containing TRIVERTEX array is the upper left point and which is the bottom right point. The last parameter, mode, specifies whether the gradient should be filled horizontally, GRADIENT_FILL_RECT_H, or vertically GRADIENT_FILL_RECT_V.

 

Now to the static text control. I tried to make the control transparent but found out that it is not very straight forward. Tried to use SetBkMode(hdc, TRANSPARENT) and reurning NULL_BRUSH in response to WM_CTLCOLORSTATIC, didn’t work for me. So I removed the static control and used ExtTextOut to draw the text directly on the screen.

 

Here is the final piece of code. All the code goes in under WM_PAINT function. And g_hImageStatic is a global which contains window handle to the static control containing the image. I store it while creating the static control in AlignComponents(), check my previous post.

TRIVERTEX vert[2];

GRADIENT_RECT gradRect;

RECT rect;

TCHAR szStrLine1[] = TEXT("TechTwaddle");

TCHAR szStrLine2[] = TEXT("Copyright (c) 2009");



hdc = BeginPaint(hWnd, &ps);



GetClientRect(hWnd, &rect);



vert[0].x = rect.left;

vert[0].y = rect.top;

vert[0].Red = 0x0000;

vert[0].Green = 0x2000;

vert[0].Blue = 0xA000;

vert[0].Alpha = 0x0000;



vert[1].x = rect.right;

vert[1].y = rect.bottom;

vert[1].Red = 0x0000;

vert[1].Green = 0x8000;

vert[1].Blue = 0xFF00;

vert[1].Alpha = 0x0000;



gradRect.UpperLeft = 0;

gradRect.LowerRight = 1;



GradientFill(hdc, vert, 2, &gradRect, 1, GRADIENT_FILL_RECT_H);



if(g_hImageStatic)

{

    GetWindowRect(g_hImageStatic, &rect);



    SetTextColor(hdc, RGB(120, 160, 130));



    SetBkMode(hdc, TRANSPARENT);

    ExtTextOut(hdc, rect.left – 23, rect.bottom – 24, 0, NULL,

        szStrLine1, _tcslen(szStrLine1), NULL);

   

    ExtTextOut(hdc, rect.left – 37, rect.bottom – 11, 0, NULL,

        szStrLine2, _tcslen(szStrLine2), NULL);

}



EndPaint(hWnd, &ps);

Aloha!

Hi there, here goes my first post on geekswithblogs, so let me introduce myself. My name is Prabhu and I work on Windows Mobile technologies.  I love programming and solving puzzles. My work involves working with BSP’s, porting maintaining tweaking device drivers and sometimes writing small utility applications at work. I work for a large corporation which builds and sells Windows Mobile phones for a living and does a lot of other stuff too!

So thats that about me and what I do. This is the first time I am blogging and I thought writing a blog is a great way to learn and share new things. After all, we are all here to make things better, well, at least some of us are (-:I hope to update this blog quite regularly and write about things I already know and things I learn.And btw, what a nice day I choose to start blogging! (;

Disclaimer:
The views expressed in this blog are mine and in no way represent my employer. The author cannot be held responsible for any damages caused due to the information provided here, use it at your own risk.