Showing posts with label tools. Show all posts
Showing posts with label tools. Show all posts

2010-08-15

XML Zen 0.2

After a long break a new version of XML Zen was finally released. It has several bug fixes along with some new features. The changelog:

Changes in version 0.2.0 (2010-08-15)

  • Fixed a bug which prevented getting attribute values in some cases (Issue #11)
  • Added a possibility to set some defaults for XmlBuilder (Issue #10)
  • Added XmlBuilderOutput interface with String and OutputStream implementations (Issue #8)
  • XmlBuilder builds formatted XML with declaration (if charset is provided) (Issue #9)
  • File support in XmlBuilder (through XmlBuilderStreamOutput) and XmlSlicer (Issue #7)
I would like to thank JetBrains for IntelliJ IDEA license which was issued for this project. I’m trying to switch from Eclipse to IDEA, and so far I feel quite excited about it.

2009-11-15

Making Windows a better place to be

Many developers including me are forced to use Windows at work due to various corporate reasons even when our work has nothing to do with Microsoft technologies. And we are all stuck with that terrible Command Prompt or a Power Shell which are crap compared to a proper terminal. However, there is a way to have a fully functional Unix terminal in Windows thanks to Cygwin and a patched version of Putty

I am doing this for several years and this is one of the first things I do in any Windows machine that I want to do some software development on, so it's time to come up with a little tutorial.

Setting up Cygwin and PuttyCyg

Getting Cygwin

Go to http://www.cygwin.com to download and run the setup.exe. Installation process is illustrated in screenshots below.
 


I suggest you installing cygwin directly to C:\cygwin as it's recommended. It's a significant part of your system and it is really worth the place in C:\ directly.



Cygwin offers "C:\Windows\System32" as a place for local packages, however I don't like that idea and keep it all under "C:\cygwin".


Some mirrors were failing for me with missing packages so I choose a respectable source and deal with slower download speed in exchange for reliability.



Choosing packages may take a while. You can go with default selection, however going through the long list is worth a while if you want to have goodies like vim, curl, ping, openssh, mc and so on.


Now go make yourself some coffee.


Don't add any icons or shortcuts because they open cygwin in that ugly command prompt we are about to get rid of.


Introducing Cygwin to your Windows

Now that you have the Cygwin, try it out by launching C:\cygwin\cygwin.bat. You will see something like this.


As you can see, a few files can be modified to configure your environment. Keep them in mind for future:
  • ~/.bashrc
  • ~/.bash_profile
  • ~/.inputrc

Now append these to the beginning of your Windows PATH environmental variable:

C:\cygwin\usr\local\bin;C:\cygwin\usr\bin;C:\cygwin\bin;



Run a fresh Command Prompt (if you are using Launchy or a similar program to run the cmd.exe, you have to restart it before the new PATH applies to programs you run.) and you will be able to do the following:


That's just a small benefit you get from cygwin, but it's handy to have unix commands anywhere in the system. If you think that cmd.exe is enough to enjoy unix commands, you are wrong. It fails to resize properly, it's hard to copy and paste. Compare using Putty with a remote machine to using Command Prompt on your local Windows box, It's like day and night.

Getting PuttyCyg

Get the latest puttycyg from http://code.google.com/p/puttycyg/. For the past year it's this one: http://puttycyg.googlecode.com/files/puttycyg-20090811.zip. You can put it in c:\cygwin\puttycyg to avoid a mixup with the original Putty if you use it.

Configuring PuttyCyg to access local cygwin

Create a shortcut to putty.exe from the puttycyg pack that you just extracted.


Run it to configure the local connection. Check "Cygterm" in Connection type and enter a minus (-) in Command.


Be sure to go to Window configuration and set Lines of scrollback to something more reasonable than the default 200.


Save the settings. Name the session "localhost".


Now click "Open" to test the configuration. You should see a working terminal.


You can now enhance the shortcut you created earlier to load the "localhost" session automatically. Just append "-load localhost" to the end of Target.


You're all set. A few resources to get you familiar with Cygwin:

2009-09-29

XML processing in Java

One of the things that most Java developers tackle on daily basis is dealing with XML. Despite the fact that XML is taking lots of criticism and new formats like YAML are emerging and becoming more popular, you cannot avoid XML it's too widespread and used everywhere. It's the main format for interchanging data across systems and even people. There is a great deal of fat books that show how to use various XML APIs and libraries to handle the beast with all it's standards and extensions. There are many solid tools that had been continuously developed for years by large communities (Xalan, Xerces, JDOM, DOM4J).

And still XML processing in Java is still a major pain in the ass.
I see two reasons for that: 
  1. XML is too bloated as a format. See the picture below (click to enlarge):
  2. Java libraries that deal with XML are bloated. It's natural because they simply try to implement the specifications

Let's say you have a Java application which receives some data in form of simple XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <entry id="1">entry number one</entry>
<entry id="2">entry number two</entry>
</data>
Your application has this class:

public class Entry {
private int id;
private String content;
//the usual setters and getters here
}
If you would want to parse this XML with Java, into Entry objects you would usually do something like this:

try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("data.xml"));
NodeList nl = doc.getElementsByTagName("entry");
for (int i = 0; i < nl.getLength(); i++) {
Entry entry = new Entry();
entry.setId(Integer.parseInt(nl.item(i).getAttributes()
.getNamedItem("id").getNodeValue()));
entry.setContent(nl.item(i).getTextContent());
System.out.println(entry);
//do real stuff
}
}
catch (final Exception e) {
System.out.println("Failed parsing: " + e);
//do real handling
}
Expected output:

Entry:{id: 1; content: entry number one}
Entry:{id: 2; content: entry number two}
In Java 6 DocumentBuilderFactory.newInstance() will usually return an instance of this implementation: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 
This is Xerces embedded into the JRE. What's wrong with that? First, it's a huge library with big memory footprint. It will be outdated in comparison with what you can get at the official homepage, so if you want to go for the latest version with all the bug fixes, you will have to add another megabyte of jars to your project, set a system property (javax.xml.parsers.DocumentBuilderFactory) to change the default implementation and hope your code works. Then you have to know DOM. You have to use an ugly for loop to iterate the results instead of doing it right (for (Node n : doc.getElementsByTagName("entry") { ... }).
Even though Java aims to be loosely coupled, you can use the API and switch implementations, you should keep in mind that API changes over time, and implementations work differently. I have seen legacy code where you can find sick things like DocumentBuilderFactoryImpl = (DocumentBuilderFactoryImpl) DocumentBuilderFactory.newInstance();, I have seen Axis failing to parse complex SOAP messages after switching to different, newer JDK, I have seen third party software vendors who start cursing when you change your web service implementation and your WSDL is generated with minor cosmetic differences (i.e.: xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" instead of previous version: xmlns:s="http://schemas.xmlsoap.org/wsdl/soap/"). In all these cases APIs and implementations failed to do what they were meant for. Of course, everything can be fixed, but it takes time and nerves, and these things are precious.
XML processing in Java is terrible, and the worst part is when you have to go through all this just to parse a simple piece of data. Why couldn't it be as simple as that:

for (XmlSlicer piece : XmlSlicer.cut(data).getTags("entry")) {
//each piece is: <entry id="...">...</entry>
Entry entry = new Entry();
entry.setId(Integer.parseInt(piece.getTagAttribute("entry", "id")));
entry.setContent(piece.get("entry").toString());
System.out.println(entry);   
//do real stuff
}
After being fed up with Java's great XML APIs and libraries I made a small tool for simple daily work with XML files.
The code above would work in XML Zen - a small and lightweight XML processing library that supports ~1% of what other XML processing libraries can do, however this 1% of functionality is what you use 90% of the time. There are no big APIs, just simple logic driven object oriented processing of XML strings. And it's just a little over 10Kb.
You can add XML Zen dependency with Maven, just set the dev.java.net repo first:

<repositories>
<repository>
  <id>maven2-repository.dev.java.net</id>
  <name>Java.net Repository for Maven</name>
  <url>http://download.java.net/maven/2</url>
  </repository>
  <!-- other repositories -->
</repositories>
Then the dependency:

<dependency>
    <groupId>com.googlecode.xmlzen<groupId>
    <artifactId>xmlzen</artifactId>
    <version>0.1.1</version>
</dependency>
That's it, you are ready to go. And when it comes to building XML and XML Zen is not enough for your needs, check out this great project: http://java.ociweb.com/mark/programming/WAX.html.

2009-06-17

A tool for unpacking multiple archives and other ramblings

I've always wondered why torrents are packed into multiple archives, sometimes even archives inside other archives. Anyway, I've got fed up with all the unpacking routines, especially after downloading several seasons of something that has each episode in an individual folder containing 20 rar or zip files. So, after one evening of coding this nightmare is now over.

Here is the screenshot of the stupidly named tool (click to visit project page):


It was also a good reason to try out new version of NetBeans. I still hate GUI builders, however for small "write and forget" kind of projects like Multi Unpacker it's a fairly good choice. However NetBeans is still slow and unresponsive in comparison with Eclipse.

So far Multi Unpacker is for Windows only, however it's a spare evening away from becoming cross-platform (and you are welcome to join the project). Too bad my MacBook broke down completely, so Macs will most probably not get any special treatment... This is also bad news for Hawkscope, unless someone is willing to donate me an old Mac? :)

2009-06-07

Cheatsheet: Unicode characters for buttons and GUI elements

Before drawing your own graphics for various GUI buttons, you could try finding a Unicode character that represents the thing you want to do. For instance, up/down arrows can be made with 25B2 (▲) and 25BC (▼).

Here are some pictures with Unicode characters that you can use to build GUIs. First a quick guide to using these:



Now, the cheatsheets:











These were captured from a tool named Korais.

You can download these images in a single PDF file: unicode.gui.cheatsheet.pdf

2009-04-27

Symbolic links in Windows

Surprisingly, all the good Windows features are hidden, undocumented and hard to find. It took me nearly a decade to accidentally find out that Windows has symbolic links. They are called NTFS Junction Points. However their support is limited to directory links, and the usage is a bit weird.

Oh, and you have to install Windows Resource Kit to get the functionality. You can download it from any of these locations:


The command you want is linkd. Let's take it for a spin.



The sandbox contains a directory named original with text.txt inside.

To create a symbolic link named symlinked that points to original, the command is linkd symlinked original. In POSIX it would be ln -s original symlinked.



When calling dir, symlinked shows as "junction". The other behavior is like a plain folder. In explorer you cannot tell the difference between the two.



To delete the symlink use rmdir, because del will attempt to remove the files from original directory.

2009-03-15

JAD Java Decompiler download mirror

As http://www.kpdus.com is no longer accessible, JAD Java Decompiler download is extremely hard to find. I've put up a mirror where you can get jad executable for Windows, Linux and Mac OS X: http://www.varaneckas.com/jad

Hope this helps those who are having a hard time finding a working JAD download.

2008-11-11

InputStreamChain

If you have several Java InputStreams that you want to queue up into a single InputStream object, you can use this:

package com.varaneckas;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;

/**
* {@link InputStream} implementation that allows chaining of various
* streams for seamless sequential reading
*
* @author Tomas Varaneckas <tomas.varaneckas@gmail.com>
*/
public class InputStreamChain extends InputStream {

/**
* Input stream chain
*/
private final LinkedList<InputStream> streams = new LinkedList<InputStream>();

/**
* Currently active stream
*/
private InputStream current;

/**
* Default constructor
*/
public InputStreamChain() {
//nothing to do
}

/**
* Constructor with an initial stream
*
* @param first Initial InputStream
*/
public InputStreamChain(final InputStream first) {
addInputStream(first);
}

/**
* Constructor with an array of initial streams
*
* @param streams Array of initial InputStreams
*/
public InputStreamChain(final InputStream[] streams) {
for (InputStream stream : streams) {
addInputStream(stream);
}
}

/**
* Vararg constructor
*
* @param streams initial input streams
*/
public InputStreamChain(final InputStream ... streams) {
for (InputStream stream : streams) {
addInputStream(stream);
}
}

/**
* Adds input stream to the end of chain
*
* @param stream InputStream to add to chain
* @return instance of self (for fluent calls)
*/
public InputStreamChain addInputStream(final InputStream stream) {
streams.addLast(stream);
if (current == null) {
current = streams.removeFirst();
}
return this;
}

@Override
public int read() throws IOException {
int bit = current.read();
if (bit == -1 && streams.size() > 0) {
try {
current.close();
} catch (final IOException e) {
//replace this with a call to logging facility
e.printStackTrace();
}
current = streams.removeFirst();
bit = read();
}
return bit;
}

@Override
public int available() throws IOException {
int available = current.available();
for (InputStream stream : streams) {
available += stream.available();
}
return available;
}

@Override
public void close() throws IOException {
current.close();
}

@Override
public boolean markSupported() {
return current.markSupported();
}

@Override
public synchronized void mark(int i) {
current.mark(i);
}

@Override
public synchronized void reset() throws IOException {
current.reset();
}

@Override
public long skip(long l) throws IOException {
return current.skip(l);
}

}


Example code:
InputStream chuck = new ByteArrayInputStream("Chuck ".getBytes());
InputStream norris = new ByteArrayInputStream("Norris".getBytes());
InputStream chuckNorris = new InputStreamChain()
.addInputStream(chuck)
.addInputStream(norris);
//will print "Chuck Norris"
System.out.println(new BufferedReader(
new InputStreamReader(chuckNorris)).readLine());


Have fun!

2008-07-16

What is Eclipse Mylyn anyway?

Since the release of Eclipse Europa, there was one new big feature - Mylyn. I was sceptic about it, besides it made the IDE slower, so I've kept removing it without getting to know what the hell is Mylyn anyway? After seeing this video I'm about to give it another try. If you're using Eclipse without Mylyn, you must see the video below:



Update
Mylin still sucks big time. Could not get used to it. It's most probably for people with ADD. Read the discussion in comments.

2008-07-02

CMS battle: Drupal vs Joomla vs Custom Programming

In modern Content Management System (CMS) world there are two major figures - Joomla (descendant of Mambo CMS ) and Drupal. They both are open source and have large comunities with enormous amounts of extensions and themes. It's hard to choose which one to use without trying them out. As usually, there are more options - home grown custom programming or even building your own CMS (which I was once stupid enough to do). Programming from scratch is always fun and beneficial for your skills, however, if you need things up and running in no time or you don't do (or don't want to do) any programming, using a CMS is the way to go.

If you are digging for CMS comparisons and trying to decide which one is best for you, here is a quick and dirty answer - go for Drupal, you won't regret it.

Why?

After test-driving them both I've came to these conclusions:

  • Joomla is bloated, Drupal is minimal
  • Drupal is easy to use and intuitive, Joomla is confusing

That was more than enough for a minimalist like me.

Here are some statistics from CMS Matrix for a more detailed comparison. It shows that Drupal is extremely modular and Joomla has a heavy core, thus a terrible architecture. That means Joomla is hard to extend and messy under the hood. Drupal, on the other hand, looks beautiful.


Product Drupal 6.2 Joomla! 1.5.3
Last Updated 4/10/2008 5/31/2008
System Requirements Drupal Joomla!
Application Server PHP 4.3.5+
Approximate Cost Free Free
Database MySQL, Postgres MySQL
License GNU GPL GNU/GPL v2
Operating System Any Any
Programming Language PHP PHP
Root Access No No
Shell Access No No
Web Server Apache, IIS Apache
Security Drupal Joomla!
Audit Trail Yes No
Captcha Free Add On Free Add On
Content Approval Yes Yes
Yes Yes
Granular Privileges Yes No
Kerberos Authentication No No
LDAP Authentication Free Add On Yes
Yes Yes
NIS Authentication No No
NTLM Authentication Free Add On No
Pluggable Authentication Yes Yes
Problem Notification No No
Sandbox No No
Session Management Yes Yes
SMB Authentication No No
SSL Compatible Yes Yes
SSL Logins No Yes
SSL Pages No Yes
Versioning Yes No
Support Drupal Joomla!
Certification Program No No
Code Skeletons Yes No
Commercial Manuals Yes Yes
Commercial Support Yes Yes
Commercial Training Yes Yes
Developer Community Yes Yes
Online Help Yes Yes
Pluggable API Yes Yes
Professional Hosting Yes Yes
Professional Services Yes Yes
Public Forum Yes Yes
Public Mailing List Yes No
Test Framework Free Add On Yes
Third-Party Developers Yes Yes
Users Conference Yes Yes
Ease of Use Drupal Joomla!
Drag-N-Drop Content Free Add On No
Free Add On Free Add On
Friendly URLs Yes Yes
Image Resizing Free Add On Yes
Macro Language Free Add On Yes
Mass Upload Free Add On No
Prototyping Limited Yes
Server Page Language Yes Yes
Site Setup Wizard Limited No
Spell Checker Free Add On No
Style Wizard Limited No
Subscriptions Free Add On No
Template Language Limited Yes
UI Levels No Yes
Undo Limited No
WYSIWYG Editor Free Add On Yes
Zip Archives No No
Performance Drupal Joomla!
Advanced Caching Yes Yes
Database Replication Limited No
Load Balancing Yes Yes
Page Caching Yes Yes
Static Content Export No No
Management Drupal Joomla!
Advertising Management Free Add On Yes
Asset Management Yes Yes
Clipboard No No
Content Scheduling Free Add On Yes
Content Staging Free Add On No
Inline Administration Yes Yes
Online Administration Yes Yes
Package Deployment No No
Sub-sites / Roots Yes Yes
Themes / Skins Yes Yes
Trash No Yes
Web Statistics Yes Yes
Web-based Style/Template Management Yes Yes
Web-based Translation Management Yes Free Add On
Workflow Engine Limited No
Interoperability Drupal Joomla!
Content Syndication (RSS) Yes Yes
FTP Support Limited Yes
iCal Free Add On No
UTF-8 Support Yes Yes
WAI Compliant Limited No
WebDAV Support No No
XHTML Compliant Yes No
Flexibility Drupal Joomla!
CGI-mode Support Yes Yes
Content Reuse Limited Yes
Extensible User Profiles Yes Yes
Interface Localization Yes Yes
Yes Yes
Multi-lingual Content Yes Free Add On
Multi-lingual Content Integration Free Add On Free Add On
Multi-Site Deployment Yes Free Add On
URL Rewriting Yes Yes
Built-in Applications Drupal Joomla!
Blog Yes Yes
Chat Free Add On Free Add On
Classifieds Free Add On Free Add On
Contact Management Free Add On Yes
Data Entry Free Add On Free Add On
Database Reports No Free Add On
Discussion / Forum Yes Free Add On
Document Management Limited Free Add On
Events Calendar Free Add On Free Add On
Events Management Free Add On Free Add On
Expense Reports No Free Add On
FAQ Management Yes Yes
File Distribution Free Add On Free Add On
Graphs and Charts No Free Add On
Groupware Free Add On Free Add On
Guest Book Free Add On Free Add On
Help Desk / Bug Reporting Free Add On Free Add On
HTTP Proxy No No
In/Out Board No No
Job Postings Free Add On Free Add On
Free Add On Yes
Mail Form Free Add On Yes
Matrix No No
My Page / Dashboard Free Add On No
Free Add On Free Add On
Free Add On Free Add On
Polls Yes Yes
Product Management Free Add On Yes
Project Tracking Free Add On Free Add On
Search Engine Yes Yes
Site Map Free Add On Free Add On
Stock Quotes Free Add On No
Surveys Free Add On Free Add On
Syndicated Content (RSS) Yes Yes
Tests / Quizzes Free Add On Free Add On
Time Tracking Free Add On No
User Contributions Yes Yes
Weather Free Add On No
Web Services Front End Limited Yes
Wiki Free Add On Free Add On
Commerce Drupal Joomla!
Affiliate Tracking Free Add On Free Add On
Inventory Management Free Add On Free Add On
Pluggable Payments Free Add On Free Add On
Pluggable Shipping Free Add On Free Add On
Pluggable Tax Free Add On Free Add On
Point of Sale No Free Add On
Shopping Cart Free Add On Free Add On
Subscriptions Free Add On Free Add On
Wish Lists Free Add On Free Add On

Hope this helps to make a choice.