Monday, July 27, 2009

Convert "man page" into text file

Save a man page into text file

Option #1



man -P cat ls > man_ls.txt


Option #2:



man ls | col -b > ls.txt

Wednesday, July 15, 2009

First try in C#

Here is my first try in C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dotNet
{
class Greeting
{
public static int displayGanesh()
{
Console.WriteLine("Ganesh Here !!");
return 0;
}
public static int displayVishnu()
{
Console.WriteLine("Vishnu Here !!");
return 1;
}
}

delegate int delGreetings();

class Program
{
static void Main(string[] args)
{
int choice = 1;
delGreetings[] Greetings =
{
new delGreetings(Greeting.displayGanesh),
new delGreetings(Greeting.displayVishnu)
};
int return_ = Greetings[choice - 1]();
Console.Write("Return Value ");
Console.WriteLine(return_);
return;
}
}
}



delegate is basically defines the function pointer.
In the below snippet, it defines a function pointer which
takes no arguments and returns an int value.


delegate int delGreetings();




Happy Hacking !!

Tuesday, July 14, 2009

Visual Studio .Net 2008 Cheat sheet

For all the C# fans out there, today I came across this excellent keyboard cheat sheet and Jeff's Summary Macro to generate the full list of VS 2008 cheat sheet in HTML format.

Here is the steps to generate the cheatsheet for yourself. Skip to down under if you wish to get the generated cheatsheet.

Download the Keyboard shortcut Summary macro

How to install and run the macro ??
  1. go to Tools - Macros - IDE
  2. Create a new Module named "KeyboardShortcuts" under "MyMacros"
  3. Paste the above code into the module
  4. Add a reference to the System.Data.dll and System.XML.dll ; make sure it builds with no errors
  5. Close the macro IDE window
  6. go to Tools - Macros - Macro Explorer
  7. A new macro named "List" will be under "KeyboardShortcuts." Double-click it to run the macro
  8. The macro will take a moment to write the keyboard shortcuts to a HTML file, then open the HTML file in the IDE.
This is tested against VS 2008 and the macro generates the HTML file :

C:\Users\mganesh\Documents\Visual Studio .NET 20xx Keyboard Shortcuts.htm

This is the file location in my Win 7 OS.

The cheat sheet result for the Visual Studio 2008 default C# keyboard shortcuts is posted to save people the trouble of getting the macro running. It's here.

Monday, June 29, 2009

Building Boost Lib 1.35 with VC++ 2008

Version 1.35 of the Boost libraries was released on March 29th, 2008.

Below are the steps I followed to have everything working on Win 7.

If not already done, install the following development tools (in the prescribed order, please):

Visual C++ 2008 Express Edition
Microsoft Windows SDK
Microsoft Compute Cluster Pack SDK

The last one will only be needed if you plan to compile the Boost.MPI library.

Download and install Python. Download Boost 1.35 and the latest Boost Jam binary (3.1.17 at the time of this writing). Copy the bjam executable to the Boost root directory. Next, disable the automatic linking features of the Microsoft Visual C++ compiler by enabling the BOOST_ALL_NO_LIB macro on the file user.hpp (boost/config/user.hpp). We’re ready to go (type all the commands inside the Visual Studio 2008 Command Prompt):

bjam stage

Boost Jam auto detects the Visual C++ 2008 compiler!

If you want to compile the Boost.MPI library a couple of additional steps must be followed. Boost Jam is your friend as it prints it nicely for you:

warning: skipping optional Message Passing Interface (MPI) library.
note: to enable MPI support, add “using mpi ;” to user-config.jam.
note: to suppress this message, pass “–without-mpi” to bjam.
note: otherwise, you can safely ignore this message.

Follow the instructions. The user-config.jam is to be created in your “current” directory ($BOOST_ROOT_DIR\tools\build\v2).

Now build the Boost.MPI library by issuing:

bjam –with-mpi stage

The Microsoft MPI library is auto detected!

That is it! Happy Hacking :)

Sunday, June 28, 2009

Anbe Vaa - Vijay TV's New serial

Here you go. Me and Mani has become a big fan of this title song .. Thats a soft melody song .. Here is the lyrics for the song.

Guys, if u get a chance, hear this song in Vijay TV :)

Ah.. ah... (Female Voice)
 
(Male voice)
Oru paarvai paarkirai..
pudhidhai nan pookiren..
Idhayam idam maarudhe..
Idhu kaadhala...

Nilavodu theigiren..
Ninaivale karaigiren..
sugamana vedhanai..
Idhu kaadala...

Engeyo.. engeyo.. 
ennule engeyo..
vinmeengal sidharudhe
yaenadi..

