Thursday, February 25, 2010

Code Katas



A Code Kata is an exercise in writing code preferably in test driven way, which you do repeat periodically.

There are very good examples of them around the Internet


It generally takes 15 to 20 minutes to finish for the first time, after a few cycles duration goes down by almost by half .
Every time I repeat , I find new shortcuts in my development environment and a few things to do differently.

Here are some of my favorites.


I prefer Java but intend to write some of them in Scala Ruby and Groovy.

Wednesday, February 17, 2010

Virtual development environments


Using virtual machines to maintain development environments ( development ide to application server config) is becoming a common practice.
8-core cpus, 4+ gb rams and 64 bit operating systems allow running guest operating systems without a lot of performance penalties.

What should be in a baseline image?

  • Notepad alternative
  • Continuous integration server running unit tests of your project (e.g Hudson)
  • IDE (Eclipse or Netbeans) and plugins
  • Static code analyzers with customized ruleset of your team (integrated with IDE) e.g PMD, FindBugs
  • Application server (integrated with IDE) (Glassfish)
  • Database server with initial data loaded.
  • Load generator with sample scenarios (e.g Apache Jmeter)
  • Cache server (memcached)
  • Any other frameworks your project needs (e.g Grails)
  • SQL client (depends on your db)
  • Source control client (SVN or git client)


There are a lot of advantages
1- Common virtual machine image to get new members of team running up in short time.
2- No need to change settings between clients and projects

For virtualization, I prefer VirtualBox. Vmware is another alternative and so is Parallels in Mac OS X.

What other tools do you install as baseline for virtual systems?







Tuesday, February 16, 2010

Single responsibility principle

Single responsibility principle

Recently i needed to compile our all jasper-report files during application start-up.
I was modifying existing code-base to enable precompiling xml reports to binary .jreport files.

It was simple enough, traverse all *.jrxml files at a certain directory and use net.sf.jasperreports.engine.JasperCompileManager to do the actual compiling.

Here is how i traversed all files under a directory.

    private void visitAllFiles(File dir)  {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
visitAllFiles(new File(dir, children[i]));
}
} else {
//doSomething();
}
}


Here is what is wrong with this version.

The infrastructure logic to traverse the files and business logic to compile reports resides in same class.
If i needed traverse files for something else (for example to backup old compiled reports) i would need to duplicate infrastructure logic.
It seems this class is trying to do too many things. I separated this class to a reusable FileCrawler and FileVisitor.
 
public interface FileVisitor {
void visit(File fileToProcess) ;
}

FileCrawler takes a visitor and calls visit method for each file it encounters.

     
public FileCrawler(final File root, final FileVisitor visitor) {
this.visitor = visitor;
}

private void visitAllFiles(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
visitAllFiles(new File(dir, children[i]));
}
} else {
visitor.visit(dir);
}
}

Usage is as follows:

  new FileCrawler(new File(this.cacheFilePath), new ReportCompiler()).start();


ReportCompiler implements FileVisitor and looks like as follows:


public void visit(File fileToProcess)  {
String name = fileToProcess.getName();
if (name.endsWith(".jrxml")){
compileReport(fileToProcess.getParent(),name);
}
}

Now i can  use anonymous inner classes to create simple reusable directory traversing logic.

new FileCrawler (new File (root), new FileVisitor() {
public void visit(File fileToProcess) {
String name = fileToProcess.getName();
if (name.endsWith(".jreport")){
fileToProcess.delete();
}
}
});