Saturday, August 25, 2012

Re-blogging my experience on this really cool blog.

The other day, I was going through some JDK code to understand what was happening under the hood. I saw this code in a couple of places. (such as binary search and merge sort) I really couldn't figure out why someone would want to use the unsigned right shift operator to do simple division.
mid = low + high >>> 1;
mid = low + high / 2
instead of this,

Until I recently came across this post from Peter Norvig in this blog Google Research Blog This bug must have been fixed by Josh Bloch I guess. Since he seems to be the author of the classes which I was checking.
A small side note here, I too fell into the trap of thinking this was done for performance issues. However the blog clearly states the root cause was something more sinister. Love to be in a place where your code get's pushed to the limit. I guess scale is an awesome beast to deal with.
When will my day arrive :-(. When millions use my code.

Sunday, August 12, 2012

Simple stuff in java that I learnt today

Coming from a C background I never really got to write code in java to do some string processing. The other day I was doing some simple stuff in java and I hit these problems.
  1. Converting a string to an integer array: It came as a shocker when I couldn't get this to work right away. However a quick google search gave me a whole bunch of answers. I have written the method below:
      public int[] getIntArrayFromString(String s) {
      int[] result = new int[s.length()];
      for(int i =0; i < s.length(); i++) 
        result[i] = Character.digit(s.charAt(i));
      return result;
    }
    
    The Character wrapper class comes to rescue here. However the logic for digit is pretty similar to C logic. Where the char ASCII vale is taken and subtracted from ASCII value of One '1'.
  2. Reversing a string:
    Again using String Buffer to do this is the best method possible.One from the front and the other from the rear.
     
      public static String revertString(String msg) {
          StringBuffer sb = new StringBuffer();
          for(int i=msg.length() - 1, i >= 0; i++ )
              sb.append(msg.charAt(i));
          return sb.toString();
      }
    
Super simple stuff wanted to see if my coding tags work.

Wednesday, April 18, 2012

How to Fix ConcurrentModificationException?

I was recently writing a java program to find dependency jars for a given Jar. The approach was pretty simple. I had two HashMaps.
One to store the final list of jar dependencies and the other to store the visited Jar names. This way I could keep track of my recursive loop and wouldn't loose my way if there were any circular dependencies. A little background, the jar in question had about 500 dependency jars and many had cyclic dependencies. Here is my initial code which threw the ConcurrentModificationException.
import java.util.HashMap;
....

public class FindJarDependencies {
   String pathToInitialJar;

  // Mapping from "name of jar" -> "path of jar"
  Map dependencies = new HashMap();
  // Mapping from "name of jar" -> "True|false" ( True, if jar has been visited otherwise  false)
  Map visitedJars = new HashMap();
   
  public List getDependenciesForJar(String pathToInitialJar) {
    List result = ArrayList();
    Iterator iter = dependencies.valueSet().iterator();
    while (iter.hasNext()) {
      result.add(iter.next());
    }
    return result;
  }

  /**
   * In view of having a short blog, 
   * lets assume this method adds the manifest-classpath 
   * for a given jar into the dependency Map. 
   */
  private void addJarDependencies(String pathOfJar) {
    // Open the jar file and add manifest-classpath to dependencies Map.
  }

  public void walkDependencyJar(String pathOfJarDependency) {
     // Strip name from path of jar
     String jarName = getNameFromPath(pathOfJarDependency);

     // add jar if not present in dependency Map.
     if (!dependency.get(jarName)) 
       addJarDependencies(pathOfJarDependency);


    // Add dependency Map values to visitedJars. 
    // By default the value would be false.    
    for (String s : dependencies.keySet()) {
      if (!visitedJar.containsKey(s)) {
        visitedJar.put(s,false);
      }
    }
    
    // Iterate through the visitedJars and add them to the dependency as and when 
    // you find new jars.
    Iterator iter = visitedJars.keySet().iterator();
    while(iter.hasNext()) {
      String jarClasspath = iter.next();
      if (!visitedJar.get(jarClasspath)) {
        visitedJar.put(jarClasspath, true);         // Oops ConcurrentModificationException
        walkDependencyJar();
      }          
    }   
  }
}

When I ran this program all hell broke loose on line number 54. On further debugging I figured out the problem.
In my code I was iterating over "visitedJar" at line 51 but inside the same loop at line number 54 I am trying to change the Map. This was the root cause. Java Iterator doesn't allow for changes to iterating data structure. For better understanding I wrote a stripped down version which throws the same error.

package com.example.ConcurrentModificationExample;

import java.util.*;

public class ConcurrentModificationExample {
  static Map map = new HashMap();

  public static void main(String[] args) {
    map.put(1, false);
    map.put(2, false);
    map.put(3, false);
    map.put(4, false);

    Iterator iter = map.keySet().iterator();
    while(iter.hasNext()) {
      int value = iter.next();
      System.out.println("Value is: '" + value +"'");
      if (value == 3)
        map.put(5, false); // place where ConcurrentModificationException occurs
    }
  }
}
When I ran this code. I was able to reproduce the problem. Wala I knew exactly what was going on. After some googling I found couple of good resources and the way out. There are different solutions to this problem. They are:
  • Use the iterator to perform data structure manipulation
  • The Iterator provides manipulation by the remove() method. However in this case you would like to insert and not remove.
  • The other solution is to use ConcurrentHashMap .
  • blog
  • Use a synchronized block within your code.
However in my code I went ahead with ConcurrentHashMap and it worked fine. If time permits I would like to make this a multi threaded program. May become a topic for my later posts.

Friday, March 9, 2012

Journey with python

Most parts of my programming experience have been in C and Java. I have written a fair amount of code mostly in Java for my daily bread winning purposes. I haven't really worked on a scripting language before. I did get my hands dirty with Perl for parsing through huge sized test logs. However the experience was primarily Regular Expression 101.

I recently bought the book python programming and have gotten my hands dirty. I am especially thrilled to work on the examples and see how python will help launch my web development skills.

I will keep posting as and when I have something cool to show.

Wednesday, February 15, 2012

Trying out new things

A long time dream just materialized, yesterday. I have my very own home-office with a three monitor setup with three gorgeous machines at my disposal.
To get started I first installed synergy and setup a single keyboard and mouse for multiple laptops. Will be updating this blog as and when something cool materializes.

Sign off...