Anbe vaa..
Anbe vaa..
Anbe vaa
Anbe vaa.. a...

Ah...

(Female)
Kannukule kannukule.. kaadhal vandhu nenjai thotu povathen.. 
(Male)
Enna idhu enna idhu.. vaanavillil vanam rendu koodudhe..
(Female)
Theendinal.. vaanile..
megamai alaigiren
(male)
neenginal dhoorathil..
pulliyai tholaigiren..

Nillarendral nillaamal
yenendru kelaamal
edhedho seigirai..
yaenadi..

Anbe vaa..
Anbe vaa..
Anbe vaa
Anbe vaa.. a...

(F)Enna solli enna solli kaadhal adhai unnidathil kaatuven..
(m)Sathamindri sathamindri mounamai nenjukulle pootuven..
(F)kavithaigal ezhudhida vaarthaigal thedinen..
(M)un peyar  ezhudhinaal kavidhayai paadinen..

Enn ulle en ulle..
un kannin minsaram..
edhedho seiyudhe.. 
Yaenadi..


Anbe vaa..
Anbe vaa..
Anbe vaa
Anbe vaa.. a...

Thursday, June 25, 2009

Secrets of std::map

I should admit that I'm very poor in C++ Programming. Today, me and one of colleague was trying to understand a code writter by one of a pioneer in our team. We initially thought he wrote a crabby code but indeed we were wrong and he proved his expertness :)

Below is the snippet of similar case.



#include "stdafx.h"
#include < iostream >
#include < map >

int main()
{
// 1. define the map
typedef std::map Map;

// 2. Create the object for it
Map myMap;

for (int i=0; i<10; ++i)
{
/****************************
3. Whats going on here ???.
We just created the object.
Could this be a buggy code ??

Nope. When we reference an item in map
and if the item is not available,
it creates the object. Great :)

I personally seen/used the creation
of map on the left side,
something like myMap[2] = 20
But the below is of something which
I am seeing new today :)
**********************************************/

int &ref = myMap[i];
ref = i;

}
for (int i=0; i<10; ++i)
{
std::cout << myMap[i] << " ";
}
std::cout << std::endl;

return 0;
}



Happy Hacking :)

Monday, June 22, 2009

C++ forward declaration error

Problem:

I am trying to declare and use a class B inside of a class A and define B outside A.I know for a fact that this is possible because Bjarne Stroustrup uses this in his book "The C++ programming language" (page 293,for example the String and Srep classes). So this is my minimal piece of code that causes problems.

class A
{
struct B; // forward declaration
B* c; A()
{
c->i;
}
};

struct A::B
{
/** we define struct B like this
** becuase it was first declared
** in the namespace A */

int i;
};
int main()
{

}


Error:

This code gives the following compilation errors in g++ : tst.cpp: In constructor ‘A::A()’: tst.cpp:5: error: invalid use of undefined type ‘struct A::B’ tst.cpp:3: error: forward declaration of ‘struct A::B’

Solution:

Define the constructor for A AFTER the definition of struct B.

Sunday, June 14, 2009

Sambhar Receipe

Step 1:
Put Onions, Tomato, Chilly, Coriander leaf, 1 Spn of Turmeric Cumin powder (from Amma) in a pressure cooker and keep 3 Whistle.

Step 2:

Put all the needed vegetables in the same pressure cooker and add 1/5 Spn of chilly power, salt to taste. Keep for one more whistle.

Sambhar is ready ;)

Thursday, February 26, 2009

How to get the elapsed time in millisecs

Finding an elapsed time of a function/API/method will help you to understand its performance and the most of our manager/management will hails u if you give them a nice performance graph/chart of an application :)

My Approach:
You can use gettimeofday at the start and end of your method and then the difference the two will give the elapsed time .. You'll get a structure like the one below:


struct timeval {
time_t tv_sec; /* in secs */
suseconds_t tv_usec; /* in Microseconds */
};


Code snippet:


#include
#include
#include
int main()
{
struct timeval start, end;
long mtime, seconds, useconds;

// Get the start time
gettimeofday(&start, NULL);

// Here you go with your method call
usleep(2000);

// note the end time
gettimeofday(&end, NULL);

seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;

mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

printf("Elapsed time: %ld milliseconds\n", mtime);

return 0;
}


Wednesday, February 25, 2009

Python: Human readable time span given total secs

Problem:

Function takes an amount of time in seconds and returns a human readable time span.

Input: 14723 (in secs)
Output : 4h 5m 23s

Suffixes used:

y - year
w - week
d - days
h - hours
m - min
s - sec

