Sunday, January 27, 2008

.NET 3.5 : VB and C#

[The code in this post appears weird for some reasons, I used LiveWriter and few good but buggy plugins to attach code]

I recently made a list of ASP.NET Videos that are out there online. Excluding the MSDN Nuggets and Microsoft Webcast events, the listings spanned over 4 pages!!! I am really concerned and am cursing myself for not having watched any of those for years. I have actually been a close follower of videocasts/screencasts right from those days when there weren't that many online for free. Now Microsoft, I should say is the largest provider of screencasts, of course only about MS technologies and yet there are tons of their videos that I should be watching. (Of course, lets not forget about Channel 9 where there are quiet a lot more screencasts about everything from MS)

Anyway there is also this dnrTV.com which is run by .NET Rocks guys and provides .NET TV Sessions. The most recent two shows are really something that everyone who is learning .NET should watch. It is by Kathleen Dollard and gives a first hand explanation about .NET 3.5 and shows VB 9.0 and C# 3.0 side by side which is really something! The actual show can be watched here.

I am writing down some important points for my own use and others might find it useful. I hope I am not violating any rights(hopefully).The disclaimer is that the images shown below is taken from the show using Snipping Tool which is shipped along with Windows Vista. This is not my work and I hope not to make any violations. In case of any, please let me know so that I can remove this post online.
Anyway my notes follows ....

.NET 3.5 Assemblies:

.NET 3.5 The important aspect is that .NET 3.5 still has the same Core - .NET 2.0. Simply put .NET 3.5 is nothing but .NET 3.0 plus additional features and we know that .NET 3.0 is nothing but .NET 2.0 Core plus few amazing libraries like the WPF, WCF, WF, CardSpace. It is also mentioned by Kathleen that Speech library is shipped in the .NET 3.0 and it is not that well known.

.NET Versions

.NET Versions There have been five versions of .NET till date. While VB 7 and C# was for .NET 1.0 and 1.1; VB 8 and C# 2.0 was for .NET 2.0 and .NET 3.0.

Now the brand new C# 3.0 and VB 9.0 adds a lot of new features makes programming in these languages very exciting.

Anyway the slides look amazing, you should watch the show without fail if you are interested!


Nullable in VB vs. C#

Declaring Nullable in VB

   1: Dim x as Nullable(Of Boolean) = False
   2: Dim y as Boolean? = False   

C# Nullables and bit more code to help you understand what Nullables are!


   1: bool? x = null;
   2: if(x.HasValue)
   3:  Console.WriteLine("x does have a value!");
   4: else
   5:  Console.WriteLine("x do not have a value and is null!");
   6: bool? y = x.GetValueOrDefault(); //y is initialized to false!
   7: Console.WriteLine("y is "+y);

Differences:

Suppose x and y are nullable booleans and x is set to null/nothing while y is set to false. Look at these:
x == y => False in C# and Nothing is VB (since one of them is nothing!). So can you guess the output of the following VB code snippet!

   1: Dim x As Nullable(Of Boolean) = Nothing    
   2: Dim y As Boolean = Nothing    
   3: Console.WriteLine("x = " + ((x = y) Is Nothing).ToString)


Another note for beginners! Consider the C# code:

   1: Employee emp = null;    
   2: if(emp==null)    
   3:  Console.WriteLine("Emp object is set to null!");

The equivalent VB code is:

   1: Dim emp as Employee = Nothing    
   2: If(emp = Nothing) 'This does not return true, = Nothing is not equivalent to == null    
   3:  Console.WriteLine("You would not see this line in the output!")    
   4: If emp Is Nothing ' This is how you check for null!    
   5:  Console.WriteLine("emp Object is set to null!")


If you read the above code snippet, I have conveyed the message in the comment on Line 2.

Frankly there are lot more differences with respect to how operators work differently in C# than in VB. Simply put the key point to remember is that

In Visual Basic, comparison between anything that is null(Nothing) to anything else returns Null/Nothing!!

In C#, you cannot use any operator but == on boolean

Note: By the way a great tool for .NET Developers in Snippet Compiler!

Operators in VB vs C#

Ternary Operator in C#:

   1: bool buddi = false;    
   2: string nameOfBuddi = buddi?"Bhargav":"Someone";    
   3: Console.WriteLine("Buddi is "+nameOfBuddi); //Displays "Someone"    
   4: buddi = true;    
   5: Console.WriteLine("Buddi is "+buddi?"Bhargav":"Someone"); //Displays "Bhargav"

Ternary Operator in VB:

IIf was used as ternary operator in VB but it is actually a function! But in VB 9.0, IIF is an operator! The actual difference would be understood when you look at this snippet:
   1: Shared Sub Main()    
   2:   Console.WriteLine(IIf(true,Method1(),Method2()))    
   3: End Sub    
   4:      
   5: Function Method1 as Integer    
   6:     Console.WriteLine("Method 1")    
   7:     Method1 = 1    
   8: End Function    
   9:      
  10: Function Method2 as Integer    
  11:     Console.WriteLine("Method 2")    
  12:     Return 5    
  13: End Function


The output of the above snippet is

Method 1
Method 2
1

As you can see, Method1() and Method2() are first evaluated and then the appropriate return value is returned. Here since its true, return value of Method1() is returned on the screen.

Another note for beginners, in Visual Basic, you can return a value in two ways. The first way is shown in the above code snippet in Line 7 where you assign FunctionName = returnValue and the second way is to use return keyword, like in other languages. You can use which ever makes more sense to you, well based on your choice.

The next few features were actually present in earlier versions of VB and unavailable in C# ( the above talked features were in C# only until VB 9.0)

Contd...

Tuesday, January 15, 2008

Storage Classes in C++

Courtesy: Dave, UGA

Storage Classes

Storage class specifies where the object exists in memory. Also the lifetime of the variable's storage determines the storage class of the variable/object.

Automatic Storage
  1. Default for all the variables
  2. Object is created and destroyed within the block
  3. eg: auto float x,y;
  4. register storage classes is same as auto storage class. Just that it tells the compiler to place the variable to be put in registers(for better performance)
Static Storage
  1. Lifetime of variable is entire program execution
  2. static can be applied to local variables defined in functions or to global variables
  3. Keeps the value even after the function ends, if its a local variable
