Saturday, October 10, 2009

Introduction to Flex

What is Flex?

It is a powerful markup language, can be combined with ActionScript to design RIA

Important features of Flex :

Controls :

TextInput:
<mx:textinput id="searchTxt"></mx:textinput>

Combo Box:
<mx:ComboBox x="53" y="479" id="lstTheme" selectedIndex="1" editable="false" enabled="true">
<mx:ArrayCollection>
<mx:Object label="Toys"/>
<mx:Object label="SunFlower"/>
<mx:Object label="Alphabet"/>
</mx:ArrayCollection>
</mx:ComboBox>

TileList:
<mx:TileList width="200" height="491"
dataProvider="{imageFeed}"
itemRenderer="FlickrThumbnail" x="522" y="10" itemClick="saveItem(event)">
</mx:TileList>
It displays data as a small tiles. dataProvider serves as a input. It can read data from a ArrayCollection.

Tree:
<mx:Tree id="tree" dataProvider="{xml}"
labelFunction="tree_labelFunc"
showRoot="false"
width="250"
height="100%"
itemClick="tree_itemClick(event);">
</mx:Tree>

The above code displays tree, reads the data from xml and relies on tree_labelFunc and tree_itemClick functions for labeling the tree nodes and take action when a user clicks on a tree node respectively.

Code for example 1 (ImageViewer)

Code for example 2 (TreeDemo) (stuff.xml)

Screen-shot 1 or Live Demo

Screen-shot 2 or Live Demo

Thursday, November 6, 2008

Technical Interview Questions: Java & C++

Which sorting algorithm is fastest?
Quicksort, Merge-sort

How much time it will take to find largest number in a array
O(n)

What will happen to the lock object when the thread is in sleep state.
the thread will hold the lock and it will not do anything until it explicitly releases the lock by calling notify or exiting from the synchronized block.

How to make a Java program faster?
one possible answer is use the java's concurrent apis

In a given connection object in a client-server application, there are 2 client session open simultaneously, but the 2nd client is not able to connect, getting connection failure message. Assume that singleton pattern is used here. What might be the problem?
The problem can be the singleton pattern will only work per JVM, assuming the connection object is singleton, the 2 clients might be running in two separate JVMs, which might be causing 2nd client unable to connect with connection failure message.

Write in-order or post order traversal program of a binary tree.
Quick solution is to implement it through stack.
For e.g.,
struct {
struct node* left;
struct node* right;
int value;
}node;

struct node* root;
//initialize with some elements;
//initialize a stack

void traverse(struct node* anode) {

struct node* next;
while ((next=stack.pop())!=null) {
if(next!=null)
{
stack.push(anode);
traverse(next->left);
printf("%d,",anode->value);
traverse(next->right);
}
}

printf("%d,",anode->value);

}


Traversing without recursion, can be done using stack

Sample code:
      public void visit(Node node)
{
 if(!node.visit)
 {
  sb.append(node.val + " ");
  node.visit=true;
  stack.pop();
 }
}

public String traverse(Node node)
{
 stack.push(node);
 while((node=(Node) stack.top())!=null)
 {
  if(node.left == null && node.visit==false)
  {
   visit(node);
  
  }
  else if(!node.left.visit)
  {
   stack.push(node.left);
   continue;
  }
  visit(node);
  if(node.right !=null)
  {
   stack.push(node.right);
  }
 }
 return sb.toString();
}




What are marker interface in Java?
Null interfaces, they do not have any method declarations, used for naming a set of classes. Examples are Serializable, Clonable

What is difference between hashmap and hashtable?

Describe singleton design pattern.

Monday, October 1, 2007

Threading II

Deadlock Example


The following class is example of a java program which leads to a deadlock. Basically a person a is bowing to his friend b. and b in turn bows back to friend a. The problem is Person a and Person b both have obtained lock on their objects. When person b tries to bowback to a and at the same time, a tries to bowback to person b. In this case, both will wait endlessly to obtain a lock to bow to each other. This situation is refered as deadlock.


class Person extends Thread {

protected String myName;
Person friend;
public Person(String name)
{
super(name);
myName=name;
//do nothing
}

public synchronized void bow()
{
System.out.println(myName+" is bowing to "+friend.toStr());
friend.bowBack();
}

public synchronized void bowBack()
{
System.out.println(myName+" is bowing back to " +friend.toStr());
}

public void setFriend(Person p)
{
this.friend=p;
}
public String toStr()
{
return myName;
}
public void run() {
bow();
}
}
public class Deadlock {

public static void main(String[] args) {
Person a=new Person("A");
Person b=new Person("B");
a.setFriend(b);
b.setFriend(a);
a.start();
b.start();

}
}




There are various techniques by which you can synchronize sequence of events.