Code:


#!/usr/bin/env python
def elapsed_time (seconds, suffixes=['y','w','d','h','m','s'], add_s=False, separator=' '):
"""
Takes an amount of seconds and turns it into a human-readable amount of time.
"""
# the formatted time string to be returned
time = []

# the pieces of time to iterate over (days, hours, minutes, etc)
# - the first piece in each tuple is the suffix (d, h, w)
# - the second piece is the length in seconds (a day is 60s * 60m * 24h)
parts = [(suffixes[0], 60 * 60 * 24 * 7 * 52),
(suffixes[1], 60 * 60 * 24 * 7),
(suffixes[2], 60 * 60 * 24),
(suffixes[3], 60 * 60),
(suffixes[4], 60),
(suffixes[5], 1)]

# for each time piece, grab the value and remaining seconds, and add it to
# the time string
for suffix, length in parts:
value = seconds / length
if value > 0:
seconds = seconds % length
time.append('%s%s' % (str(value),
(suffix, (suffix, suffix + 's')[value > 1])[add_s]))
if seconds < 1:
break

return separator.join(time)

if __name__ == '__main__':
# 2 years, 1 week, 6 days, 2 hours, 59 minutes, 23 seconds
# 2y 1w 6d 2h 59m 23s
seconds = (60 * 60 * 24 * 7 * 52 * 2) + (60 * 60 * 24 * 7 * 1) + (60 * 60 * 24 * 6) + (60 * 60 * 2) + (60 * 59) + (1 * 23)
print elapsed_time(seconds)
print elapsed_time(seconds, [' year',' week',' day',' hour',' minute',' second'])
print elapsed_time(seconds, [' year',' week',' day',' hour',' minute',' second'], add_s=True)
print elapsed_time(seconds, [' year',' week',' day',' hour',' minute',' second'], add_s=True, separator=', ')



Output:

[10:13:34 gmuniyan@lnl43a-3102] /home/gmuniyan/python>./elapsedTime.py
2y 1w 6d 2h 59m 23s
2 year 1 week 6 day 2 hour 59 minute 23 second
2 years 1 week 6 days 2 hours 59 minutes 23 seconds
2 years, 1 week, 6 days, 2 hours, 59 minutes, 23 seconds

Honor: Original Post

Tuesday, February 24, 2009

Running a cmd from bash script

Problem:

There are many situations in which you may want to run different command in your shell script depending on requirements and circumstances.

There are two approaches we can take from here on.

Approach #1:

Use either case statement or if..elif..else For example:



#!/bin/bash
if [ this -eq that ];then
command1
else
command2
fi



Approach #2:

BASH allows you to assign/store a command in a built-in variable called CMD. Build your command in this variable and execute $CMD.



#!/bin/bash
[ this -eq that ] && CMD=”/bin/ls” || CMD="/bin/date";
eval $CMD;



This is a very simple example and this approach is very much generic if you want to have a generic function to execute all the commands. For example:



#!/bin/bash

execute() {
# $1 holds the arg to this function
CMD="$1";
eval $CMD;
}

## Here is your main function

if [ this -eq that]
then
execute "/bin/ls | wc -l";
else
execute "/bin/ls";
fi



NOTE: eval is required when you use "|" or redirection of cmd output.

Happy hacking :) !!

Monday, February 23, 2009

Python: Processing cmd line args

Next thing that you might be interested to learn after the historic "Hello World" program is to know how to process the cmd line arguments.

Method #1: Using sys:


#! /usr/bin/python

import sys;

if __name__ == "__main__":
for args in sys.argv:
print args;




Output:

# cmdLine.py 1 2 3 4
cmdLine.py
1
2
3
4

Python: Hello World

This is my first post against Python, watchout for more to come soon ...

Python way of saying "Hello world" :)


#!/usr/bin/env python

## In Python each module will have a name associated with it
## And here is the main module

if __name__ == "__main__":
print "Hello World";

Sunday, February 01, 2009

Show that 2^n is O(n!)

This is an interview question from MS.

Answer:

n! = 2*3*...*n >= 2*2*...*2 = 2^(n-1)

Since 2^n <= 2*n! for all n, we have that 2^n = O(n!).

Thursday, January 15, 2009

Monday, January 05, 2009

Arrange 0's & 1's

Problem Statement:
-------------------

An array of size n among which there are n/2 0s and n/2 1s arranged in random order.
Arrange all the 1s to left and all 0s to right but it needs to be
stable i.e., the order of 1s and 0s in the i/p array should be maintained.

Expected Complexity:
--------------------------------
O(N) with constant space.


Pseudocode:
--------------------