Scopes
  1. Global Scope - visible to any other file - extern
  2. File Scope - visible to only that file - static
  3. Block Scope - visible only within the block.
Some funda
  1. extern int globalVariable; This is a variable declaration and this can be specified any number of times. No memory is allocated to this variable yet and thus multiple declarations are allowed. If you have an extern variable and try to access it you get a linker error. To prevent this, you should define a variable of the same name. Then you have actually defined a reference.
    Ex: extern int gv; int gv; //then you can access gv.
  2. int anotherVar; This is a variable definition and this can be done only once. This variable has been allocated memory and falls under the auto storage class.
  3. static int getVar() If this function is present in File1.cc and if you try to invoke getVar() in File2.cc, then this is a compiler error since the scope of this function is limited to the File1.cc only.
  4. static has another purpose in C/C++. You have a static variable in a function foo(), then within foo(), increment the variable and print out the variable. Now within main call foo() three times. Then each time you get a different(incremented) value. That is the lifetime of the variable is "complete" program. As long as the program runs, the variable value would be stored. The value is restored even after the function returns.
  5. Global variables in C/C++ default to zero, while local variables are garbage!

Monday, January 14, 2008

What is the output of this C++/C Program?

When compiled using GCC compiler, can you tell what is the output of the following program?

#include
int main()
{
int y=10,p=20;
int num[10]={0};
int x=10,z=4;

num[-2] = -2;
num[10] = 10;
printf("%d\n%d\n",p,z);
}

This program is supposed to be compiled on SunOS, using GCC compiler. Running it on different machine might give a totally different output.

If you run this program, you would understand how dangerous is C++ arrays, if not properly coded. Ofcourse this program does not actually corrupt your system but it does corrupt one of the variables and at times this might be dangerous.

Courtesy: Got this snippet from Dr. Dave's class. But a different example. I really liked this simple program that conveys a very big idea.

Wednesday, January 09, 2008

My work till date ...

Below is a list of projects that I have developed/worked on. This is to let me have a good idea on what I have worked on, for the upcoming interviews.

Software Associate

Online banking system using CICS
Legacy Decommissioning of 21C Systems

