Thursday, July 30, 2009

cc command not found issue on Solaris 10

The cc command is used to compile C programs on Solaris 10. After much investigation, this is how I fixed the issue of "cc command not found":

1. Install Sun Studio 11. Sun Studio is available on the Sun Website
2. Set the path to SUNWspro like this:

“Export PATH=/opt/SUNWspro/bin${PATH:+:}${PATH}”

And that's it. The CC command should now work. happy compiling!!!

Saturday, February 21, 2009

Use JSON to transfer information in a Mobile Application or encode information in a 2D Barcodes

I was introduced to JSON being used as a very lightweight data interchange format while working on building Web 2.0 applications at work. I realized the immense advantages of JSON while working on a mobile application project dealing with two dimensional project at San Jose State.


So first what is JSON, there are good links out there already:

1. JSON in Java

In short, an XML Doc Horror BookSmith can be shown in JSON as:


{
"name": "Horror Book"
"author":"Smith"
}

Where we used JSON and Why?

First, the project required us to exchange information between a client on a mobile phone emulator and a web server. XML is the first obvious choice or just a series of comma separated values, etc. We chose JSON since there were good libraries to place information in a structured manner in JSON and to read it on the other side. No need of using some XML parser and stuff. Space saved for closing tags, etc.

Second, the application was designed such that receipt of purchase would be stored in a 2D Barcode and sent to the mobile phone emulator. As per the project, in the real world, the user would take the barcode to the retailer as a proof of receipt. There were other security related use of 2D Barcodes as well. Again, 2D barcodes cannot save a lot of information. JSON and its libraries would provide us a very compact way to store info in the barcode and read it back.

Today, I also noticed an article discussing other uses of JSON in mobile apps here.

See here for using JSON in J2ME

Wednesday, November 5, 2008

Disabled Form Elements in HTML are never submitted

Maybe I am too naive. But if a check box in a form is checked but disabled, it will never be submitted by the browser. This is what the W3 spec says "Disabled form controls are not successful" (Reference here). I am not sure if the Spec is correct in its design choice. But that's what it is.

A simple workaround to overcome this is to of course to add a hidden variable in the form with the same name as the check box. The hidden variable can contain the value that corresponds to a checked check box.

Saturday, September 27, 2008

Creating Forms In Java Swing (Manually)

Such a simple topic but sadly google does not throw up good results on how to create a simple form in Java Swing. This definition is not needed but by form, I mean, a simple data entry utility like one where a user can add a contact to an address book application. This post assumes that you prefer coding out the form manually instead of using an IDE. This is essential when you want more control over the form code. Of course it is more complex and if you have an option always is an IDE like Netbeans, go for it. Manual coding, for example could be useful when coding in an existing application.There are about 3 ways that I researched on but tried just the first one:

1. Using A SpringLayout and SpringUtilities

I am not going to explain what a Spring Layout. My aim is just to provide a Java Developer for links to investigate and hopefully to save their time.

This is what a Spring Layout is: http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html

A Very Useful Utility:

http://java.sun.com/docs/books/tutorial/uiswing/examples/layout/SpringGridProject/src/layout/SpringUtilities.java

Here is a quick example, of course taken from Sun's javadoc. This creates a simple form with two columns (the left column contains labels such as name and the right column contains a text field to enter data):


//these are your labels in the form
String[] labels = {"Name: ", "Fax: ", "Email: ", "Address: "};
int numPairs = labels.length;

//Create and populate the panel.
JPanel p = new JPanel(new SpringLayout());
for (int i = 0; i < l =" new" textfield =" new">
where rows is number of items in the form, cols is the number of columns (here it is two one for label and other for textfield), initX is the initial X position from where you can start the form and initY is the initial Y position from where you can start the form. xPad is the amount of space between each row and ypad is the amount of space between each column.

There are other complex Layout such as GridBag Layout and GroupLayout which are not good for manual coding.
These layouts are used mainly in code that is auto generated by IDEs

2. If you have been a web developer like me and like to make use of CSS like styling properties to make UIs (as in Google Android, Flex), then this one is for you: http://www.miglayout.com/

3. Similarly, there is one called JGoodies Forms which seems to be very popular. http://www.jgoodies.com/freeware/forms/index.html. JGoodies has a wonderful demo where you can manually play around with form elements and view their properties.

2 and 3 are open source and free to use.

4. If you wish to use your own form layout utility, you can begin from here: http://www.javaworld.com/javaworld/jw-10-2002/jw-1004-dialog.html?page=2

Sunday, September 21, 2008

My Tryst with Date/Calendar Pickers for Java Swing

For one of my recent projects, I had to work on Java Swing and check out some date/calendar pickers for Java Swing. My expectations were not stringnet. I could use any Date Picker as long it was free and open source :). Customization was not important either. So I narrowed down on the following three simple Date Picker which are available as Swing components:

1. JCalendar: https://jcalendar.dev.java.net/ - Seems to have a lot of options to customize
2. JxDatePicker - http://wiki.java.net/bin/view/Javadesktop/SwingXCalendar. It is part of a much larger Swing component Library called SwingX.
3. Finally Settled on Microba Date Picker - http://microba.sourceforge.net/

There are many more options. The free ones are fairly useful and each of them have many customization options such as timezone, setting the date at instantiation time, look and feel, number of years a user is allowed to navigate to, etc that must be looked into and exploited

Wednesday, April 30, 2008

HSC releases the SIP UA Port for Android alongwith a non-working RTP Impl

Check out the link

Friday, April 25, 2008

SIP User Agent for Android

A legend: when I refer to "mjsip User Agent", I am talking of MjSip UA

For a class assignment, I decided to build a VOIP client for Android. But it turns out Android does not have any inbuilt support for the session initiation protocol (SIP) and real time protocol (RTP). However, guys at HSC.com have ported the Java based open source SIP stack mjsip (http://www.mjsip.org) and have discussed it here. They have even shown a screencast in which they show up a client on Android and call a Xlite soft phone. The source code of the stack is also available on the same site. However, they have not released the SIP User Agent yet and this is what I am going to do here (I would suggest you track their site for a more concrete and practical implementation later).

Note that the Android user agent can only make a call to another non-Android SIP Client. A SIP call establishment is done and no voice converstion is possible since Android emulator does not allow coice capture yet. I will try to stream a media file later over the same call. My next step would be to stream a media file using RTP from the Android client to the non-android SIP client. (The mjsip User Agent also has RTP implementation)

However, the code that I have has been made over a night long session. Not technically challenging but required some patience. And so, I have mixed up all the classes of the standard mjsip User agent at mjsip.org and the android port of the stack at hsc.com. I had to replace all System.out statements with the Android logging at info level. There is no GUI yet for the user agent that I have developed. When the application starts up it initates a call and you can hear a ring on the non-Android Client. You will have to step through the code to understand what I have done and to be able to use it in your application. Also, the constructors for the SIP Stack, SIP Provider, etc take a file name as a string, I added a new constructor in some classes to take an InputStream. Its not a neat implementation but should help until HSC.com releases a nicer client and if you have been eager to do some VOIP based or to be more general SIP-based applications. So this is how to run it:

  1. Download the binaries for MjSip UA
  2. Download the project that I made from here
  3. Copy the file /Non-AndroidClient/non-android.cfg into the /lib folder of the MjSip UA
  4. In non-android.cfg do this:
    1. The parameter from_url="Bob" . After the '@ ' sign put the IP address of your local machine.
    2. Let "realm" be also equal to the IP address of the same machine
  5. To start up the mjSip User Agent, co to your command prompt and enter the root of the mjsip files you just downloaded and type in "uaw -f config\non-android.cfg"
  6. Now lets see what to with Android. Somehow try to import the files stored in /AndroidUA into an Android Project in Eclipse IDE (IDE must come with the Android extension and SDK) and include/copy the Activity class that I have created.
  7. In the android project, open to /res/raw/a.txt and edit it as explained:
    1. Change the "call_to" parameter to be: call_to= sip::5080
      where the "IP addr" is the IP address in 4. This file is now actually added as a resource/asset to the application and will be opened by the reference to the Activity instance like this:
      1. this.getResources().openRawResource(R.raw.a) which returns an InputStream and hence, I had to change many methods/constructors to take an inputstream instead of a string file name.
  8. Thats it. You are done. Start up the Android client and voila...you shall here a ring on the non-Android client
Though HSC.com has shown a screencast on their blog, if you want me to do the same, please drop a line and I can try to make one. Questions/comments are most welcome. And thanks to people at hsc.com and mjsip.org. Please feel free the use the code the way you want and spare me if there is any problemo :)