Monday, November 15, 2010

Linux and a newborn.

Have you ever tired to put a newborn to sleep? It's tough. However it seems that linux can do it for you - actually it works pretty good for my son. Just turn the volume up and issue:

while true ; do cat /boot/vmlinuz-2.6.32-25-generic > /dev/dsp ; done

Good luck.

Sunday, September 26, 2010

C, Java, Erlang, Prolog, Haskell: naive banchmark

Here comes a naive benchmark for C, Java, Erlang, Prolog and Haskell. The benchmark is to compute Pythagorean triples. The triple consists of three positive integers a, b, and c, such that a*a + b*b = c*c and additionally a+b+c<=n, where n=500.

Haskell:

f :: Int -> [ (Int, Int, Int) ]
f n = [ (x, y, z) | 
    x <- [ 1 .. n ],
    y <- [ 1 .. n ],
    z <- [ 1 .. n ],
    x + y + z <= n,
    (x * x) + (y * y) == (z * z) ]
Prolog:
pytriangle(N,A,B,C):-
    between(1,N,A),
    between(1,N,B),
    between(1,N,C),
    A + B + C =< N ,
    A*A + B*B =:= C*C.
Erlang:
-module(test).
-export([pythag/1]).

pythag(N) ->
    [ {A,B,C} ||
        A <- lists:seq(1,N),
        B <- lists:seq(1,N),
        C <- lists:seq(1,N),
        A+B+C =< N,
        A*A+B*B =:= C*C
    ].
C:
int main(int argc,char *argv[]){
    int a,b,c,n;
    n=atoi(argv[1]);

    for (a=1; a<=n; a++) {
        for (b=1; b<=n; b++) {
            for (c=1; c<=n; c++) {
                if ((a+b+c <= n) && (a*a + b*b == c*c)){
                    printf("%d,%d,%d;",a,b,c);
                }
            }
        }
    }
    return 0;
}
Java:
public class triangles
{
    public static void main(String [] args)
    {
        int a,b,c,n;

        n=Integer.parseInt(args[0]);
        for (a=1; a<=n; a++) {
            for (b=1; b<=n; b++) {
                for (c=1; c<=n; c++) {
                    if ((a+b+c <= n) && (a*a + b*b == c*c)){
                        System.out.printf("%d,%d,%d;",a,b,c);
                    }
                }
            }
        }
    }
}

Here comes the results (in seconds).

Haskell (GHCi, version 6.12.1): 380
Haskell compiled (GHCi, version 6.12.1): 32
Prolog (SWI Prolog 5.7.4): 197.2
Erlang (R13B03): 59.5
Erlang HiPE (High Performance Erlang), native: 13.2
C (gcc 4.4.3): 0.8
Java (IcedTea6 1.8.1): 2.2 (with output redirected to /dev/null: 1.3)

The winner was obvious from the begining. But it's quite interesting how the declarative languages perform... hmmm. Kudos to Erlang.

By the way, have you noticed that the code is far better readable with the declarative approach?

Sunday, September 5, 2010

Command line might: useful aliases; BASH tips

I'm a command-line-guy I guess. I use a terminal quite often (mostly with BASH), either for file management, or while working on my projects, just to launch proper application, and optionally to make it read some contents from a given file.

I found myself using quite often two particular functions:
  1. searching for a file which name contains a keyword, and
  2. figuring out what files I recently modified in the current directory.
These two functions can be easily written down as:

ls -l | grep -i some_keyword
ls -lt | head

Right, but since I use them quite often and being rather lazy I wouldn't want to type these every time... So here come aliases.
You can define an alias for a command you often type and use it instead.  So I decided to define two aliases: lsg and lst for searching for a file name containing a keyword and displaying the recently modified files respectively.

So if you type at your command prompt:

alias lsg='ls -l | grep -i'
alias lst='ls -lt | head'

From now one you can use lsg and lst freely.

If you want to make the change permanent you could add the above lines to your ~/.bashrc file, so the aliases would be accessible any time you log in.

Oh one more thing... how to use it.
If I want to find out what files I modified recently in the current directory I just type:

$ lst

and it gives me a list of recntly modified files. If I'm looking for a file which name contains a keyword "book" I issue:

$ lsg book

And I get a list of files which names contain "book" (case insensitive). It's quite useful - at least for me.

PS. Dont forget about: cd -
It will bring you up to the directory you were previously in.


Monday, August 30, 2010

Home DVD, non interlaced

This nice tiny DVD camera of mine captures footage which turns to be interlaced... While it is nice while watching on a TV, it turns to be at least annoying to watch on a computer. There are some so called comb (or mouse teeth) artifacts which annoy a lot. Of course many video players can deinterlace video on-the-fly however it turns that they do that with very different results especially concerning overall video quality.

So I poked around and it seems that one of the nicest deintralcers available is compiled into MPlayer. It is called yadif. So it's really easy to use. I fidlled with some settings for a while and ended up with a command as follows:

mencoder source.mpg -of mpeg -mpegopts tsaf:format=mpeg2:muxrate=30000 -noskip -vf yadif -o dest.mpg -oac copy -ovc lavc -lavcopts vcodec=mpeg2video:mbd=1:aspect=16/9:vbitrate=9100

It turns a file called source.mpg into a nice deinterlaced dest.mpg.

Monday, June 7, 2010

Printing and Acrobat Reader

Have you ever had problems with printing a PDF document with the Adobe Acrobat Reader? Have you seen a non-informative message:"The document could not be printed"?
I have... and it was surprising, frustrating and... well you know how it is.... especially when the printout is due yesterday...
I stumbled upon this issue when I was to print some stuff in a print shop. I made a PDF went to the shop and ordered a color laser printout (70 pages). I was quite surprised when the guy behind the counter, told me that there is no way to print this document, since Adobe Acrobat displayed that wierd message. Surprisingly nobody at the shop knew what the message ment. I went back to my computer (yes, yes, yes, a desktop...) took a look, and everything was fine I could see it and print it... mind that I use mainly Evince or xpdf for PDFs. Desperatelly I converted the document into Postscript and back to PDF (glorious pdftops and ps2pdf) and took it back to the print shop. Surprisingly they could print it now - without any complains from the Acrobat.

