Sunday, July 17, 2016

Advance SQL Queries

Select 10th highest salary


SELECT DISTINCT TOP (10) Salary FROM Employee ORDER BY Salary DESC

Altertative:

SELECT Salary from Employee limit 10 order by Salary DESC


Combine more than two tables using union all, avoid duplicates

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Find values from one table exclude value from another table without using not in

Select id from table_a
except
Select id from table_b

Alternative:

Select a.id from table_a a left outer join table_b b on a.id = b.id
where a.id <> b.id

Oracle MERGE - Use case - when the conditoin meets, update/delete record otherwise insert the record. Useful in ETL process while syncing two different datasources. Where the updated rows from source table are updated in datawarehouse table and new rows are inserted in the table.

MERGE INTO dw_employee D
USING (SELECT employee_id, salary, department_id FROM employees
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET d.salary = S.salary
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.Salary, D.department_id)
VALUES (S.employee_id, S.salary, S.department_id)

For performance use parallel hint for e.g in above query 

merge /*+ parallel (dw_employee,6) */ 

Reference : https://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel007.htm#i1009257

Saturday, July 16, 2016

Hive queries

Combining multiple hive tables into one

INSERT OVERWRITE TABLE FINAL_TBL
SELECT main_union.id, main_union.output_string
FROM (
select id, concat_ws("|",col1,col2,col3) output_string from table1

UNION ALL

select id, concat_ws("|",col1,col2,col3) output_string from table2

UNION ALL

select id, concat_ws("|",col1,col2,col3) output_string from table3

UNION ALL

select id, concat_ws("|",col1,col2,col3) output_string from table4

) main_union

CLUSTER BY main_union.id;

Solution in hive instead of exists clause

for e.g
Employee = individual works at institute, it has many departments.
joe works at institute1 - dept1
joe works at institute2 - dept3
jason works at institute1 - dept1
jason works at institute1 - dept2


Query:

Select individual from individual ind join ind_related ir on ind.id = ir.id
join institute ins on ir.relatedkey = inst.instituteid 
left semi join
dept d on d.deptid=ir.relatedkey

Monday, December 8, 2014

Hadoop & Big Data - Simple Introduction

When and where you can use Hadoop - Map/Reduce?

Relational databases are best suitable for transactional data and also used widely in data-warehousing. Hadoop and map/reduce is useful when you have massive amount of data processing at faster speed and lower costs because it uses open source technologies can run on commodity servers clustered together to perform faster. It comes with concurrent processing out of the box as it sub-divides data into smaller chunks which can be processed concurrently. Performing analytics for a large dataset is very good example of using hadoop - map/reduce.


How do you design your system to use hadoop - map/reduce?

Often map-reduce program has tutorial to count words in a large text file or a extremely large input. The framework splits the data input and sorts the input for you. The map program takes this input to combine the data, in case of word count it outputs word1 freq1; word2 freq2;etc. Reducer runs in multiple cycle by combining output from mapper and eventually coming up with final output.

Two main approaches - easy way to think of Map and reduce is - Map is nothing but data combiner, it combines data you want to process by similarities. Reducer processes already combined data. Assume, we have very large input for e.g entire years' lego store sells, trying to find out which one is best selling product by finding max money making product.

For e.g, top selling product by location.
AB, EDM1, Lego Friends, 100, 50
AB, EDM2, Lego Creator, 70, 100
ON, GTA1, Duplo, 100, 45
ON, GTA2, bricks, 1000, 20
BC, VAN1, Lego Farm, 150, 35
BC, VAN2, bricks, 750, 10
ON, GTA3, Lego Friends, 400, 40
BC, VAN3, Lego Creator, 200, 110
..

map will combine the input by state and pass it on to reducer. Reducer will find the top selling product in each state and output the result:

AB, EDM2, Lego Creator, 7000
ON, GTA2, bricks, 20000
BC, Lego Creator, 22000


What is solution when reducer runs out of memory? For e.g in word count problem if the file is very large and contains one word very frequently like 'the', the reducer can run out of memory.
Possible solutions:
Increase number or reducers
Increase memory per reducer
Implement a combiner.

PySpark code for above example (WIP):
store = sqlContext.read.parquet("...")
store = store.assign(col6 = lambda x: col4 * x.col5)
store.groupBy(store.col1,store.col2,store.col3).agg({store.col6, max}).show()

