Friday, December 28, 2012

Setup yum repository from a linux iso shared on remote windows machine

1. Mount remote windows share on linux system

In general, a useful stuff – specially when important software-installers are stored on a windows share. It can be useful to mount the windows share on your linux system to use it efficiently.

Following are the steps:
  • Login to Linux as root user
  • > mkdir /mtn/winshare 
  • > mount -t cifs //<windows-machine-IP-addr>/<folder-path/ -o username=<user>,password=<pw> /mnt/winshare (For RHEL > 4)
  • > mount -t smbfs //<windows-machine-IP-addr>/<folder-path/ -o username=<user>,password=<pw> /mnt/winshare (For RHEL < 4)

2. Extract Files from iso image and create yum repository

  • > mkdir -p /mnt/iso/{1,2,3}
  • > mount -o loop /mnt/winshare/disk.iso /mnt/iso/1
  • > rpm -ivh  /mnt/iso/1/Packages/<createrepo-package-name>.rpm
  • > cd /mnt/iso
  • > createrepo .
  • > yum clean all

3. Create yum repository configuration file

  • > vi /etc/yum.repos.d/iso.repo
  • Place following text in iso.repo
           name=My ISO Repo

Now you should be able to install any package from iso using yum.

- Sarang Anajwala

Monday, December 24, 2012

Debug class-not-found exception

Print ClassNotFoundException

A simple problem that I have found many people struggling with – how to print class-path. Following is the line that can be used to print classpath.