Freelance Developer
VB.NET Scheduler Program(with GUI and Win Service)
FTP Uploader/Downloader(VB.NET)
IP and System Info(ASP.NET,C# Win Service, Binary Serialization, Set up projects in VS 2005)
C# to VB.NET Conversion(ASP.NET Project)
URL Ping Service(C# Win Forms, Set up package, SMTP Coding)
Localization in .NET(ASP.NET and WinForms examples how-to)
Social Networking (Java Servlets! Orkut clone like Software)
ASP.NET Content Management System(ASP.NET VB.NET)
Postscript Expression Evaluation in C#
ASP.NET GDI+ Cropping(ASP.NET)
Small Various VB.NET Projects
XML Serialization Tutorial and Sample project
Distributed Error Reporting Tool(C#)
Whois Lookup in VB.NET
various book reviews at java-tips.org
Personal Information Manager(VB.NET)
Java Servlets Project(my first work!!)
And few other small help projects.

School/Personal Work
Windows Registry Tweaker in C#
Windows Remote Desktop in C#
Bulk Mail Sender
Mail GUI and Proxy Server
Bulk Image Compressor
Mean Shift Tracker in Java
Blob Library in Java
URL Redirection Detection
Loads of Web Crawlers
Grails - BlockBusted Movie Website
and a few others which i cannot recall at this moment!

Tuesday, January 08, 2008

Configuring SWT Browser Preferences (2)

In one of my previous posts, I blogged about the way one could set SWT Browser Widget Preferences and there has been a comment on my blog!!! (well apart from the comments that my friend Suri makes)
The comment has rightly pointed out to a way that one could programatically set the preferences of SWT Browser widget. The way it could be done is shown in the following code snippet.

Browser browser = MozBrowserUtil.openMozillaBrowser("about:blank");
nsIServiceManager servMgr = Mozilla.getInstance().getServiceManager();
nsIPrefBranch prefs = ( nsIPrefBranch )servMgr.
getServiceByContractID("@mozilla.org/preferences-service;1",
nsIPrefBranch.NS_IPREFBRANCH_IID);

prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", host);
prefs.setIntPref("network.proxy.http_port", port);

browser.setUrl(url);


Again, I thank the anonymous commentor for bringing this to my notice. I appreciate all your comments and would be better if you leave me atleast an email or a URL to your page/blog so that I can get back to you.

Thursday, January 03, 2008

Image Processing with Java


Small Background


This article is to help readers understand how to process images with Java. During my course work in Image Processing(8810) under Dr. Hamid R. Arabnia, I have developed this class that helps one to work on images, apply filters and other such operations. It lets you work with images at pixel level and is implemented well enough. Though my assignments were implemented in .NET for which I used Bitmap class, I wrote this utility class to help out my friends and surprisingly it did work very well. Well, cut the crap and lets go into some theory.


Practical Image


An image could be considered as a 2D array of Pixel. A pixel has a position (x,y) and intensity values (R,G,B). You have a color image and wish to covert the image into a gray scale image, then you extract these R,G,B values and then the gray level of that pixel in the simplest form is (R+G+B)/3 and replace each R,G,B with this average. Note that in image processing terminology, a gray scale image is different from a Black and white image. A Black and White image is also known as a Binary Image where the intensity of each pixel is either 0(Black) or 1(actually 255, white). A Gray Scale image has all R,G,B values equal.


Java Image Processing


There are several options in Java to develop image processing applications. The very well known library is the Java Advanced Imaging(JAI) Api. It is a very sophisticated API and does great work, but again, to understand JAI properly, one should really have a strong Image Processing fundamentals. Simpler options include the ImageIO API(again by Sun), ImageJ library and one very good library is the Hiof's Image Processing API. It can be found here. It is a very decent library and relatively old but does great job. And I have to market my own class. I do not call it a library but it has excellent methods that helps you work with raw pixel data. I call this library as ImageUtility and is available upon request. The following are the methods that are available in the ImageUtility:


1.LoadImage(String path) loads the image and returns the BufferedImage object

2.GetImageMatrix(BufferedImage img) returns the image passed as 2d array of integers. A pixel at (0,0) is accessed as returnedArray[0][0] and the value is between 0 to 255.

3.GetHistogram(int[][] matrix) - returns the int[] histogram of the passed matrix. A histogram is the distribution of intensities. For example, histogram[255] gives you the number of pixels whose intensity is White and histogram[0] gives the number of pixels whose intensity is Black.

4.GetImageFromMatrix(int[][] matrix) a function reverse to GetImageMatrix() method. Pass your matrix and get its bufferedImage object.

5.SaveImageToDisk(BufferedImage,String saveFileAs,String type) saves the image to the disk at the specified path(saveFileAs) as a image of type("jpg","png","gif")

6.GetBufferedImage(Image) Image is the super class of BufferedImage and yet is not straight forward to get a BufferedImage from an Image. This function does that exactly and trust me it is very useful.

7.GetHistogramImage(int[] histogram) returns the histogram as an Image, a graph that is more visual than an integer array.

8.ApplyFilter(int[][] filter,int[][] matrix) I should say this is the heart of the library. A Kernel/Filter is a 2D Array that does magic on an image. You can sharpen the image, do noise reduction(smoothing) and different other operations with this amazing filter. Consider the filter as a square piece of paper and your image as bigger sheet of paper. First put the smaller paper on the image paper such that both their (0,0) are on top of each other. Also both the horizontal and vertical borders of each should be aligned. I hope this gives and idea. Now you multiple each pixel positions and add the total value. For example, if you have a 3x3 kernel, first of all, you do a

   1: val = k[0][0]*i[0][0]+k[0][1]*i[0][1]+k[0][1]*i[0][1] +


   2: k[1][0]*i[1][0]+k[1][1]*i[1][1]+k[1][1]*i[1][1] +


   3: k[2][0]*i[2][0]+k[2][1]*i[2][1]+k[2][1]*i[2][1]




where k is the kernel array and i[][] is the image matrix.



Now you put the value at i[1][1] (the center of image where kernel is applied). Once the first position is applied, you just move the kernel by one pixel such that k[0][0] is now at i[0][1]. That way you move the kernel all the way till the row ends. Then you move by one pixel down and reapply the same way. That way you cover the entire image. This infact is a time consuming operation and thus it should be now obvious on why image processing suites such as Photoshop,Paint.NET and GiMP are CPU intesive.



Understanding kernels is very important. Most frequent Image processing operations could be done with Kernels. I recommend you take a look at some Image Processing book to get a list of some filters, I dont remember them now.



9. GetFilesList(dir) Just an out of field method. Given a directory path, it returns the list of files in that directory.



10.SaveImageListToDisk(ArrayList list,folderPath) Saves the images in the arraylist in the specified folder.



Well now it is time for me to explain some code. Some of you might not be interested in my code and might just want to know how to load images from disk, how to extract pixel information from the image, etc. The subsequent sections explains you this.



Reading an Image from Disk



We use ImageIO class to load the image. Shown below is the code that loads the image. It is exactly as in ImageUtility.LoadImage() method.





   1: public static BufferedImage LoadImage(String path) throws IOException


   2: {


   3: //Load the image


   4: BufferedImage img = ImageIO.read(new File(path));


   5: //If it is not a gray scale image


   6: if (img.getType() != BufferedImage.TYPE_BYTE_GRAY)


   7: {


   8: //Let us convert to Gray Scale.


   9: ColorConvertOp conv = new ColorConvertOp(ColorSpace


  10: .getInstance(ColorSpace.CS_GRAY), null);


  11: conv.filter(img, img);


  12: }


  13: return img;


  14: }




Saving the image to disk



Again we use ImageIO class. The following method is in my ImageUtility.java





   1: public static void SaveImageToDisk(BufferedImage img, String filename,


   2: String type) throws IOException


   3: {


   4: //very simple, use ImageIO.write()!!!!


   5: ImageIO.write(img, type, new File(filename));


   6: }


   7:  


   8:  


   9:  


  10:  




Extracting the image matrix, the raw pixel data



Get the WritableRaster using img.getRaster(). Then use getSample method from the raster to get the pixel intensity at the specified location(x,y). It is as simple as that.





   1: public static int[][] GetImageMatrix(BufferedImage img)


   2: {


   3:     int height = img.getHeight();


   4:     int width = img.getWidth();


   5:     int imageMatrix[][] = new int[height][width];


   6:     WritableRaster wr = img.getRaster();


   7:     for(int y = 0; y < height; y++)


   8:       for(int x = 0; x < width; x++)


   9:         imageMatrix[y][x] = (wr.getSample(x,y,0)


  10:                             +wr.getSample(x,y,1)


  11:                             +wr.getSample(x,y,2))/2;


  12:     return imageMatrix;


  13: }




Getting image from the matrix passed






Again, pretty straight forward operation like the GetImageMatrix() method. Get the WritableRaster and use wr.setPixel(x,y,pixel) where pixel is an integer array where pixel[0] is R, pixel[1] is G, pixel[2] is B. Look at the method.





   1: public static BufferedImage GetImageFromMatrix(int[][] matrix)


   2: {


   3:     int height = matrix.length;


   4:     int width = matrix[0].length;


   5:     BufferedImage img = new BufferedImage(width, height,


   6:                                           BufferedImage.TYPE_BYTE_GRAY);


   7:     WritableRaster wr = img.getRaster();


   8:     for(int y = 0; y < height; y++)


   9:         for(int x = 0; x< width; x++)


  10:         {


  11:             int[] pixel = new int[3];


  12:             for(int i =0; i<3; i++) pixel[0] = matrix[y][x];


  13:             wr.setPixel(x,y,pixel);


  14:         }


  15:     return img;


  16: }




How to apply filter?






The signature for the apply filter method is shown below. It returns the new matrix after the filter has been applied.





   1: public static int[][] ApplyFilter(double[][] filter, int[][] matrix)




Typical Image Processing Method



We have looked at the most fundamental operations that could be used to do amazing IP operations in a simple fashion. A Typical image processing operation could look something like this.





   1:  


   2: void Sharpen(String imagePath,String outputPath,int[][] sharpenFilter)


   3: {


   4:     BufferedImage actualImage = ImageUtility.LoadImage(imagePath);


   5:     int[][] actualImage_matrix = ImageUtility.GetImageMatrix(actualImage);


   6:     int[][] sharpenedImage_matrix = ImageUtility.ApplyFilter(sharpenFilter,actualImage_matrix);


   7:     BufferedImage sharpenedImage = ImageUtility.GetImageFromMatrix(sharpenedImage_matrix);


   8:     ImageUtility.SaveImageToDisk(sharpenedImage,outputPath,"jpg");


   9: }




The above image could actually be placed in the ImageUtility.java but sometimes you might want to repeatedly apply certain filters in a sequence. Anyway the above method gives the basic idea on how to do image processing operations. The sharpenFilter, like I said earlier, I dont remember, anyway it is just a 2D integer array. Actually a double[][] filter makes more sense. Anyway my idea behind this article is to give fundamental understanding on how to do image processing operations on images with ease. Not many internet resources has this simple a code to write an image processing java code. I hope this helps atleast a few people.





Email me at krishnabhargav@yahoo.com in case you need the complete ImageUtility or some guidance on Java Programming or Image Processing.

Friday, December 28, 2007

trueBuddi Image Compressor

The pics we take with a digital camera are usually around 1.5-3 MB based on the resolution. I often waste time and bandwidth to upload such big images in websites like snapfish, orkut, facebook, flickr. I always wanted a simple utility that could be used to compress images in a folder. I wrote one software during my BE but did not carry it with me to US so I always had to use some Paint.NET or other Image Processing tools.
I started my new year coding with Image Processing tool - trueBuddi Image Compressor.
I would upload it on my website. It is very easy to use and is available
here
It requires .NET Framework 2.0 to run. Right now it compresses images within a specified folder and that too only those with .JPG extension.
Future revisions:
1. Individual File Compression
2. Image Processing Operations - Contrast enhancement, Brightness, Noise Reduction, Sharpening, etc.
3. Support for conversion among JPG, TIFF, PNG and other such types.
Ideas welcome. The tool is free to use and is not restricted with any kind of license. You can do a Reflector and anything that you want. Just do not change the title of the Frame.

Upcoming Screencasts

UPDATE: In case I am the Tutor for Java Programming, I would record these screencasts when I am teaching my students, otherwise this project is almost shelved until February!
I plan to release my screencasts on the following topics.
1. Object Oriented Programming in Java
2. Design Patterns in Java
3. Java EE Development

Disclaimer: I am not a guru in any of the above mentioned topics but I love programming and these are for my friends who are the only few visitors to my blog. So if there are any mistakes by me, please bring it to my notice so that I will learn better and I am not responsible for what so ever happens because of these screencasts.

Originally, I wanted to host my screencasts on truebuddi.wikidot.com but it does not allow me to attach video uploads. I am looking for Google Jotspot and I hope it would allow me to post videos. In the worst case, you would have to download the files from the link I give.

If you have more suggestions, let me know.

For now, here is one video that I would upload TurboGears-Getting started.

Free Screen Recording Tools

I have been searching a lot for free Camtasia alternatives that would allow me to prepare screencasts. Till date I have found three good tools

1. Free Screen Recorder
http://www.nbxsoft.com/screen-recorder.php
Pretty decent tool, allows you to save screencast as AVI files. Best option is to download Vista Codec Package from http://www.free-codecs.com/download/Vista_Codec_Package.htm and in the settings choose XVID compression with as least quality as you want. You can record voice too.

2. DebugMode Wink
http://www.debugmode.com/wink/
A much more complicated software, allows you to store captures as SWF files. Lots of options but little bit uneasy to use.

3. CamStudio
http://camstudio.org/
Free and open source. But resource intensive. Good for high end systems.

Another good tool is ZoomIt by SysInternals. It helps you zoom particular portion of screen, would be useful when u want to show something more clearly, during presentations or screencasts. Free download from
http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx

More on sysinternals tools, you get awesome little tools at http://technet.microsoft.com/en-us/sysinternals/0e18b180-9b7a-4c49-8120-c47c5a693683.aspx and they are all free. Amazing tools, trust me.

Saturday, December 08, 2007

What next?

The semester is almost over. Two more exams and I will be done with the Fall 2008 semester at UGA. Looking back, one question that every student should probably ask himself is "Was I a good student?" By that I just mean what did I learn this semester? Well, I should say it was not the most inspiring semester I had in my student life, but definitely one of the hectic semester. I did learn a lot about simulation, especially parallel, distributed simulation, worked on my thesis to a great extent, participated in international capture the flag competition, attended an unsuccessful interview, realized that I am good but not good enough to become one of the best developers for a company. I developed a bad game, developed a great soccer simulator, developed a good library that can be used to develop P2P-ized applications, worked a lot on web crawling, evaluated a lot of "browser" frameworks, worked on SWT, worked on Silverlight, worked on VS 2008 Beta 2, taught a thing or two to my friends about .NET, read a lot about web security, read a lot of papers on simulation. Keeping all this in view I should say that it has been a very eventful semester. Things have been pretty bad on the personal front, but I guess thats the way I become more strong and better.
I really am looking forward for the next year. I hope it would be a totally different year and I hope it would be the way I want it to be. As a new year resolution, I plan to quit smoking right from the 31st. I know it is bad and I should not smoke.
Coming to the technical front, I have few holidays coming this month and I hope to work on the following.

You should see this presentation and would know why I chose these...
http://static.raibledesigns.com/repository/presentations/ComparingJavaWebFrameworks.pdf
1. Java Server Faces
2. Struts 2
3. Spring
4. Tapestry
5. Wicket, Stripes
6. Tiles, SiteMesh

I feel my resume is more of .NET and I really am not that bad at Java and neither am I that good at .NET. I really was good at .NET till 1.1 I used to know quite a lot of 1.1, be it asynchronous calls or anything else that complex, I was good at it. But not any more. .NET is now an ocean and my knowledge is really now very little. But the job front on Java Web looks more promising and it would probably add more value to my resume if i can develop applications on both JAva and .NET platforms. Let me see where my learning would go!

Wednesday, November 28, 2007

Code to worry!

In this post, I intend to post something that we discussed in our Advanced Computer Network and Security.
1. fork() - too many forks could halt the system, if the malicious code has enough privileges to launch that many forks. This is probably not a great problem to worry about but could be given a thought!
2. The talk was interesting. We were shown a simple echo server code that when run and well exploited can give you a shell to own! Through which you can list files and do everything that you can do from a Bash shell. So what did the program have?
The problem was that the array size was fixed and then the exploit was to copy large buffer onto a smaller buffer causing a buffer overflow attack. The exploit data has to be carefully crafted. Anyway, StackGuard is a simple fix that works for most of the buffer overflows. The other fix is to have a pointer declared in the first line of the function and save its current reference and at every exit, you are going to check if the saved value did not change. I know this does not make sense unless you see the code, but unfortunately I do not have that. The overall summary is to say that when you copy buffers, you should be careful to see that the copy is going to be safe. Few commands that i came to know. You have a port x open and then see what service uses that, you could do a
/usr/sbin/lsof | grep x
3. Using netstat to check the open ports
netstat -lt
Anyway class over so more on this later,hopefully.

Wednesday, November 07, 2007

Java Game Programming using JGame

I came across this wonderful 2D Game Engine called JGame. This is a very good engine to write simple games and with just 100 odd lines of code, you can write wonderful games! I would post a series of tutorials shortly, but meanwhile it is a good point to start
http://www.13thmonkey.org/~boris/jgame/JGame/tutorial/
Great work Boris Van Schooten!! Really amazing!

Sunday, November 04, 2007

Getting Started with OpenSocial API


Orkut applications

On Thursday, Google announced their new API called the OpenSocial which can be used by developers to develop Google Gadgets like applications for their favorite Social Networking websites like the Orkut, Hi5 and a lot more. More information about this could be found at:
http://code.google.com/apis/opensocial/partners.html

One could take it a new revolution, a combined war against the most popular social website - the Facebook. Around 14 social networking websites have partnered Google with their Social API.
Coming to the development of such Gadgets for Orkut like websites, you are required to have a basic but fundamental understanding of developing Google Gadgets. You are required to know Html, JavaScript and XML. I have just followed the Google's sample application and one thing that puts off Google to a lower standard is the way they document their API. Compare Microsoft and Google, I bet Microsoft's documentation is by far the best that is available on the internet. The Google documentation, I think is more above standard. I think the technical writers team consider the audience to be as talented as those who work at Google but unfortunately we are not! right?

I always think a hello world application should be very basic and should include everything that one needs to know. The tutorial at http://code.google.com/apis/opensocial/articles/firstgadget.html assumes that you have basic understanding of Google Gadgets and not about OpenSocial API. It does a great job to explain how to proceed with development of OpenSocial Applications but then it does not tell you how to add that gadget you developed to your Orkut account and so forth.

Well this is what I did!
1. Go to http://code.google.com/apis/gadgets/docs/gs.html#GGE
2. Go to File->New and Select Hello World Gadget. You get the basic code for Hello World gadget
3. Copy and paste the following code into the editor you see in the following link.
http://hosting.gmodules.com/ig/gadgets/file/104220043972318336267/buddiKut.xml
I apologize for not being able to show the code here. But it is my fault and I am lazy not to work around pasting HTML code in the blogger. The best thing you could do is paste the xml you see in some XML editor or refer to the actual source (firstgadget.html)
4. Now click on File->Save and give it a name. Once the file is saved, on the top right corner of the editor you get a Hyperlink with the filename you just gave. Right click on the link and copy the link to your gadget.
5. Now assuming that you have signed up for SandBox Orkut account ( you need to do that by going here http://code.google.com/support/opensocialsignup and you should already have an orkut account) sign into your orkut account with this link 'http://sandbox.orkut.com'
6. Then you see a "applications" menu item just where you see lists,testimonials and other such items ( left side of the page) (as shown in the figure)
7. Now click on that applications link and you see a page with a textbox asking for application URL. Paste the copied URL on to the textbox and click on "Add Application".
6. Once you add the gadget, you see a People API How too item added to your menu just above the applications (See figure). Click on that and you would be taken to a new applications page and you can see your application in Action!!!

Isn't it great?? You have complete access to your friends data and a lot more programatically and imagine all the possible applications that you could develop!

I hope we will be given a profile KEY which is unique for a profile and which can be used within the application and make the Gadget run outside these social networking websites!!! That would be very great ! There might be a better tutorial by someone with more knowledge about this but just that I wanted to be one of the early adopters! Who knows whats waiting for one!

Sunday, October 28, 2007

Project P2P Library

A good library for developing Peer-To-Peer applications is being developed by me and a friend. The aim is to enable ease of development of a Peer to Peer System. For now, you can write a peer as
public class MyOwnPeer extends Peer
{
//implement few methods!
}
The peers identify each other through IP Multicasting. In a day or two, I hope to write a short tutorial on how to develop a P2P chat application using our library. For now, it runs within private networks only. And does not run across internet!

Also the library at its current stage enables very easy development of Server application! you can write your echo server without having to worry about threading or anything else!
It is as simple as
public class EchoServer extends ServerComponent
{
//implement few methods!
}

We hope to release the library as early as possible.

The echo server sample is shown below!
Isnt' that easy! This is just the very initial stages of development and hopefully the library grows to something really big. The library relies heavily on Object-Oriented Concepts !
// SAMPLE SERVER CODE!!
class EchoServer extends ServerComponent {

public EchoServer(int port) {
super(port);
}

@Override
public void beforeServerStarts() {
System.out.println("Server about to start");
}

@Override
public void onIncomingConnection(Socket socket) {
try {
BufferedReader buff = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream());
String temp = "";
while ((temp = buff.readLine()) != null) {
pw.println(temp);
pw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public void onServerStarted() {
System.out.println("Server Started!");
}

public static void main(String[] args) {
EchoServer my = new EchoServer(1233);
}
}

Saturday, October 27, 2007

Good .NET Reflector

Download this good tool called "lutz roeder's .net reflector" from the link below
http://www.aisto.com/roeder/dotnet/

Using this one could load a .NET assembly and decompile it to see the source code and do something more. I saw this tool being used in one of the C#3.0 Nuggets (I think it was in Object Initializers video). This could be used to understand how compiler takes in our source code and modifies it well!

I knew unused variables in your source code would not be included but it was something really fun to check it out.
I gave two unused variables and a used variable and when I decompiled the code, I found the two unused variables not mentioned at all! there is the proof!

C# 3.0 - Changes ! Learn them Quick!

Thanks to Mike Taulty, famous for MSDN Nuggets, that I started to learn LINQ. Will post the exact link sometime later.
But these are the various LINQ techs coming up:
1. LINQ to SQL
2. LINQ to XML
3. LINQ to Entities
4. DLinq
5. BLinq
and much more.

Before that I would recommend to learn the new changes in C# 3.0. The nuggets could be found here
http://www.microsoft.com/uk/msdn/nuggets/tags/C%23%20Version%203.0/default.aspx?pg=1

I am yet to watch these videos and once done! I would post some hello world! kind of programs that can help people like me to learn easily. Most of these videos usually use a very complex kind of examples and sometimes it is good while sometimes it is not so good!

More later...

Saturday, October 20, 2007

CapGemini Second Round of Interview

I had my second round of interview at CapGemini TME Office at Atlanta. It was a great office, looking very much like my old office at Kanbay, but the difference being everyone had their own private cubicles unlike at Kanbay. The interviewer Mr. Micheal talked to me about the pros and cons of having a common space for everyone. Anyway coming to the interview aspects, it was everything about behavioral aspects of a consultant. I was kind of under-prepared for this kind of an interview and add to that the candidates whom I met during my wait time, most of them from GaTech! That kind of put me off to a defensive stand, come on everyone would be afraid to meet top notch engineers, consultants from a top-notch College. And it took me quite a long time to get into the "good" mode that is needed to do an interview well.
Well coming to the experiences part, I really think that it depends at least 50% on the interviewer that impacts your performance during an interview. The first round was not all that great, the interviewer had my resume, he had a list of questions, almost four pages long and I was all done in 20 mins! isn't that too long and it was kind of mechanical, routine nothing that exciting to make me talk a lot about my experiences. I think I did well on that. I was asked a series of questions and all of these were behavioral. They tested you as a team leader, as a motivator as a problem solver. They test your team leadership skills more than what they talk about your academics. questions like tell me a situation when you had too little time to a lot of things, tell me a time when you went through a lot of stress and how did you cope it. I think I did fairly well.
The second round was the one I liked the most. It was one of the best interviews I had and I have had interviews with almost 10 different people and it was a really great interview. Again, I was tested on the very same things - leadership, motivation skills, commitment, learning ability.
I think I did well. I am not sure if it is often the case, but this is the first time I have been walked out of the interview till the exit door by the interviewer himself and he appeared to be very impressed.
Irrespective of the result, I think I had a terrific experience of getting interviewed at CapGemini, especially my first round of interview with Spencer Lentz and the final interview with Micheal. Both were amazing people with great interviewing skills. I hope everyone of my friends would get such a great interviewers for their interview.
If anyone reading these posts need some light on CapGemini interviews please leave me a message at krishnabhargav@yahoo.com!

Monday, October 08, 2007

Interview with CapGemini

I have tried to search for some links which would give me some information on interviewing with CapGemini U.S but could not find any thing that was free. Well, I thought I would share some of my experiences. I had an interview with CapGemini today at UGA with a Senior Manager and I guess I cannot mention his name without his consent.
Anyway the interview was for "Staff Technical Consulting". It was more about conversational interview and we did not talk much about technical aspects. The interviewer, I guess was looking for more on the behavioral aspects of me, as a prospective consultant. The questions were more on the lines of "describe a situation where you motivated a team", "describe a situation where you had a lot of work to do and less time", etc.
I think I did a good job, I answered the questions and let us see if i can make it.
For those who would attend a similar interview, in case you need some more information feel free to mail me at krishnabhargav@yahoo.com

Project SoccerBots - Soccer Simulator in C#/.NET

I started the work to port Soccer Simulator which I wrote in Java on to .NET. I am using C# and making heavy use of User Controls to render efficient animation. So far, things are going on well and I hope in the next two weeks, I would be able to upload the project and release it as an Open Source Software at http://www.codeplex.com/soccersim
The basic idea is to simulate soccer game where two teams compete against each other. A user can write his own team and then make the Simulator play that team. In my Java version, which has some bugs and does not run that great, teams are written in Java. As an extension I am planning to support XML teams in my new simulator so that any one who loves games and who know little XML can use the software. I guess it would be more acceptable. The current simulator is inspired from both my original Java version as well as some ideas taken from the Ascii soccer developed by Prof. Tucker Balch and Dr. Maria Hybinette. The details are in this link
http://www.cs.uga.edu/~maria/classes/8220-Fall-2007/project1soccer.html
By the way I am in one of the pictures in that class website.

Dr. Tucker also has this TEAMBOTS which is a more advanced and a great Soccer Simulator written in Java. Though, I am not refering the code from that simulator, might be I would try it out to see if I can add a feature or two.

A friend of mine is helping me on this project and this would be released as a collective effort. The deadline is November 4th and before that we plan to release the SoccerBots 0.5 BETA!

Wednesday, September 19, 2007

Send Keys in Java or automate repetitive tasks programmatically.

If you have ever programmed in VB, you will definitely know what SendKeys are. You can use send keys function in vb to send in keystrokes to other applications, to be specific to that application which has focus. You can do similar work in Java.

You have send keys like functionality in java.awt.Robot class. You can instantiate a Robot class and then use methods like keyPress(KeyEvent.ENTER), keyRelease, mouseMove, mouseClick, etc.

This is very useful. Like I mentioned in the previous posts, I am running certain tests using Browser Widget. And I am not always infront of the system. And I do get a lot of dialog pop-ups which require a user to manually click OK. I mentioned about wmctrl in the previous posts but I did not get to send keys from wmctrl, so here is what I did.

I used wmctrl to get a list of open windows and specifying -x option to wmctrl would give you even the WM_CLASS and based on this, I use -a option to bring the particular window on top. Then once when the window is on top, I use Robot class to send keys.

There are other good tools like Expect scripts, Devilspie which can automate tasks but I did not have enough time to learn them from scratch. EXPECT is more prominent out there but Devilspie too looked promising.

Saturday, September 15, 2007

Configuring SWT Browser Widget Preferences!

This technique I discovered works on Linux, ie. when SWT Browser uses Mozilla as its underlying browser. It uses JavaXPCOM to connect with Mozilla and does great job doing so. But then the Browser class do not have any options to configure the preferences of the browser. But you can still configure the preferences of the browser!!
Mozilla preferences are stored in a .mozilla directory for each user, in their home directory. Thanks to Dr. Li, that I could find this out. Now if you run a program that uses SWT Browser, you can see a a folder "Eclipse" inside this .mozilla directory.

[Note I am talking about running a Java Program which has SWT Browser, from ECLIPSE, thus the folder name is eclipse. If you run from console, you might have a different foldername(I guess as that of the program name)]
It is in the /home//.mozilla/eclipse directory that the SWT Browser used Mozilla preferences are stored. It is stored in the prefs.js javascript file. You can specify a user prefernces by using user_pref() function. For example, you want a network boosted SWT Browser widget, then may be you can add the following line to prefs.js
user_pref("networking.http.pipelining",true);
Close Eclipse and start again. Now when you launch the program, the browser would use this preference.
Another way is to use "about:config" within your program do the configuration!
For this you can just write a configure() function and use it when you want. The function can be something like
Class ConfigurationWindow
{
public void configure()
{
Display display = new Display();
Shell shell = new Shell(display);

Browser browser = new Browser(shell,SWT.CENTER);

shell.setLayout(new GridLayout());

browser.setUrl("about:config");

shell.open();

while(!shell.isDisposed())
if(!display.readAndDispatch()) display.sleep();

shell.dispose();
display.dispose();
browser.dispose();
}
}

Now you can create new instance of ConfigurationWindow and call configure() which shows the user preferences window, just like the one you get when you type about:config in Mozilla Firefox.
This way one can configure preferences for Swt Browser Widget!

Linux Window Management - When you are away from the PC


Like I mentioned in the previous posts, I have this requirement where I run tests using SWT Browser Widget on thousands of URLs. And I am start the test and leave the lab. But then for some URL, the SWT Browser just pops up a dialog either asking for password or warning about a bad certificate. This has been my biggest problem off late and has delayed my tests because unless you close the dialogs the program, the execution cannot move forward.(Like the one shown in the image)
I tried out various options like configuring the settings of Mozilla which is used by SWT Browser when the widget runs on Linux (It uses IE when is running on Windows). But this hasnt worked out.
Then I thought, in Linux if a window is created, there is some way that we can be notified about this. Like some kind of GNOME or a X window Events. So initially I thought I would write some program in C to capture these global events and then for those windows I want, I would close them as I get notified. But then unlike getting this idea, implementing it is not that simple. Even now I have no clue if I ever want to write such a program, then what should I start.
Anyways I browsed for a long time and found out about this wonderful new tool called "wmctrl" which does exactly what I want. With wmctrl I can get a list of open windows, their X Window ID, their title, their process IDs. And not only that we can manage a specific window using its ID or title and this includes opening, closing, resize, move, change title, etc. Isnt that great?
You can download it from "http://www.sweb.cz/tripie/utils/wmctrl/". Just install the tool on your machine using ./configure, make, make install and you are good to go.
Getting a list of open windows on Linux
In the command line, type in wmctrl -l to get a list of all open windows and their information. Example shown in the image.

The other options are also shown. You can close a window by passing its ID (-i option) and a -c option.
You can close a window by just passing the title along with -c option.


But then the next problem is how am I going to execute this from a Java Program!
Executing Linux Commands from Java Program
You can run a Unix command from a Java Program, as shown below
try {
Process p = Runtime.getRuntime().exec("wmctrl -l -p");
int i = p.waitFor(); // very important. You wait for the command to be executed.
// i would be the return value of the process you are running.
if(i==0) //if successfully terminated
{
BufferedReader buff = new BufferedReader(new InputStreamReader(p.getInputStream()));
String temp;
while((temp=buff.readLine())!=null)
{
System.out.println(temp);
}
}
else //wmctrl returns 1 if no options passed
System.out.println("error : "+i);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

The above program executes wmctrl and displays the listing on the console. Isn't Java interesting to work and great?
I am just left with implementing this idea on my lab test machine and collect great results!!!!

Friday, September 14, 2007

BUG in SWT Browser Widget

I have just discovered a bug in SWT Browser Widget which is used by Eclipse for its internal browser. Just type in http://www.friendster.com/ anyway inside eclipse (some editor inside eclipse). Hold CTRL and click on that link to open Eclipse internal browser. As the page is about to finish loading, Eclipse closes!!
The version I am using is SWT 3.3, the latest, so called stable release.
No idea as of now why this is happening. I guess there is some component inside friendster.com homepage that SWT Browser widget does not like much, and infact it is a VM error!
By the way I am running Fedora Core 7.

Thursday, September 13, 2007

Small Read from file, write to file utility

A Java Class that I wrote for my own use. Just to have ease of access.....
--------------------------------------------------------------------------------------------------
package buddi.thesis;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class DataStore {

private PrintWriter writer=null;
private BufferedReader reader=null;
public DataStore(String input, String output)
{
try {
reader = new BufferedReader(new FileReader(input));
writer = new PrintWriter(new File(output));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

public String getNextItem()
{
if(reader==null)
return null;
String temp;
try {
temp = reader.readLine();
if(temp!=null)
return temp;
} catch (IOException e) { }
return null;
}

public void writeToOutput(String text)
{
if(writer==null)
{
System.out.println("ERROR : COULD NOT WRITE TO OUTPUT!");
return;
}
writer.println(text);
writer.flush();
}

public void close()
{
try {
reader.close();
writer.close();
reader=null;
writer=null;
} catch (IOException e) {
}
}
}

Wednesday, September 12, 2007

Java Program to detect Server side redirections!

As a part of my research work, I wrote this small function in Java which gives you HTTP Response Code and with which we can actually detect server side redirects. The server side redirects have a response code as 302. Well here is the program,

public class NetworkTool {
public static int getResponseCode(String url) {

try {
URL urlItem = new URL(url);
HttpURLConnection con = (HttpURLConnection) urlItem.openConnection();
con.setReadTimeout(1000);
con.setConnectTimeout(5000);
//System.out.println(con.getConnectTimeout());
con.setInstanceFollowRedirects(false);
int res = con.getResponseCode();
return res;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
catch(Exception ex){//System.out.println("hehe");
}
return -1;
}

public static void main(String[] args)
{
System.out.println(getResponseCode("http://cs.uga.edu/index.htmx"));
System.out.println(getResponseCode("http://buddibuddibuddi.com"));
System.out.println(getResponseCode("http://128.192.1.21"));
}
}

The statements highlighted in bold are important. Otherwise, there are some url for which you get connected to the server but you keep waiting for infinite time for the data to come on the connection. So if we set time-out on read, we don't wait for long and this is especially helpful when you run the tests on huge data.
It took me quite a long time to get the actual code fixed, and then to find out the two statements. So I hope this post would be useful for others too.

Tuesday, September 11, 2007

Some interesting figures...

I was wondering how many elements of a type can you store in a
1. HashMap
2. Vector
3. ArrayList
4. Stack
and other Collections.
This is what i found. With the default Heap space intact,
ArrayList can store 33,07,499 Long or Integers and around 1222441 Strings(I am not sure how long)
Stack and Vector, including HashMap can store upto 1236653 Strings. While around 26,21,441 integral types could be stored.

I am not sure if this is same across all machines. Well this atleast gives me an idea to what extent i can go without facing OutOfMemoryError.

How do you construct absolute URL for links in the web page?

Suppose you crawl a page at http://cs.uga.edu/~krishna and one of the HREF links to contact.html, then how do you get the absolute URL for the contact.html ? We can say simply concatenate the original HREF to contact.html, but then it is not that simple. There might be cases where the href was "../../../../contact.html", we need to take into account those cases too. So the simplest way that I found was to use URL class in the java.net package. And the following code does the trick for us.

URL start = new URL("http://cs.uga.edu/~krishna");
URL newUrl = new URL(start,"contact.html"); //construct the absolute URL

Thats the way you construct absolute URL. Very simple, isn't it?

Thursday, September 06, 2007

File URIs

URI - Uniform Resource Identifier
A URI for a web resource might be http://krishnabhargav.blogspot.com
Most of the api might require you to specify URI for local files instead of having a local path. Suppose you want to pass a local system file as a parameter and it should be in the form of an URI then you can do this:
Let us say the file is D:/Development/MyResource.txt
Then the fileUri would be something like
file:///D:/Development/MyResource.txt

One most common mistake is to use file:// instead of file:///. We go by the notion that http has "//" and so does ftp. So even this "file" would have "//" in its Uri. But it is "///" instead of "//".

One good and more detailed explanation is given here.
http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx
I really appreciate his post.

Wednesday, September 05, 2007

Using JAva 6 New Scripting Capabilities

I was working on my thesis work where I had a requirement to execute certain code snippets of JavaScript and see if they make calls or modify a specific set of objects. For example, I wanted to see if the code I wish to run sets "location" property. So I wanted to use the Rhino Engine to execute the Javascript and the major problem with that is that Rhino is just an engine for JavaScript and does not provide any DOM API. So any DOM calls made in the JavaScript would terminate the execution. So we have to expose a set of objects by ourselves to the engine. Anyway in the mean time I came across an article which used Java 6 Scripting Engines! I knew Java 6 had some scripting facilities but never gave it a hard thought. It is a really simple API and works really well. In the past I have tried to use Rhino to run javascript but it is really a tedious process. anyway here is how it is done using javax.script package.

import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import com.sun.script.javascript.RhinoScriptEngine;

public class TestScripting {
public static void main(String[] args)
{
ScriptEngineManager mgr = new ScriptEngineManager();
RhinoScriptEngine js = (RhinoScriptEngine)mgr.getEngineByName("js");
try {
js.put("location",new TestScripting()); // tell the script engine to use the object passed when it encounters "location"
js.eval("function alert(x) { print(x);}"); // implement your own global alert function
try {
js.eval(new FileReader("/home/krishna/workspace/SuriLearning/bin/test.js"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void write(Object mesg)
{
System.out.println(mesg);
}

public void replace(String mesg)
{
System.out.println("Called location.replace to go to : "+mesg);
}

}

Then I have updated the test.js file with some statement like "location.replace("http://google.com")". This is a basic idea on how we can use Rhino to detect redirections, which is portion of my work.

Monday, August 13, 2007

my views on destiny

Life goes on with or without a person being happy. There is nothing that one can do in particular about being happy. I have tried my best to lead a disciplined life, the life that one who loves me feels proud about. But it is all trash, that i got to know after a few years of toil and few months of severe pain. You will have to face what it comes towards you even if you are principled or would want to lead a normal life. Doing good to others would take you no where and if you think your doing good to others would ensure you a peaceful life, then you are mistaken. It is these very principles that would make you suffer the most. If you had been not so principled then you would not give a damn about others and then when a person deserts you, you would not have to worry much because you dont give a damn.
What do you want in life?
Well this is one question that you should never ask yourself, the moment you ask the question, you tend to think on what you dont have in life that you want the most and that makes you extremely unhappy. I know that, I have experienced that. And trust me in most of the cases I am better because I did not ask for something that no one could get. It was just that I was craving for a thing that I dont deserve, I guess. Make sure you dont ask that question to yourself. Trust me, by default its always happiness that you want. Had I got what I wished for the most, then I would definitely be happy. But some lives are that way, they dont get what they want right from the time they get their senses. My life has never been normal, I have seen all types of unhappiness that a normal middle class person can see. Thank to anyone who is responsible that I never had a problem to eat or to live. But then I have seen all kinds of problems - I have seen poverty, I have seen break-ups, I have seen much more complicated things and hell with God, I have seen everything that no one would probably wish to see. Live for your parents and do what they want you to do, then you would be the most happiest person on earth. Do not love any one, because it leaves you with pain and gives you nothing but unhappiness. Anyway unless someone dies, they doesnt know the pain of death.