Wednesday, October 15, 2014

Shell Script to generat comma seperated output from a file

#!/bin/bash
counter=1
invoice_clause=""
while read line
do
    if [ $count == 1 ]
    then
    #invoice_clause="'$line'"
        echo "if then"
    else
    invoice_clause="$invoice_clause,'$line'"
    fi
    counter=`expr $counter + 1`
done < invoices.num

echo $invoice_clause


Input file :
one
two
three
four
five

Output:
'one','two','three','four','five'

Simple Python script to convert name value to tabular format

#!/usr/bin/env python
import csv

file1reader = csv.reader(open("mapping.csv"), delimiter=",")

header1 = file1reader.next() #header
header2 = file1reader.next() #header

data = dict()
result=[]
row=[]
for Key, Prop, Val, Flag in file1reader:
        if key in data: # found it
        x=data[Key]
        data[Key] = x + "," + Val
        row.append(Val)
    else:
        data[Key] = Val
        result.append(row)
        row=[]
        row.append(Key)
        row.append(Val)
   
with open('myfile.csv', 'wb') as f:
    w = csv.writer(f,dialect='excel')
    w.writerows(result)   

Example mapping.csv file:

Key1, prop1, value1
Key1, prop2, value2
Key1, prop3, value3
Key2, prop1, value4
Key2, prop2, value5
Key2, prop3, value6

Output file:
Key1, value1, value2, value3
Key2, value3, value4, value5

Technical Interview questions

Q: What happens when you enter URL in the browser?
A:
1.    browser checks cache; if requested object is in cache and is fresh, skip to 9
2.    browser asks OS for server's IP address
3.    OS makes a DNS lookup and replies the IP address to the browser
4.    browser opens a TCP connection to server (this step is much more complex with HTTPS)
5.    browser sends the HTTP request through TCP connection
6.    browser receives HTTP response and may close the TCP connection, or reuse it for another request
7.    browser checks if the response is a redirect (3xx result status codes), authorization request (401), error (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)
8.    if cacheable, response is stored in cache
9.    browser decodes response (e.g. if it's gzipped)
10.  browser determines what to do with response (e.g. is it a HTML page, is it an image, is it a sound clip?)
11.  browser renders response, or offers a download dialog for unrecognized types

Q: How to implement queue using stack?
A: hint: To use two stacks

Q: Design a elevator system in a high rise tower
A: Hint: Use elevation and speed parameters to control stopping of elevator at specific floor.

Q: How to implement a HashMap, what are methods to override?
A: Hint : Override equals, hashCode method of object class
Main methods to implement are put and get

Q: What is dependency injection?
A: Is inject dependency through configuration files - constructor injection, setter injection etc used in spring framework

Q: How spring AOP works?
A: Hint: Uses wrapper (proxy) classes. Another way is to modify byte code but not supported in spring.

Q: How do you keep track of multiple requests on backhand modifying same object?
A: through versions, increment record version in db to avoid race conditions/data courrption

Q: Describe popular design patterns
A: Singleton, Factory (With spring-framwork, you get these out of the box)
visitor, facade, builder, strategy


Thursday, March 14, 2013

Jasper Reports tips and tricks

Jasper Reports basic steps:

1. Design report in iReport designer
2. Save the the template  - jrxml file
3. Compile the jrxml to jasper
4. Run from iReport or integrate it with a java program

Load the jasper report from .jasper file

//reportData is an instance of List
(JasperReport)jasperReport = JRLoader.loadObjectFromLocation(jasperReportName);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameters,new JRBeanCollectionDataSource(reportData));


//Export into pdf format
byte[] pdfFile = JasperExportManager.exportReportToPdf(jasperPrint);


//Export into csv format
JRCsvExporter exporter = new JRCsvExporter();
StringBuffer buffer = new StringBuffer();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER,buffer);
exporter.exportReport();

//Export into HTML format
JRHtmlExporter exporter=new JRHtmlExporter();
StringBuffer buffer = new StringBuffer();
  
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, buffer);
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, false);
//following parameters are used to avoid the page breaks, empty spaces and display tabular data better in html compare to pdf
exporter.setParameter(JRHtmlExporterParameter.IGNORE_PAGE_MARGINS, true);
exporter.setParameter(JRHtmlExporterParameter.ZOOM_RATIO, 1.5F);
exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
exporter.setParameter(JRHtmlExporterParameter.FRAMES_AS_NESTED_TABLES,true);
exporter.setParameter(JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, true);
exporter.exportReport();
   