Arrays.toString((((URLClassLoader) Test.class.getClassLoader().getURLs()));

This code returns an array list of all jars and directories on the classpath of the classloader.

-          Sarang Anajwala


Friday, December 14, 2012

End of Public Updates for Java SE 6

A quick update on future of Java 6.

From oracle blog -
“The last publicly available release of Oracle JDK 6 is to be released in February, 2013. This means that after 19 February 2013, all new security updates, patches and fixes for Java SE 6 and Java SE 5 will only be available through My Oracle Support and will thus require a commercial license with Oracle.“

Presents a case for upgrade to Java 7!

- Sarang Anajwala

Tuesday, December 11, 2012

Log4j 2.0 - Some important features

Log4j’s latest 2.0 version has been recently released. Following are few of the important and very useful features of Log4j-2.0:

1.       Supports parameter substitution (same as slf4j)
For example: (“User Id is { } and User Email is { }”, userId, userEmail);

2.       Flow Tracing:
To print the entry and exit of a method.
  public String getUserEmail(int userId) {
    User user = UserDao.getUser(userId)
    String email = user.getEmail();
    return logger.exit(email);
  This method will log following messages:
    19:08:07.061 TRACE com.class.MyClass 10 getUserEmail -  entry parms(1)
    19:08:07.061 TRACE com.class.MyClass 13 getUserEmail -  exit with (
3.       Markers:
To log some special messages.
For example:
 public class MyApp {
   private Logger logger = LogManager.getLogger(MyApp.class.getName());
   private static final Marker QUERY_MARKER = MarkerManager.getMarker("SQL");
   public String doQuery(String table) {
     logger.debug(QUERY_MARKER, "SELECT * FROM {}", table);
     return logger.exit();
4.       Messages:
Very useful to standardize the format of an application’s log messages.
  "User {} has logged in using id {}", username, userId);        
      The above log message can be standardized by implementing a class ‘LoggedInMessage’ implementing ‘Message’ interface.
   LoggedInMessage(userName, userId)); 
                    (‘getFormattedMessage’ method of ‘Message’ interface is used to log the message string.)
Some more important types of messages are ThreadDumpMessage, TimestampMessage, MapMessage and few more.
5.       Plug-ins:
Log4j 2 uses a Plugin system that makes it extremely easy to extend the framework by adding new Appenders, Filters, Layouts, Lookups, and Pattern Converters without requiring any changes to Log4j.           

-          Sarang Anajwala      

Friday, November 23, 2012

git - tips

  • git remote –v                    
o   Shows remote branches

  • git remote add <remote branch name> <remote branch url>
o   Add a new remote branch

  • git push <remote branch name> <local branch name>
o   push changes from local branch to remote branch


Thursday, November 22, 2012

Maven - include a lib manually in local repo

Use following command to include a lib manually in local maven repository:


mvn install:install-file -Dfile=./EWSJavaAPIWithJars_1.2.0.jar -DgroupId=local.disk -DartifactId=EWSJavaAPI -Dversion=1.2 -Dpackaging=jar

Thursday, October 25, 2012

Installing git man pages

Git installation by default does not include all the man pages.
So if you try to look for help on git commands like “git help commit”, you may see and error like this: “No manual entry for git-commit”.
It is strange to see a popular tool like git does not including man pages by default; however, following are the steps to download and install the man pages.

> Download man-pages[GIT_VERSION_NO].tar.gz >  git-manpages-[GIT_VERSION_NO].tar.gz 
> Untar the man-pages
tar xvj -C /usr/local/share/man -f git-manpages-[GIT_VERSION_NO].tar.gz
Done – Now you should be able to use all git manpages.

Thursday, August 30, 2012

How to enable jmx-agent to monitor a java process from remote machine:

A quick tip on how to enable jmx-agent to monitor a java process from remote machine:

Add following system property in the java process while starting it: “<port number>”
We can add security features as well to it: 
For example, (run com.example.MyApp with jmx-agent enabled) 
% java

Monday, June 25, 2012

Security - Array is stored directly

Sonar Violation: Security - Array is stored directly
Means: Constructors and methods receiving arrays should clone objects and store the copy. This prevents future changes from the user (caller/client) affect the internal functionality.

public void setMyArray(String[] myArray) {
  this.myArray = myArray;


public void setMyArray(String[] newMyArray) {
  if(newMyArray == null) {
    this.myArray = new String[0];
  } else {
   this.myArray = Arrays.copyOf(newMyArray, newMyArray.length);

Friday, May 18, 2012

JBoss - Too many open files

Issue: I faced this issue in JBoss while doing load testing. Under heavy load, jboss http connector crashed and it refused to accept any new connections. On checking logs, I found out that the root cause was “Too many open files” issue.


Resolution: “Too many open files” – this issue is a linux issue. OS enforces a limit on each process for maximum number of files that can get attached to a process. Normally the default value is 1024. (Default value can be checked using this command: “ulimit -n“) This value is not sufficient for processes like application containers.


All the files associated with given process can be seen with this command: lsof -p <pid>


More details about how can this value be changed is available on this wonderful blog post -


One thing missing in this blog is that for ‘root’ user, you have to specifically mention the user name while modifying /etc/security/limits.conf file. Wild cards are not applicable for root user.

For example, following lines should be enter in /etc/security/limits.conf file for root user –


root            soft      nofile        4096

root            hard    nofile        8192





Friday, May 4, 2012

JBoss TimerService - bug fix

As such the TimerService implementation is not stable in jboss6.1.
The version of timer-service library (of JBoss6.1.0.Final) itself says it is only an ALPHA lib… not a GA (jboss-ejb3-timerservice-mk2.jar, version 1.0.0-alpha-13)

I was facing an issue with the TimerService and while looking for a solution, found out JBoss team doesn’t support issues of JBoss-6x any longer.
The issue was related to Transaction management in Timer Service implementation.

Following is the JIRA defect and attached is the library with fix of the issue.
You can get the source code also at my GitHub page mentioned below.

Fixed lib jar file –


Tuesday, February 21, 2012

JBoss Trimming - remove JSF

If you are not using JSF, you can trim jboss and remove JSF from getting deployed!
You can do this by commenting everything in the deployers\jsf.deployer\META-INF\jsf-integration-deployer-jboss-beans.xml.
Just keep following lines.
<?xml version="1.0" encoding="UTF-8"?>
    JBoss JSF + JBossAS integration
<deployment xmlns="urn:jboss:bean-deployer:2.0">

This will save a lot of time while starting jboss… the time jboss uses in JSF initialization.

Courtesy: Vishnu Gopal Singhal

Friday, February 10, 2012

Android installation issue

I was facing problem while downloading 3rd party plugins for Android SDK.
Following was the error I was facing –
“Failed to fetch URL
reason: Connection to refused”

Following is the solution -
Go to the SDK Manager (Navigate to it on the computer, not from eclipse), then open it up and provide proxy. Also check the checkbox which says force http connection for https urls.
(I was behind a proxy.)