Monday, August 23, 2010

Sling

Have been checking Sling recently. Basically yet another Java web framework, but this one has a rather interesting approach - it is content oriented. It is based on OSGi, JCR, REST, server side scripting, etc. The recently popular principle convention over configuration is heavily used.
Found this brief intro to Sling.
Also this cheat sheet gives a condensed overview over the Sling way.

Although both projects Sling and Jackrabbit are hosted at Apache, they are led by a company called Day.
It is interesting that Roy T Fielding is a chief scientists at Day.

Sunday, August 15, 2010

Cyrillic in Wine

As windows is still much more popular than Linux there are some Windows applications that still do not have a Linux version. In these cases WineHQ comes to rescue. It allows installing and running Windows applications directly on Linux.
One such applications that I use is AceMoney Lite. But I encountered one problem - the application does not show properly text in Cyrillic like text in Bulgarian or Russian.
The solution that works for me is to set the LANG environment variable to Bulgarian.
After running the installation of a Windows application using Wine, it appears in Applications > Wine > Programs menu. So it can be launched just like an ordinary Linux application. So I opened the properties of AcemoneyLite launcher. The command there looked like this
env WINEPREFIX="/home/peter/.wine" wine "C:\Program Files\AceMoney\AceMoney.exe" 
I inserted LANG=bg_BG.UTF-8 before wine and now the cyrillic works just fine in AceMoney Lite.

I found the same trick works also for Picasa. The Linux version of Picasa actually bundles Wine and runs on it. So there prepend env LANG=bg_BG.UTF-8 to the command so it looks something like this
env LANG=bg_BG.UTF-8 /opt/google/picasa/3.0/bin/picasa

...

UPDATE 2 Feb 2012   
Recently this stopped working in Ubuntu 11.10.
After several attempts I found that if I use LC_ALL=bg_BG.UTF-8 instead of LANG=bg_BG.UTF-8, it works again.

Saturday, August 14, 2010

Ubuntu

Since Windows 7 beta started complaining that it expires I have been trying again Ubuntu (10.04 Lucid Lynx).
Although it has improved significantly still the user experience is not as smooth as in Windows.  For example such basic things as DVD playback and Flash do not work out of the box.

I will try to share my findings about Ubuntu.

For me one of the major new features in Windows Vista is the search box in the start menu. No need to navigate through menus to find some program or browse through directories to locate some document, just press the Win key and start typing the name. A similar thing exists in Linux - Deskbar-Applet. And its even more powerful and flexible. Deskbar supports many extensions (searches) which interpret the search string in different ways. For example it can do simple calculations, can search in Google, Wikipedia, dictionary and many other things.

This is the Linux way - initially hard to setup but afterwards it is very powerful.

Wednesday, March 17, 2010

7-Zip

The guys at Tom's Hardware have done some benchmarks of recent compression tools.
It turns out 7-Zip is most efficient in terms of compression speed and ratio.
It can also extract many other formats like RAR.
Considering that this tool is also free and open source you may seriously consider switching to it.

Saturday, March 6, 2010

Extracting MPEG2 streams from DVD-RAM

DVD-RAM
Using DVD-RAM discs with camcorders is quite convenient. Recording on this meadia is much more reliable. You can also edit your videos on the camera - delete, cut, join etc. The downside is incompatibility. Most DVD players do not play DVD-RAM discs. But recent PC optical drives do read them. So when I get the disc out of my camera and put it in my PC, it shows this file system


C:\temp>dir e:\DVD_RTAV
 Volume in drive E is DVD_CAMERA
 Volume Serial Number is 57DC-951A

 Directory of e:\DVD_RTAV

31.01.2010  16:42    <DIR>          .
31.01.2010  16:42    <DIR>          ..
03.03.2010  16:49            11 961 VR_MANGR.IFO
03.03.2010  16:49            11 961 VR_MANGR.BUP
03.03.2010  16:49       713 383 936 VR_MOVIE.VRO
               3 File(s)    713 408 142 bytes
               2 Dir(s)     688 580 608 bytes free

Actually it seems the video (and audio) is recorded in MPEG2, just like in ordinary DVD but it is packaged differently (probably to facilitate editing on the disc).

DVD-VR
Fortunately a nice guy Pádraig Brady wrote a simple open source tool dvd-vr that extracts MPEG2 streams from DVD-RAM. It is written for Linux but with cygwin it compiles to dvd-vr.exe. dvd-vr extracts each video clip into a separate .vob file. You can play these directly on your PC. If your media player does not recognize these files, you can rename them to .mpeg.
Having a separate file for each clip is very convenient. You can arrange them as you see fit, much like your photos.
You can also record selected clips on a regular DVD to share with your friends. You can do this with various tools like DVD Flick for example - another free and easy to use app.

Happy shooting!

Tuesday, February 23, 2010

Integrating Wicket and JCR


As requested I will describe briefly my take at integrating Wicket with JCR (Jackrabbit).
It is pretty straightforward.

Open/close JCR repository
My override of org.apache.wicket.protocol.http.WebApplication.init() looks up a javax.jcr.RepositoryFactory implementation via a java.util.ServiceLoader. Then I use this factory to open the repository. I store a reference to the repository in a field of my application class.
My override of producat.wicket.Application.onDestroy() closes the repository via org.apache.jackrabbit.api.JackrabbitRepository.shutdown().

Open/close JCR session
I try to keep a JCR session open only for the duration of a HTTP request.
To achieve this my application class overrides org.apache.wicket.protocol.http.WebApplication.newRequestCycle(Request, Response) to provide a custom request cycle implementation.

    @Override
    public RequestCycle newRequestCycle(Request request, Response response) {
        return new MyRequestCycle(this, (WebRequest) request, response);
    }

My implementation opens JCR session on demand and closes it at the end of the request cycle.
It looks similar to this class.

public class MyRequestCycle extends WebRequestCycle {

    private Session session;

    public MyRequestCycle(WebApplication application, WebRequest request,
            Response response) {
        super(application, request, response);
    }

    @Override
    protected void onEndRequest() {
        if (session != null) {
            session.logout();
            session = null;
        }
    }

    public Session getJcrSession() {
        if (session == null) {
            Repository repository = ((MyApplication) getApplication()).getRepository();
            session = repository.login();
        }
        return session;
    }

    public static MyRequestCycle get() {
        return (MyRequestCycle) RequestCycle.get();
    }
}

Then I use MyRequestCycle.get().getJcrSession() in my page classes to access the repository.
I save the session explicitly in every place where I make changes in the repository. Initially I thought of saving it automatically at the end of the session, but then it turned out to be difficult to handle decently save errors.

Data models and URLs
I try to avoid HTTP session as much as possible so I use BookmarkablePageLink's, passing the UUID of respective JCR node in PageParameters.
Since JCR nodes are not serializable, my models store only the node UUID and load it on demand via javax.jcr.Session.getNodeByIdentifier(String) - kind of LoadableDetachableModel.

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.