iReport Designer tips n tricks:


Create paremeters, fields in the iReport designer and make sure the name match the exact names in the javabean if you plan to use java bean as datasource.

List is also very useful if you do not want to use a subreport.
To create a list, drag list component from the pallet and right-click select datasource :
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{fieldname})
go to the dataset1 and create all necessary fields and drag and drop them to the area.


If you want to display certain area when some conditions are met, select the band properties for that particular group or section and modify "print when expression" to new Boolean($F{fieldname}>0) for e.g.

Wednesday, October 10, 2012

Tuning Weblogic - Case study of performance issue resolution

Case Study of how to analyze a slower performance or frequent out of memory exceptions of a web applications containing ejb deployed on oracle weblogic 

Enable jvm heap dump on app server

For e.g : export JAVA_OPTS=-verbose:gc -XX:+PrintClassHistogram -XX:+PrintGCDetails -Xloggc:/tmp/jvm_loggc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp

Using gcviewer monitor the heap usage and note the trend of increasing memory consumption even after the garbage collection is executed.


Take several snapshots/heap dumps and identify where the bottle neck is using tools like Eclipse MAT or visualvm
the heap dump can be taken manually using following command, can be analyzed using EclipseMAT or visualVM :
jmap -dump:format=b,file=  

Sort by object size in Dominator Tree or in histogram in EclipseMAT. Look for the top class/object and drill down to the classe name that look more familiar. If the identified class belongs to an ejb then there is a possibility that the ejb is retained in the in memory cache of jvm. To confirm this, check the cached beans current count in weblogic console. (refer to the how to monitor ejb cache section below for details)

One possible solution to above problem is described below :

Configure max-beans-in-cache and idle-timeout-seconds appropriate according to your need in weblogic-ejb-jar.xml as below use stateful/stateless as per your ejb:

<weblogic-enterprise-bean>
   <ejb-name>BeanName</ejb-name>
      <stateful-session-descriptor>
 <stateful-session-cache>
   <max-beans-in-cache>200</max-beans-in-cache>
   <idle-timeout-seconds>1200</idle-timeout-seconds>
 </stateful-session-cache>
      </stateful-session-descriptor>
</weblogic-enterprise-bean>

For testing purpose you can set the max-beans to 3-5 and idle-timeout to 60 secs and do some testing and notice the changes in weblogic console, like the ejb passivation count is increasing that means the ejbs are cleared from the cache once they are used.
Another important parameter is cache-type. Refer to the references for detailed explanations.

How to monitor the ejb cache on weblogic console :

1. Go to your deployed application
2. Expand it and go the the ejbs
3. Select the Monitoring tab.
4. Click and navigate through the pages to view monitoring statistics for deployed stateless, stateful, entity, and message-driven EJBs.
5. If you don't see the activation count or passivation count, click on customize table and add these columns.

References

1. http://docs.oracle.com/cd/E13222_01/wls/docs81/perform/EJBTuning.html
2. http://middlewaremagic.com/weblogic/?p=5665

Tuesday, September 25, 2012

Debugging JSP

1. Keep the generated java files

IBM websphere :
change WEB-INF\ibm-web-ext.xml as following :

<jspAttributes xmi:id="JSPAttribute_1" name="keepgenerated" value="true"/> <jspAttributes xmi:id="JSPAttribute_2" name="scratchdir" value="C:\temp\ibm"/>

Weblogic :
Change weblogic.xml as following :
<jsp-descriptor>
    <keepgenerated>true</keepgenerated>
    <verbose>true</verbose>
    <working-dir>c:/temp/bea</working-dir>
</jsp-descriptor>

2. Restart the server in debug or normal mode

3. When an exception happens in a jsp, it will show and line number. Now, you can find the java file and trace the line number and go from there.

Friday, September 21, 2012

Unit Testing Java code using mock objects (mockito)

Let's start with an example. We have a Conversion class to convert temperature from Fahrenheit to Celcius.

Following is the Java code :
class Fahrenheit {
 float f=0;
 public Fahrenheit(float f)
 {
  this.f=f;
 }
 public float getFahrenheit()
 {
  return f;
 }
 public void setFahrenheit(float f)
 {
  this.f=f;
 }
}