I made some reasearch to make sure that such an event won't take place again. And it turns out that guys at Adobe don't know what they are doing (and they don't care for their customers either) and guys at the print shop have no idea how to handle the Acrobat. There is a web forum I stumbled upon, which deals with this issue, especially one message. It turns out that the printing problem appears for some PDF files - however it's hard to tell what exactly causes it.

Anyway, if you ecaountered this issue take a look at the top, right corner of the print dialog window. If you see an option like below (Comments and Forms: Document and Markups) the Acrobat presumably won't print your file.
Just change it to Document, and you should be allowed to print your stuff (see below)!
Bottom line. Adobe is worse and worse. The Acrobat is bloated. Users dont't know how to use it. Solution? Don't use it! There is plenty of other PDF browsers avaliable: evince, xpdf... Long live the free software!!!

Tuesday, March 2, 2010

Pausing music when switching users in Ubuntu (Karmic and Lucid)

If you want to have a user, which currently uses the display, to have access to the sound device with all the benefits from pausing upon user switch, you need to uncheck 'Use audio devices' privileges for this user (System->User Settings->Advanced->User Priviledges).

As a matter of fact I unchecked it for all my users. These privileges are very confusing then. I guess their proper interpretation is that if:
- checked: the user locks the audio device as long as he wants, no sound switching upon user switching,
- unchecked: the user which currently uses the display has access to the audio device, sound switching takes place upon user switching.

The problem is more general and it regards permissions to access certain devices (and files in /dev directory). Historically if a user needs access to particular device he is assigned to a group which group-owns the device file. It has worked for ages in the unix world i.e. access to an audio device, cdrom, cd burner etc.

This group based approach has several well known limitations. Now it seems that such an access is controlled by consolekit/policykit/udev, which makes some sense, at least because of the dynamic nature of /dev directory. The gnome-system-tools and especially users-admin seem not to know anything about acl. I'm not sure whether it's good or bad - it depends, espoecially that gnome is cross platform - on other systems /dev might be static or there might be no acl at all.

See  https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/433654 for more details.
And some discussion here: http://ubuntuforums.org/showthread.php?t=1420051

Mind that the sound switching worked fine in previous Ubuntu release (Jaunty).

Thursday, January 21, 2010

Medion X10 remote and Linux

I've recently bought a remote for my PC. I thought it would be quite convenient to have one especially that it could be quite handy during watching DVDs.

I picked an inexpensive, radio operated, USB Medion X10 - around $10.

After plugging the USB dongle it turned out that the remote becomes a HID - dobling the keyboard. It was nice but not exactly what I needed. I want to have a remote control for my multimedia pplications - not to control the computer.

So here comes the magic word LIRC: Linux InfraRed Control.  It's a little bit misleading since the remote has nothing to do with InfraRed, but LIRC is actually an infrastructure which allows to control applications with remote controls. So I installed lirc:
apt-get install lirc
Upon configuration I selected ATI/NVidia/X10 RF Remote, and voila... the remote stopped working as a HID. Now I need to comeup with proper configurations for my multimedia applications. Here comes a complete config file /etc/lirc/lircrc I came up with:

begin
    remote = Medion_MD8800
    prog = xine
    button = DVD_Menu
    config = RootMenu
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Up
    config = EventUp
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Down
    config = EventDown
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Left
    config = EventLeft
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Right
    config = EventRight
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Vol_Up
    config = Volume+
    repeat = 1
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Vol_Down
    config = Volume-
    repeat = 1
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = OK
    config = EventSelect
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Mute
    config = Mute
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Info
    config = OSDStreamInfos
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Rewind
    config = SeekRelative-15
    repeat = 1
    delay = 5
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Play
    config = Play
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Forward
    config = SeekRelative+15
    repeat = 1
    delay = 5
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Pause
    config = Pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Power
    config = Quit
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = xine
    button = Stop
    config = Stop
    repeat = 0
    delay = 0
end

begin
    prog = Rhythmbox
    remote = *
    button = Play
    repeat = 1
    config = play
end

begin
    prog = Rhythmbox
    remote = *
    button = Pause
    repeat = 0
    config = pause
end

begin
    prog = Rhythmbox
    remote = *
    button = KEY_PLAYPAUSE
    repeat = 1
    config = playpause
end

begin
    prog = Rhythmbox
    remote = *
    button = Stop
    repeat = 1
    config = stop
end


begin
    prog = Rhythmbox
    remote = *
    button = Next
    repeat = 0
    config = next
end

begin
    prog = Rhythmbox
    remote = *
    button = Prev
    repeat = 0
    config = previous
end

begin
    prog = Rhythmbox
    remote = *
    button = Rewind
    repeat = 1
    delay = 5
    config = seek_backward
end

begin
    prog = Rhythmbox
    remote = *
    button = Vol_Up
    repeat = 5
    config = volume_up
end

begin
    prog = Rhythmbox
    remote = *
    button = Vol_Down
    repeat = 5
    config = volume_down
end

begin
    prog = Rhythmbox
    remote = *
    button = Power
    repeat = 1
    config = quit
end

begin
    remote = Medion_MD8800
    prog = totem
    button = DVD_Menu
    config = play_dvd
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Power
    config = quit
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Up
    config = up
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Down
    config = down
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Left
    config = left
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Right
    config = right
    repeat = 0
    delay = 0
end

begin
        prog = totem
        remote = Medion_MD8800
        button = OK
        repeat = 1
        config = select
end

begin
        prog = totem
        remote = Medion_MD8800
        button = DVD_Menu
        repeat = 0
        config = menu
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Vol_Up
    config = volume_up
    repeat = 5
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Vol_Down
    config = volume_down
    repeat = 5
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Mute
    config = mute
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Back
    config = quit
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Info
    config = show_playing
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Rewind
    config = seek_backward
    repeat = 1
    delay = 5
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Play
    config = play_pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Forward
    config = seek_forward
    repeat = 1
    delay = 5
end

begin
    remote = Medion_MD8800
    prog = totem
    button = Pause
    config = pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Power
    config = quit
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Up
    config = seek +60 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Down
    config = seek -60 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Left
    config = seek -6 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Right
    config = seek +6 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Vol_Up
    config = volume +1
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Vol_Down
    config = volume -1
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = OK
    config = pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Mute
    config = mute
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Rewind
    config = seek -30 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Play
    config = pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Forward
    config = seek +30 0
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Pause
    config = pause
    repeat = 0
    delay = 0
end

begin
    remote = Medion_MD8800
    prog = mplayer
    button = Stop
    config = quit
    repeat = 0
    delay = 0
end

Mind that it enables remote control for xine, rythmbox, totem and mplayer (rythmobox, and totem must have the lirc support enabled to work, see Edit/Plugins). Enjoy.

Making a nice home video DVD

Video source: a Sony handycam (DCR-SR36) which produces mpeg/2 files.

Anticipated result: a nice DVD with rich menus.

How to do it?

First, I don't want to recode the movie clips, since it would degrade their quality. So I decided to use the mpegs straight from the video camera. If there is a need to clip such a video there is a nice tool to do that: avidemux.

There is also another nice tool for DVD authoring: DVDStyler - you can create a DVD menu interactively, add/rearrange clips etc. However it seems that it takes a great deal of time to come up with nice designs.

So I stumbled upon tovid. It's a bunch of scripts which allow to author a DVD in a non-interactive way, just generating appropriate menus, thumbnails etc. And here comes a bummer.... It turned out that there the mpegs from the videocam are not 100% compatible with the DVD format, and they require ... well not recoding but remuxing (remultiplexing). In order to do that I use a buch of commands:
ffmpeg -i $1 -vcodec copy -an -f rawvideo foo.mpv
ffmpeg -i $1 -vn -acodec copy -f mp2 foo.mp2
mplex -f 8 -o $2 foo.mpv foo.mp2
rm foo.mpv foo.mp2
Actually its a script, its good to save the above contents as an executable file, let's say: mpgfix, and then run it:
mpgfix file.mpg file-fixed.mpg
So file.mpg is remuxed and saved as file-fixed.mpg. You can save the file with the same name of course, then the original one will be replaced with the remuxed one. Mind that there is no quality loss here, no recoding.

And here comes the nice part DVD authoring, I just launch one of the tovid scripts (todisc):
todisc -loop 0 -chain-videos -menu-length 2 -thumb-shape normal -aspect 16:9 -menu-title "My DVD" -pal -files *.mpg -titles *.mpg -out DVD
And after a while in the DVD directory there is a complete authored DVD :) with nice animated menus. You can generate an ISO image out of it:
mksiofs -dvd-video -o dvd.iso DVD/
And you'll get a file dvd.iso which is a complete ISO image ready to burn. Enjoy.