1. Have two counters, count1 = 0 and count2 = (n/2)+1
2. Traverse thru the array, if(arr[ i ] == 1) { arr[ i ] = count1++;} else { arr[ i ] = count2++ };
3. At the end of the traversal, you have array filled with numbers 0 to n-1


Now the problem reduces to sorting and array of n numbers which has elements from 0 to
n-1 occuring only once which can be done in O(n).



for(j = 0; j <= 1; j++)
{
for(i = 0; i<n; i++)
{
if(arr[ i ] != i)
{
swap(arr[ i ], arr[ arr[ i ] ]);
}
}
}
</pre>


Note: j loop runs only twice irrespective on 'n' and has constant complexity. The order of this whole loop is 2*n = O(n).


4. After the array is sorted, Again traverse thru the array and make elements arr[0] to
arr[n/2] to '1' and arr[(n/2)+1] to arr[n] as '0'.


Space complexity is constant and time complexity is O(step2) + O(step3) + O(step4) = n + 2n +n = 4*n = O(n).


Solution #1 (Stable):
------------------------

<pre name='code' class='cpp'>
#include<iostream.h>

int a[] = { 1,0,0,0,1,1,1,0,0,1};
#define _SIZE sizeof(a)/sizeof(a[0])


/* Helper Function */
void printArray()
{
for(int i=0;i<_SIZE; ++i)
cout<<a[i]<<" ";

cout<<endl;
}

int main()
{

int countOne = 0;
int countZero = (_SIZE)/2;
int i = 0;

/* Fill the array with numbers from 1 to N */
for(i=0; i < _SIZE; ++i)
{

if(a[i] == 1)
{
a[i] = countOne;
countOne++;
}
else
{
a[i] = countZero;
countZero++;
}
}
printArray();

/* Swap the number and make it a sorted one */
for(int j = 0; j< 2; ++j)
{
for(i=0; i < _SIZE; ++i)
{
if(a[i] != i)
{
int temp = a[i];
a[i] = a[a[i]];
a[temp] = temp;
}
}


}


printArray();

/* Fill the 1st N/2 elements with 1 */
for(i=0; i<_SIZE/2; ++i)
a[i] = 1;


/* Fill the last N/2 elements with 1 */
for(i=_SIZE/2; i<_SIZE; i++)
a[i] = 0;

printArray();

return 0;
}

</pre>


Solution #2 (UnStable):
-----------------------------------


Here is a small variation of the quick sort to solve the same problem but this solution is not stable. So I prefer #1.


<pre name='code' class='cpp'>
#include<iostream.h>
using namespace std;
#define _SIZE sizeof(a)/sizeof(a[0])

void swap(int *a, int l, int r)
{
cout<<"Swaping "<<l<<" "<<r<<endl;

if(a[l] != a[r])
a[l] ^= a[r] ^= a[l] ^= a[r];

return;
}


bool compare_1_upper(int *a, int u, int p)
{

return (a[u] == p);
}

bool compare_1_lower(int *a, int l, int p)
{
return (a[l] < p);
}


bool compare_0_upper(int *a, int u, int p)
{
return (a[u] > p);
}

bool compare_0_lower(int *a, int u, int p)
{
return (a[u] == p);
}

bool (*funcPtr_upper)(int *, int, int) = 0;
bool (*funcPtr_lower)(int *, int, int) = 0;

void qPartition(int *a, int low, int upper)
{
int pivot = a[low];
int l = low - 1;
int u = upper + 1;
if(a[low])
{
funcPtr_upper = compare_1_upper;
funcPtr_lower = compare_1_lower;
}
else
{
funcPtr_upper = compare_0_upper;
funcPtr_lower = compare_0_lower;
}
while(1)
{
while(funcPtr_upper(a, --u, pivot));
while(funcPtr_lower(a, ++l, pivot));
if(l<u)
swap(a, l, u);
else
return;
}
return;
}
int a[] = { 1,1,1,1,1,0,0,1};
void print()
{
for(int i=0; i< _SIZE; ++i)
cout<<a[i]<<" ";
cout<<"\n";
}
int main()
{
print();
qPartition(a, 0, _SIZE - 1);
print();
return 0;
}

Monday, December 29, 2008

XOR Linkedlist

Problem:


Implement a doubly linked list with a single pointer.


Solution:


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/* pray that a long is the size of a struct link* */

typedef unsigned long pointer;
struct link
{
pointer next_prev;
int payload;
};