In the above example, instead of synchronizing the entire method, just synchronize a block, so that the deadlock doesn't happen.

E.g,

public void bow()
{
Synchronized(this) {
System.out.println(myName+" is bowing to "+friend.toStr());
}
friend.bowBack();
}

public synchronized void bowBack()
{
Synchronized(this) {
System.out.println(myName+" is bowing back to " +friend.toStr());
}
}

Monday, September 24, 2007

MISC (Shell scripts, Java)

Shell script to remove ^M charactors from a file ftped through pc.

sed 's/^M//;s/^Z//' $1 > $1.new

To type ^M, manually enter with (ctrl+v, ctrl+m). Same for ^Z.

Customize SQLExeption's e.getMessage()

catch(SQLException e)
{
if(e.getErrorCode()==1 && e.getMessage().contains("unique constraint")) {
SQLException se=new SQLException("YOUR CUSTOMIZED MESSAGE");
se.setStackTrace(e.getStackTrace());
throw se;
}
else throw e;
}



Connection Pooling configuration and sample usage using JNDI-DBCP

context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/appname" docBase="appname">
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource" username="user" password="pass" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@ipaddr:1521:sid" maxActive="8" maxIdle="4" />
</Context>


web.xml :

<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

Code sample :

Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

Also, some useful parameters you can use to avoid the resource leaks due to connection pooling
removeAbandoned="true"
removeAbandonedTimeout="600"
logAbandoned="true"
The above can be configured in context.xml along with maxActive and maxIdle parameters.

Refer to following links for detail explanations:
http://commons.apache.org/dbcp/
http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
http://commons.apache.org/dbcp/configuration.html

Tuesday, September 4, 2007

Web Application Development

Creating a simple web application using maven, eclipse and apache-tomcat

Pre-requisites:

1. Download and install maven 2
2. Download and install eclipse
3. Install maven 2 eclipse plugin from http://m2eclipse.codehaus.org/ update site from eclipse. Also, eclipse needs to know where maven repository is, which can be set using following command:
mvn -Declipse.workspace= eclipse:add-maven-repo 

3. Download and install apache tomcat 5.5.23 (make sure you have jdk 1.5 or higher installed before installing tomcat)

Steps :
1. Now, go to eclipse-workspace directory and create a web application maven project using following command.

mvn archetype:create -DgroupId=org.test.webapp -DartifactId=HelloWorldWebApp -Dpackagename=org.test.webapp -DarchetypeArtifactId=maven-archetype-webapp

2. Go to HelloWorldWebApp directory
-open pom.xml add any necessary dependencies. for e.g
<dependency>
<groupid>jdbc</groupid>
<artifactid>oracle</artifactid>
<version>1.4</version>
</dependency>

- run following commands from command line to create an eclipse project :
mvn install
mvn eclipse:eclipse

3. Start a eclipse project with HelloWorldWebApp and now, you are ready to go.
You may add following in your .classpath file
<classpathentry kind="src" path="src/main/java">

4. Create a new class name it HelloWorldServlet:

Write your code :