class Celcius {
 float celcius=0;
 public Celcius(Float c)
 {
  System.out.println("Celcius="+c);
  celcius=c;
 }
 public Float getCelcius()
 {
  return celcius;
 }

 public void setCelcius(Float c)
 {
  System.out.println("Celcius="+c);
  celcius=c;
 }
}

public class Convert {
 
 private float convertToFahrenheit(Celcius c)
 {
  return (float) ((c.getCelcius()*1.8)+32);
 }
 private float converToCelcius(Fahrenheit f)
 {

  return ((f.getFahrenheit()-32)*5/9);
 }

 public float convert(Fahrenheit f, Celcius c)
 {
  if(f!=null)
   return converToCelcius(f);
  else
   return convertToFahrenheit(c);
 }

}

1.Create Mock Objects
Object obj=mock(SomeclassName.class)

2. Setup return values on this object
when(obj.somemethod(param)).thenReturn(100);

3. Call a method under test
obj.aMethod()

4. Verify if a particular method is called and returns a certain value
verify(obj).bMethod(abc,anyObject());

For our example above, the test code looks like below

 @Test
 public void test() {

  Convert conversion = mock(Convert.class);
  Celcius celcius=mock(Celcius.class);
  Fahrenheit fahrenheit=mock(Fahrenheit.class);
  when(celcius.getCelcius()).thenReturn((float) 20.0);


  float val=conversion.convert(fahrenheit,celcius);

  verify(conversion).convertToFahrenheit(celcius);
 }

Tuesday, September 14, 2010

Using Hibernate, Spring, Maven, oracle all together

This tutorial will give an overview how can you wire up spring and hibernate together. The spring framework comes with ability to inject dependencies through the spring configuration file, we can leverage that to create the hibernate SessionFactory. Some code samples are given below. Also, we'll use the java persistence api so that we don't need to specify the hibernate mapping files.

The User class :


Entity
@Table(name="My_USER")
public class User {

private Long id;
private String name;
private String password;


@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "user_id_seq")
@SequenceGenerator(name="user_id_seq", sequenceName = "MY_USER_SEQ")
@Column(name="USER_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

@Column(name="USER_NAME")
public String getName() {
return name;
}
}
Replace the GeneratedValue annotation with strategy=GenerationType.AUTO if you are using any other database and no need to have sequencegenerator.

The DAO interface and implementation :




public interface UserDAO {

public void saveUser(User user) ;
public List<User> listUser() ;
}

public class UserDAOImpl implements UserDAO {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public void saveUser(User user) {
hibernateTemplate.saveOrUpdate(user);
}

@SuppressWarnings("unchecked")
public List<User> listUser() {
return hibernateTemplate.find("from User");
}

}
The main application class:




public class App
{
public static void main( String[] args )
{


BeanFactory factory = new XmlBeanFactory(
new ClassPathResource("application-context.xml"));

UserDAO dao = factory.getBean("myUserDAO");

User user=new User();
user.setName("ABc");
user.setPassword("password");


dao.saveUser(user);
....
Spring configuration file : application-context.xml




<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:user/password@localhost:1521:XE"/>
</bean>

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>ca.co.fusionapp.domain.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<bean id="myUserDAO" class="ca.co.fusionapp.dao.UserDAOImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>
The above configuration uses setter dependency injection (i.e, the UserDAO has a setSessionFactory method, which sets up the hibernate session factory).

Download the entire code from here, which contains the pom.xml and run the above example using following command : mvn clean compile exec:java -e

I've oracle express installed and set up a username/password which needs to be updated in application-context.xml file.

Tuesday, August 31, 2010

Introduction to JSF

Java Server Faces is View in MVC (Model, View, Controller).

Get started with JSF

1. Download jsf latest jar files (https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=10411)
2. Set up the
3. Set up your project by modifying web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

4. Write the jsp files, java source code, faces-config.xml and deploy on a webserver
For e.g converter.jsp
<f:view>

<h:form>
<h:panelGrid border="1" columns="2">
<f:facet name="header">
<h:outputText value="Temperature Conversion"></h:outputText>
</f:facet>

<f:facet name="footer">
<h:commandButton value="Convert" action="#{conversion.convert}"></h:commandButton>


</f:facet>

<h:outputText value="Celcius"></h:outputText>
<h:inputText value="#{conversion.celcius}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

<h:outputText value="Fahrenheit "></h:outputText>
<h:inputText value="#{conversion.fahrenheit}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

</h:panelGrid>
</h:form>

</f:view>

the conversion data bean class:

package proj;

public class Conversion {
..

public Float getCelcius()
{
return celcius;
}

public void setCelcius(Float c)
{
System.out.println("Celcius="+c);
celcius=c;
}
public Float getFahrenheit()
{
return fahrenheit;
}

public void setFahrenheit(Float f)
{
System.out.println("Fahrenheit="+f);
fahrenheit=f;
}

public String convert()
{
//conversion logic
return "convert";
}

..
}
faces-config.xml
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>
conversion</managed-bean-name>
<managed-bean-class>
proj.Conversion</managed-bean-class>
<managed-bean-scope>
session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/converter.jsp</from-view-id>
<navigation-case>
<from-outcome>convert</from-outcome>
<to-view-id>/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>

</faces-config>

Download the full source code

Wednesday, May 12, 2010

UML Integration

There are several tools available which can generate class diagrams, but I found this one very useful, which can generate class diagrams when you build your java project using ant.

Download the UmlGraph from http://www.umlgraph.org/

and also download the Graphviz from http://www.graphviz.org/

Modify your build.xml and add following javadoc


<target name="javadocuml" depends="init, init-compile-classpath" description="generates javadoc and also UML Diagram">
<mkdir dir="${DIST_DIR}/report/javadoc">
   <javadoc sourcepath="${SRC_DIR}" packagenames="test.*" destdir="${DIST_DIR}/report/javadoc" classpathref="compile.classpath" private="true">
     <doclet name="org.umlgraph.doclet.UmlGraphDoc" path="${LIB_DIR}/UMLGraph-5.2.jar">
        <param name="-inferrel"/>
           <param name="-inferdep"/>
           <param name="-hide" value="java.*"/>
          <param name="-collpackages" value="java.util.*"/>
           <param name="-qualify"/>
           <param name="-postfixpackage"/>
           <param name="-nodefontsize" value="9"/>
           <param name="-nodefontpackagesize" value="7"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5/docs/api"/>
       </doclet>
   </javadoc>
<apply executable="dot" dest="${DIST_DIR}/report" parallel="false">
    <arg value="-Tpng">
  <arg value="-o">
   <targetfile>
   <srcfile>
   <fileset dir="${DIST_DIR}/report" includes="*.dot">
   <mapper type="glob" from="*.dot" to="*.png">
   </mapper></fileset>
   </srcfile>
   </targetfile>
  </arg>
 </arg>
</apply>
</mkdir>
</target>


Run your build.xml with javadocuml ant-task and look for report dir. You can see some class diagrams in your javadoc. Refer to the umlgraph website for more information about things you can do with the class diagrams.


Maven configuration




<dependency>
   <groupId>gr.spinellis</groupId>
   <artifactId>UmlGraph</artifactId>
   <version>5.2</version>
</dependency>   


<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.7</version>
  <configuration>
  <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>

  <!-- <docletPath>/path/to/UmlGraph.jar</docletPath> -->
  <docletArtifact>
      <groupId>org.umlgraph</groupId>
      <artifactId>doclet</artifactId>
      <version>5.1</version>
  </docletArtifact>
  <additionalparam>-inferrel -inferdep -quiet -hide java.*
 -collpackages java.util.* -qualify
 -postfixpackage -nodefontsize 9
 -nodefontpackagesize 7 -outputencoding utf8
  </additionalparam>
  <useStandardDocletOptions>true</useStandardDocletOptions>
  </configuration>
</plugin>

Tuesday, April 27, 2010

Oracle Tips and tricks

SELECT query has limitations when you have more then 1000 fields to compare in the list.
One alternative is to use SQL Loader as follows :
1. Create a file called /tmp/test.dat :
100001
100002
100003
100004
100005
100006

2. create table temp
(number varchar2(10));

or truncate table temp

3. Create a file test.ctl in /tmp dir with following contents
LOAD DATA
INFILE test.dat
INTO TABLE temp
(number position(1:6) CHAR)

run command from the unix box where oracle client is installed from the /tmp dir:
sqlldr username/password@serviceid/sid control=test.ctl

Now, you can use the temp table in your query as follows :
For IN clause:
Select * from table_a a, temp t
where a.number = t.number;
for NOT IN clause:
Select * from table_a a, temp t
where a.number = t.number(+) and t.number is null;

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>