typedef struct link link;
link* add_data(int payload, struct link* list)
{
struct link * new_link = (struct link*)malloc(sizeof(link));
assert(new_link);
new_link->next_prev = (pointer)list;
new_link->payload = payload;
if (list != NULL)
{
list->next_prev = (pointer) list->next_prev ^ (pointer)new_link;
}
return new_link;
}

void walk_list(link *list)
{
struct link* prev = 0;
while (list != NULL)
{
pointer next = ((pointer)prev) ^ list->next_prev;
printf("%d ", list->payload);
prev = (struct link*)list;
list = (link*)next;
}
printf("\n");
}

int main(void)
{
link *l1 = add_data(1, NULL);
link *l2 = add_data(2, l1);
/* add something to the front ... */
/* add something to the back ... */
link *l3 = add_data(3, l2);
link *l4 = add_data(4, l3);
link *l5 = add_data(5, l4);

/* walk from front to back */
walk_list(l1);
/* walk from back to front */
walk_list(l5);

return 0;
}

Dutch Nation Flag Problem

Problem:

Given an array of red, green and blue balls arrange them in groups of all red together, greens together and blue together. Do in a single scan of the array.

This is same as You have an array containing only '0's, '1's and '2's. Club same items together in single scan.

Solution:

<br />#include<iostream.h><br />#define _SIZE sizeof(a)/sizeof(a[0])<br />using namespace std;<br />void printArray(int *array, int size)<br />{<br />    for(int i=0; i<size; ++i)=""><br />        cout<<array[i]<<" ";<br />    cout<<endl;<br />    return;<br />}<br />void swap(int *a, int left, int right)<br />{<br />    if(a[left] != a[right])<br />    {<br />        a[left] ^= a[right] ^= a[left] ^= a[right];<br />    }<br />}<br />void reArrange(int *a, int length)<br />{<br />    int low, mid, high = length -1;<br />    low =0; mid = 0;<br />    while(mid <= high)<br />    {<br />        switch(a[mid])<br />        {<br />            case 0 :<br />                swap(a, low, mid);<br />                low++;<br />                mid++;<br />                break;<br />            case 1 :<br />                mid++;<br />                break;<br />            case 2 :<br />                swap(a, mid, high);<br />                high--;<br />                break;<br />            default:<br />                cout<<">>> Error \n";<br />        }<br />    }<br />}<br />int main()<br />{<br />    int a [ ] = { 1,1,1,0,1,2,2,1,0,2,1,2,0 };<br />    printArray(a, _SIZE);<br />    reArrange(a, _SIZE);<br />    printArray(a, _SIZE);<br />    return 0;<br />}<br /><br />

Saturday, December 27, 2008

Create encrypted tar file

one of the way to create a encrypted tar file under linux

  $ tar -zcvf - stuff|openssl des3 -salt -k secretpassword | dd of=stuff.des3           
                                                                                                 
          This will create stuff.des3...don't forget the password you                            
          put in place of  secretpassword. This can be done interactive as                       
          well.                                                                                  
                                                                                                 
            $ dd if=stuff.des3 |openssl des3 -d -k secretpassword|tar zxf -                      
                                                                                                 
     NOTE:  above there is a "-" at the end... this will                                         
            extract everything.                                                              

Friday, December 26, 2008

Mount error in Ubuntu

I got a wired error in my ubuntu today, when I tried to mount my Windows Partition. So I tried to reboot the machine in windows, and thought OS will do a filesystem check so that the error got wiped out. But no luck after rebooting the machine so many times. And below is the solution what I found:



Error Message:



Solution:




1. sudo apt-get install ntfsprogs



2. sudo ntfsfix /dev/sda2



mganesh@bluegene:~$ sudo ntfsfix /dev/sda3

Mounting volume... FAILED

Attempting to correct errors...

Processing $MFT and $MFTMirr...

Reading $MFT... OK

Reading $MFTMirr... OK

Comparing $MFTMirr to $MFT... OK

Processing of $MFT and $MFTMirr completed successfully.

Setting required flags on partition... OK

Going to empty the journal ($LogFile)... OK

NTFS volume version is 3.1.

NTFS partition /dev/sda3 was processed successfully.

mganesh@bluegene:~$ sudo ntfsfix /dev/sda2

Mounting volume... FAILED

Attempting to correct errors...

Processing $MFT and $MFTMirr...

Reading $MFT... OK

Reading $MFTMirr... OK

Comparing $MFTMirr to $MFT... OK

Processing of $MFT and $MFTMirr completed successfully.

Setting required flags on partition... OK

Going to empty the journal ($LogFile)... OK

NTFS volume version is 3.1.

NTFS partition /dev/sda2 was processed successfully.





Happy Ubuntu :) !! .. This solves the problem