package org.test.webapp;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloWorldServlet extends HttpServlet{

public void doPost(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException
{

res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.write("Hello World:doPost");
out.flush();
out.close();
return;
}

public void doGet(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException
{

res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.write("Hello World:doGet");
out.flush();
out.close();
return;
}
}
5.Modify wrc\main\webapp\WEB-INF\web.xml
For e.g :

<web-app>
<display-name>Hello World </display-name>
<description>
Provides Portlet Application
</description>

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>org.test.webapp.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

</web-app>


6. To deploy :
compile using maven :
mvn clean compile war:war

deploy on tomcat
start tomcat
open a browser point to localhost:8080/manager/html
deploy the war file
try in your browser url : http://localhost:8080/hello

Thursday, March 29, 2007

XML, XSLT

XML Parsing using SAX Parser

Write a java class that extends DefaultHandler with following methods:

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class MyParser extends DefaultHandler {
..
public void startDocument( ) throws SAXException
public void endDocument( ) throws SAXException
public void startElement( String namespaceURI,
String localName,
String qName,
Attributes attr ) throws SAXException {
System.out.println( “Start element : “+localName);
for ( int i = 0; i <>
System.out.println( " ATTRIBUTE: " +
attr.getLocalName(i) +
" VALUE: " +
attr.getValue(i) );
}

public void endElement( String namespaceURI,
String localName,
String qName ) throws SAXException {

System.out.println( “End element : “+localName);
}
public void characters( char[] ch, int start, int length )
throws SAXException {

String val=null;
val = new String(ch, start, length);
if(val!=null)
System.out.println(“Characters :“+val);

}

Use above in your program as follows :
try {
// Create SAX 2 parser...
XMLReader xr = XMLReaderFactory.createXMLReader();
// Set the ContentHandler...
xr.setContentHandler( new QueryParser() );
// Parse the file...
InputSource is = new InputSource(new StringReader(Test.getXMLQueryString()));
xr.parse( is );

}catch ( Exception e ) {
e.printStackTrace();
}


Xslt for webRowSet to html

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wrs="http://java.sun.com/xml/ns/jdbc" version="1.0">
<xsl:template match="/">
<h2>Query Results</h2>
<h3> Total Count : <xsl:value-of select="count(wrs:webRowSet/wrs:data/wrs:currentRow)"/> </h3>
<table border="1">
<tr bgcolor="lightgray">
<xsl:for-each select="wrs:webRowSet/wrs:metadata/wrs:column-definition">
<th><xsl:value-of select="wrs:column-label"/></th>
</xsl:for-each>
</tr>

<!-- fill in the table rows -->

<xsl:for-each select="wrs:webRowSet/wrs:data/wrs:currentRow">
<tr>
<xsl:for-each select="wrs:columnValue">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

Other important xslt:


If you have a xml like :
<list>
<val>10</val>
<val>100</val>
<val>30</val>
</list>
To print each value in a comma separated list :
<xsl:template match="/list">
<xsl:value-of select="val[1]"/>,
<xsl:value-of select="val[2]"/>,
<xsl:value-of select="val[3]"/>,
</xsl:template>

Oracle, SQL

To Display last record in a table

select * from (select rownum r, emp.* from emp) where r in (Select count(*) from emp)

Select a range :

select * from (select rownum rn, department_id,department_name from departments) where rn >= 11 and rn <= 20;


Tree Query :

To display A Employee supervisor tree, all possible combinations :

Select * from emp
Connected by prior emp_id = superviosor_id;

To display all employees of a particular supervisor (for e.g 101) :

Select * from emp
Connected by prior emp_id = superviosor_id;
Start with emp_id = 101;

Example of traversing through a tree table

SQL> select sample_number,parent_sample,text_id from sample
2 connect by prior sample_number=parent_sample
3 start with sample_number = 118;


Creating new tables/schema

1. Log into the console via http://targetted-database-host:1158/em. Authenticate as one of the DBA accounts.
2. Select the Administration tab.
3. Select the Storage Tablespaces link.
4. Ensure the Actions drop-down list is set to Add Datafile.
5. Press the Create button.
6. Specify a name for the tablespace. Will appear in uppercase in most locations.
7. Under Extent Management select locally managed.
8. Under Type select permanent with set as default... unchecked.
9. Under Status select read write.
10. Under Datafiles check the use big file tablespaces option.
11. Press the Add button down in the Datafiles section.
* Supply a File Name of the form basename01.dbf. As the database grows more files are likely to be added, thus the use of a sequence number.
* The File Directory should be defaulted already: e.g. /oracle/u02/oradata/sand/, or c:\oracle\oradata\10.2.0\lt50735\lt50735\
* Specify a File Size of 500 megabytes. Do not re-use an existing file.
* Under the Storage section select the Automatically extend... option. Set the increment option to 500 megabytes. Make sure maximum file size is set to Unlimited.
* Press the continue button to accept the file addition. The view returns to the tablespace entry screen.
12. Press the Ok button (upper-right) to create the new tablespace and file, placing it on-line for use.


Create user

$ sqlplus / as sysdba
create user myuser identified by password;
grant create session,create any table to myuser;
alter user myuser default tablespace ;
alter user myuser quota unlimited on ;

login sqlplus with myuser

create tables…, insert data.. ready to go

Implementing auto increment

http://jen.fluxcapacitor.net/geek/autoincr.html

Example Java Code :

String query = "BEGIN insert into Test(desc,timestamp) values (? , ?) returning id into ?; END;";

OracleCallableStatement cs = (OracleCallableStatement) conn.prepareCall(query);
cs.setDouble(1, "test");
cs.setTimestamp(2, time);
cs.registerOutParameter(3, OracleTypes.NUMBER );
cs.execute();
test_id=cs.getInt(3);
cs.close();

Create sequence and trigger before using the above code as follows :

SQL> create sequence test_id_seq
2 start with 1
3 increment by 1
4 nomaxvalue;
Sequence created.

SQL> create trigger test_id_trigger
2 before insert on test
3 for each row
4 begin
5 select test_id_seq.nextval into :new.id from dual;
6 end;
7 /


Query to find gaps in sequence number in a table :

SELECT (before_gap+1) ||'-' || (after_gap-1)
FROM (SELECT seq_number after_gap, LAG(seq_number,1,0) OVER (ORDER BY seq_number) before_gap from seq_num_table)
WHERE before_gap != 0 AND after_gap - before_gap > 1
ORDER BY before_gap;