Monday, December 7, 2009

Backup

Do you remember that song

Yesterday,
All those backups seemed a waste of pay.
Now my database has gone away.
Oh I believe in yesterday.

...

Recently I've decided it's high time I set up a decent backup for my growing collection of photos, videos and of course my projects.

So I got a nifty Samsung S2 USB HDD.
As most external 2.5" drives, it is powered by the USB, so I have only one cable plug in.
Although it came with backup software, it didn't quite meet my expectations.
I was looking for a simple yet efficient solution. Then robocopy came into my mind. I knew it was the heavy-lifting tool for moving files around in Windows environment. Then I was pleasantly surprised it has become a standard Windows tool since Vista. Then it turned out /MIR option does exactly what I need - mirror a directory tree.
In couple of minutes I came up with a simple .bat file that replicates a set of directories. It looks something like this (triple percent sign is no typo)

SET TARGET=F:\BACKUP
FOR /F "eol=#" %%I IN (backup.lst) DO robocopy %%I %TARGET%%%~pnI /mir


Here backup.lst contains a list of directories to backup, e.g.
#  Backup list
D:\Photos
D:\projects
D:\Video


These are replicated to

F:\BACKUP\Photos
F:\BACKUP\projects
F:\BACKUP\Video

respectively

First run does take some time to copy about 100G at ~20M/s. But after that it's quite fast as it copies only what has changed. Using external HDD for backup allows to go without compression which improves performance and also the backup can be readily used if necessary.

Now my important data feels safer.

Friday, November 27, 2009

Liberate your code

Do you still read your portable Java code in proprietary Microsoft fonts?
If so, you can consider liberating it from corporate license chains.

Some time ago the folks at Red Hat decided to create free equivalents for popular Microsoft fonts.
The result was Liberation fonts.You can download them for free from here. For Windows you would need the ttf flavor.
Once you install the new fonts, you can start using them in Eclipse.
Open Window > Preferences. In the dialog navigate to General > Appearance > Colors and Fonts. On the right expand Basic, select Text Font and change it to Liberation Mono.


Liberation Mono is the equivalent of Courier New® but looks cleaner and is more condensed vertically so more code will fit on your screen.
Here is a sample


Enjoy!

Thursday, November 19, 2009

Yet another fast Java decompiler

Today a colleague of mine pointed me to a really nice piece of software JD Java Decompiler.
Besides .class files it also opens .jar files and here is where it shines. All known types are hyperlink-ed so you can quickly jump between classes in the same .jar. You have Open Type, Java Search, Type Hierarchy, etc. - it's a mini Eclipse.
Speaking of Eclipse, JD also provides a plug-in for the ubiquitous Java IDE.

Did I mention it's very fast? That's because it is powered by native C++ ;). (Don't worry Linux version is also available.)

And it's also free. Still you are encouraged to support the author if you find it useful.

My .jar's have been associated with WinRar for years - time for a change.

Saturday, November 7, 2009

Serving images and other resources with wicket

It took me couple of days and mailing list posts to figure out how to display images with wicket in a satisfactory way.
In my case images are stored in JCR but this could be any other repository like db or file system where arbitrary images could be added or removed over time.
I also want that images have stable (bookmarkable) URLs, which makes them suitable for indexing by web crawlers and caching by web browsers.
I first checked the wicket "bible" Wicket in Action but this use case is not treated there.

Finally it turned out wicket does provide a way to do it in simple Java - shared resource with parameters.

Define a class to serve images
Create a class e.g. Images extending WebResource. Essentially this class has to implement the method getResourceStream(), which should return an IResourceStream implementation. (IResourceStream provides the actual data stream in terms of InputStream, data size, content type, etc.) The important thing here is that Images class can call inherited method getParameters() to get the query parameters (as ValueMap) from the URL. These parameters can be used to identify the specific image to be streamed. Something like this
    String imageId = getParameters().getString("id");

Bind the image serving class
The Images class created above can be bound to a specific URL, so whenever this URL is requested, the bound object is used to stream the response. This is done in the application init() method.
    getSharedResources().add("images", new Images());
This would produce image URLs like resources/org.apache.wicket.Application/images. To shorten the URLs to resources/global/images, add this again in init() method
    getSharedResources().putClassAlias(
        org.apache.wicket.Application.class, "global");

Display an image
Finally, use this to put an image on a page
    new Image("image", new ResourceReference("images"), 
        new ValueMap("id=" + imageId))
This will result in image URL like resources/global/images?id=image105

Of course this mechanism could be used for any kind of resource (e.g. PDF documents). It is only a matter of Content-Type.

Friday, October 16, 2009

Ignoring Perforce keywords when comparing revisions with Araxis Merge

In Araxis select View > Options
Select All Comparisons > Expressions and double-click an empty item to create new expression.


Type some description and paste this in Expression:
\$(Id|Header|Date|DateTime|Change|File|Revision|Author)(: .*)?\$

Select the check-box next to your new expression.


You may need to refresh the comparison results after this change. But it is persisted so you have to do it only once.
This can save lots of effort if you compare many files and most of the differences are in Perforce generated keywords.
BTW Perforce keywords are documented here - Using RCS Keywords

Enjoy!

Monday, October 12, 2009

wicket on java2days

Last week I enjoyed a wicket presentation from Andrew Lombardi on java2days. Not that I learned anything new about wicket, but it was lots of fun watching Andrew mock other web frameworks especially GWT and JSF which were presented by other speakers. This guy loves rakia...
I think he became the favorite of the audience and managed to sparkle interest in wicket while most of the people there have not heard of it before. Soon I saw the wicket page on number of laptops.

Searching for Andrew's contribution to wicket I found his refcard #63 on DZone.