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();
}
}
});


Monday, November 09, 2009

stackoverflow clones

After the success of stackoverflow, many applications with similar concepts have emerged.
while some of the chinese sites have even used the same design, some of the web applications are geniune attempts to add value.
O'Reilly with its vast knowledge base of everything related computers is trying to take advantage of it with O'Reilly Answers concept.

What other sites do you see as a stackoverflow competitor?

Update here is once stackoverflow wanna be in Turkish
http://www.sonsuzdongu.net/

Wednesday, November 04, 2009

Distributed Processing

Processing log data and extracting valuable insight from it will not be straightforward. Fortunately there are a few pointers to help.

1- Commonj Work manager API
CommonJ is a BEA and IBM joint specification that provides a standard for executing concurrent tasks in a JEE environment. It has support for the Master/Worker pattern in its WorkManager API. It has open source implementations too.

2- Master-worker pattern can be easily distributed with Terracota infrastructure.

Tuesday, November 03, 2009

High Performance XML Processing

In my current project we will probably need hardware XML accelerator to process many millions of xml messages..
There is an ongoing EU project in which Cybersoft participates.
IBM can supply the hardware XML processor via DataPower

system.out.println

Note to myself:
You should never use System.out.println in production code.. See the synchronized block out there.


public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}