12. 03. 2010.

Perl TR-069 ACS server to manage CPE devices

After two years of hibernation, my efforts at implementing simple TR-069 server in perl is alive again. General motivation was to try out few new ADSL modems from ZTE with my server. And it wasn't easy...

General idea of my server is to do implementation which is easy to try and hopefully works with all quirks in existing implementations. And there are A LOT of quirks.

CWMP is basically a sick idea of twisting SOAP into something which will provide persistent connection to client which can be used to introspect device options and set them up. Back in 2007 when I started implementation, current version of TR-069 was 1.0. In meantime, DSL forum (which changed it's name to Broadband forum) decided to push out new TR-069 version 1.1, which I still haven't seen on any devices.

I have anticipated different implementations, so in first round of implementation I decided to parse XML using XML::Rules. This allowed me to use DSL-like language to implement extraction of interesting element from XML responses sent by CPE devices (CPEs are ADSL devices sitting in our homes). And that worked fairly well (at least it was tested with Thompson and Zyxel devices). Until, I got hold of ZTE device that is. It decided to return binary date inside one of XML tags (without CDATA around it) making XML::Parser on which XML::Rules depend bark.

So, I had to change XML parser. I opted for XML::Bare which doesn't have problems with invalid XML, but I had to implement rules part on my own. Which wasn't huge problem because I used only subset of functionality.

But then I tried to setup some data using SetParameterValues. And noticed that it doesn't work. This was strange, and after a two days of trials and errors I found out that ZTE devices require ParameterKey field in XML. Strange thing is that this parameter is defined as optional in TR-069 specification, and it isn't really used: it's enough to have just empty tag in generated XML to make ZTE device happy.

This is not only protocol violation which I found. Specification clearly defined that SOAPAction header is mandatory in all requests, but, ZTE decided not to send it at all. After all this you might wonder why would I like to put so much effort in implementing semi-defined protocol which is really useful only to IPSs. My initial motivation was to provide first free implementation of TR-069, but nowadays there are few TR-069 alternatives: OpenACS is probably best known, but it requires Java, JBOSS and MySQL just to get started.

And I didn't really care about user interface at all. I wanted to be able to write a small snippet of perl code which would allow easy customization of CPE configuration without going through user interface.

To do that, I decided to implement on-disk queue using IPC::DirQueue in which specific commands for clients are inserted and then sent one-by-one until queue for this client is empty. In current version all CPE parameters are first introspected (getting current values and writable status) and stored in simple YAML file on disk, allowing easy review or import into another system.

If you have fixed configuration which you want to push to all client, you can just create vendor.yaml file by copy/paste from file generated by CPE introspection and all CPEs pick up setting from it.

If you wanted to do something more complex (make a lookup into legacy database and deduce configuration from it, for example) you can always extend CWMP::Vendor with new perl function will implement something like this.

To make this even easier, I decided to move project to git (so perl-cwmp is now available on github) and setup publicly visible ACS server which you can use to check weather your CPE implementation of TR-069 will work with my server. This requires you to have administrative privileges on your CPE device, and probably isn't good idea if your provider is already managing your modem using TR-069. But, in that case, you won't be able to change it's setting anyway :-)

However, this would mean that you would have to send full passwords to me also (because TR-069 doesn't encrypts them) so basically you are forced to install version locally to try it out if you have any passwords in your configuration which you don't want to share with everyone.

10. 03. 2010.

Fedora transparency?

From what I have seen in this blog post looks like Ubuntu has gained option to have transparent GNOME windows.

I hope this feature goes upstream as fast as possible so that Fedora gets this great feature as soon as possible, maybe for Fedora 14? Anybody has some insight regarding Fedora and transparency?

08. 03. 2010.

mintMenu in Fedora

LinuxMint is considered by many the best Linux desktop distribution, it is a Ubuntu based distribution and has some really great additions for desktop users on top of Ubuntu features. LinuxMint team has worked hard on porting mintMenu to Fedora.
 
mintMenu is currently stuck in review process, but hopefully it will come to Fedora repositories soon so everybody can test it and start using it.
 
We at Community Fedora Remix are looking into making mintMenu default Gnome menu for our next release.
 

07. 03. 2010.

Moovida still not in Fedora :(

 
I’m looking forward to seeing Moovida in Fedora, but currently it is stuck in bugzilla limbo :(
 
Currently Ubuntu has much better choice of multimedia and media center apps, that is why I hope Moovida gets in Fedora repos soon.
 
If you know somebody who would sponsor this packet please point him/her in the right direction.
 

06. 03. 2010.

Linux Benchmark

Dobra stanica je http://lbs.sourceforge.net/. Ja sam konkretno koristio nbench-byte koji služi za CPU.

02. 03. 2010.

Change font size in xterm using keyboard

I'm big fan of xterm with bitmap fonts (usually fixed, Terminus or Neep) for my terminals, mostly because it's small and quick (compare find . in your home directory full of files in some terminal with TrueType fonts and xterm with bitmap fonts to see difference).

But, I really wanted to have alternative way to change font size (other than Ctrl+right-click). I already wrote about xtermcontrol, but in my short usage of Gnome Terminal I noticed that having keyboard shortcuts for changing font size is really handy. And as always, xterm has solution for it. Put something like this in your ~/.Xdefaults:

XTerm.VT100.translations: #override \
Meta <Key> minus: smaller-vt-font() \n\
Meta <Key> plus: larger-vt-font() \n\
Meta <Key> KP_Subtract: smaller-vt-font() \n\
Meta <Key> KP_Add: larger-vt-font() \n\
Super <Key> minus: smaller-vt-font() \n\
Super <Key> plus: larger-vt-font() \n\
Super <Key> KP_Subtract: smaller-vt-font() \n\
Super <Key> KP_Add: larger-vt-font() \n
I decided to bind Meta (usually Alt) or Super (usually Windows key) and + or - on main keyboard or numeric keypad for quick and fail-safe access to terminal font size. As always with X server resource database whitespace is very important. Notice space after #override in first line.

You can invoke this configuration with something like xrdb -merge ~/.Xdefaults which you can put in your .xinitrc. You can make various other adjustments (see man xterm for all details), but usually you just want to change default font and reverse video (to get white on black terminal) using something like:

XTerm.VT100.font: -*-terminus-medium-r-normal-*-16-*-*-*-*-*-iso10646-*
XTerm.VT100.reverseVideo: true

01. 03. 2010.

Community Fedora Remix 12.3

We would like to announce live DVD/USB release of Community Fedora Remix 12.3
 
* 100% compatible with Fedora
* Compiz Fusion compositing window manager
* KDE + GNOME desktops
* multimedia support out of the box (mp3 playback)
* additional XFCE desktop
* GNOME Do – intelligent application launcher (http://tinyurl.com/yntg9l)
* OpenOffice 3.1
* Inkscape, Scribus and GIMP 2.6
* Blender
* Evolution with native Exchange support (mapi)
* Thunderbird 3.0
* better hardware compatibility for broadcom wireless cards
* better printer hardware compatibility
* better games selection
* Educational and astronomy software installed
* Google Chrome Internet browser + Firefox
* wireless security tools (aircrack-ng and kismet)
* GPS and location apps (TangoGPS and tools)
* Nautilus in browser mode by default
* enabled clicking via touchpad by default
* optimized smaller iso image (1.7GB vs 2GB)
* many other enhancements
 
If you have any suggestion on how to make this Remix better and to get involved feel free to join us and make this Fedora Remix even better on our mailing list community-fedora-remix@googlegroups.com or via comments on this blog.
 
Torrent download: linux tracker and demonoid
direct download: coming soon
 

28. 02. 2010.

Second day without S10-2: two day old laptop gone for repair

It started as a battery problem. It reported 100% full status, but wouldn't turn laptop on. I went back to T-Com center and tried with another battery, but it didn't work either. Now it's back for repair.

I was wondering where huge savings for netbook class hardware comes from. Partly it's smaller display, older chipset, but partly it's integration testing. Nobody ever tried to discharge this battery within laptop and than charge it again in this laptop (except me). When you buy server, you know that it has passed burn-in period of at least 48 hours. When I install it, I always leave it on for 24 h before I begin to work on it. As it seems, this is also good idea for laptops.

Osječki GPP koristi OpenStreetMap kartu!

 
Svaka pohvala ekipi iz GPP-a što su prepoznali OpenStreetMap projekt i što koriste kartu Osijeka za potrebe GPPa.
 
Svim nama koji volonterski sudjelujemo na ovome projektu nema draže stvari nego kada vidimo da se karta koristi i za neke konkretne stvari te da pomaže ljudima.
 
Ovim putem pozivamo sve vas da se također pridružite ovome projektu makar na taj način da pogledate kakva je karta vašega kvarta. Imaju li sve ulice imaju ispravna imena? Jesu li jednosmjerne ulice pravilno označene? Postoji li trgovina, kafić, servis, restoran u vašem kvartu koji nije unesen na kartu? Također možete dodati i kućne brojeve u vašoj ulici.
 
Ako se odlučite pridružiti više informacija možete pronaći na hrvatskim stranicama OpenStreetMap projekta.
 

27. 02. 2010.

First day with Ideapad S10-2 3G under Linux

Update: After a day, Ideapad S10-2 stopped working on batteries and is now back for repair. Last week, I had presentation about Virtual LDAP, and during it I become painfully aware that my current Eee PC 701 is no longer sufficient as primary mobile machine (three seconds to change slide is just too much). To make my troubles worse, I own three Eee PCs, and X200 tablet, so why would I need another ultra-mobile PC?

Well, because it is ultra-mobile. Don't get me wrong, X200 is beautiful machine, but with 9 cell battery (and with that price) it's just not something which you will carry always in your bag. I also really liked 9" netbooks form-factor. I don't mind small keyboard, because I want to be able to type on it holding netboot between my hands vertically!

So, I went in search for laptop which will fullfil following requirements:

So, how did I end up with Ideapad S10-S? I looked at Asus Eee PC 1005HA, but deciding factor was really keyboard layout. Let me introduce best keyboard layout I ever saw on small keyboards: ideapad-s10-2-keyboard-cursors.jpg

Display

I had to settle with 1024*600 vertical resolution, because it seems that this is only kind of 10" display available in Croatia within my price range. At least, it's a little better than 1024*540 that Ideapad S10 has... Built-in flash was also hard to find in netbook. There wasn't any.

Display is compromise: it's not as tall as your projected presentation (which will be 1024*768), so you won't see whole slide on your display, but other than that it's quite usable for web surfing and terminal usage. It's shiny, but I couldn't find any netbooks with non-glossy display. Bigger problem is maximum opening angle of display. I would love to be able to open it another 15 degrees or so. I'm not quite sure that there is structural reson for this limit, and 1005HA has exactly same angle, so it's conspiracy to force us into buying tablets which don't have this problem.

It's really shiny. So shiny in fact, that I had to use xgamma to get contrast high enough to be able to read Web pages with grayish text on them.

dpavlin@ipad:~$ xgamma -g 0.75,1
-> Red  1.000, Green  1.000, Blue  1.000
- Red  0.750, Green  0.750, Blue  0.750

3G modem and bluetooth

Dongle is nice, integrated modem is even nicer. Ericsson F3507g has GPS built-in (think what this means for your privacy for a moment because it doesn't work without SIM card inserted, and GSM operators can inquire your position at any time without your knowledge).
Having said that 3G modem, GPS and bluetooth are available, so let's move on...

SSD storage

I made conscious decision that I want splash top built into my netbook. Not because it's really useful (it isn't really), but because I could re-install critical part of my extended system on it and really have *same* working configuration booting from flash. I don't have any idea about size of flash (I seem to remember reading that it's only 512Mb), and I don't have any access to it for now, so we count this one failure.

Shoulder test

I have only one day expirience, but It seems that 1220 g of Ideapad alone without power adapter passes. Battery lasted long enough for intense half-day usage (you know, new toy, click, click), so it will probably be OK for whole day without dragging power adapter everywhere.

I decided to install Ubuntu Netbook remix on it, to try out if I could recommend this to other netbook users. In it's current incarnation, I ended up with do-release-upgrade -d to get 2.6.32 kernel. I did try backports, and bcmwl-kernel-source before going to alpha version, in fact, I tried harder that most normal first-time users would to get wireless working under Linux.

Current development version of Ubuntu did enable wireless, but GUI launcher freezes sometimes, which makes it unusable at current moment for normal netbook users. But, next version of Ubuntu will work without a glitch on this netbook, and in my opinion is much better choice than Windows 7 on this machine. It will give users much more performance on same hardware. Yes, I tried Windows 7 which came with it, it took 15 seconds to open control panel and display 6 icons. Than I noticed it has a slowly moving progress bar on top, and I got used to seeing it often. I'm not impressed.

All in all, this netbook is great improvement if you need smallest possible machine which you can carry around with you.

23. 02. 2010.

Git početnica, 4. dio - rješavanje konflikata

U prošlom postu u Git serijalu spomenuli smo mogućnost konflikata prilikom rebaziranja ili spajanja grana te dali par sugestija kako ih izbjeći. No kod kompliciranijih projekata i workflowova konflikti su ponekad neizbježni, stoga je korisno znati kako riješiti konflikt kad do njega dođe.

Rješavanje konflikata

Ukoliko sami radite na projektu, konflikti vam se vjerojatno neće događati (osim ukoliko ne pazite). No, ukoliko radite na projektu sa više ljudi, može vam se zadesiti da se nađete u situaciji gdje ćete morati riješiti konflikt.

Recimo da je naš helloworld projekt dobio na važnosti i sada na njemu rade dva developera, Mirko i Slavko. Mirko i Slavko u stvarnom životu radit će na svojim granama u svojim klonovima repozitorija, ali da si ovdje pojednostavnimo priču, svaki će imati po jednu granu u našem zajedničkom repozitoriju.

Kreirajmo obje grane, bez prebacivanja u njih:

> git checkout master
Switched to branch 'master'

> git branch mirko
> git branch slavko
> git branch -l
  helloworld-0
* master
  mirko
  slavko

Dolazi Mirko, vidi problem u načinu kako je definirana funkcija main i popravlja ga u svojoj grani:

> git checkout mirko
Switched to branch 'mirko'

[...promjene hello.c...]

> git diff
diff --git a/hello.c b/hello.c
index 0bb4941..8b08068 100644
--- a/hello.c
+++ b/hello.c
@@ -1,6 +1,7 @@
 #include <stdio.h>

-int main(void)
+int
+main(int argc, char *argv[])
 {
   printf("Hello world\n");
   return 0;

> git commit -a -m "popravio main prototip"
[mirko 4e5f904] popravio main prototip
 1 files changed, 2 insertions(+), 1 deletions(-)

U međuvremenu, dolazi Slavko, vidi isti problem, ne zna da je Mirko radio na istoj stvari pa ga rješava kod sebe:

> git checkout slavko
Switched to branch 'slavko'

[...promjene hello.c...]

> git diff
diff --git a/hello.c b/hello.c
index 0bb4941..38586b0 100644
--- a/hello.c
+++ b/hello.c
@@ -1,6 +1,6 @@
 #include <stdio.h>

-int main(void)
+int main(int argc, char **argv)
 {
   printf("Hello world\n");
   return 0;

> git commit -a -m "prepravio definiciju funkcije main"
[slavko 4bb59be] prepravio definiciju funkcije main
 1 files changed, 1 insertions(+), 1 deletions(-)

Sve je dobro dok su promjene u zasebnim granama. No u jednom trenu ćemo željeti sve Mirkove i Slavkove promjene spojiti u master. Prva promjena će proći dobro, no na drugoj će nam se dogoditi konflikt.

> git checkout master
Switched to branch 'master'

> git merge mirko
git merge mirko
Updating 302ef80..4e5f904
Fast-forward
 hello.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

> git merge slavko
git merge slavko
Auto-merging hello.c
CONFLICT (content): Merge conflict in hello.c
Automatic merge failed; fix conflicts and then commit the result.

Uh, huh… obojica su mijenjala isto mjesto u istoj datoteci, i git ne zna kako riješiti problem. Zbog toga je merge pauziran i dana nam je prilika da riješimo konflikt. Pogledajmo što se dogodilo:

git diff
diff --cc hello.c
index 8b08068,38586b0..0000000
--- a/hello.c
+++ b/hello.c
@@@ -1,7 -1,6 +1,11 @@@
  #include <stdio.h>

++<<<<<<< HEAD
 +int
 +main(int argc, char *argv[])
++=======
+ int main(int argc, char **argv)
++>>>>>>> slavko
  {
    printf("Hello world\n");
    return 0;

> cat hello.c
#include <stdio.h>

<<<<<<< HEAD
int
main(int argc, char *argv[])
=======
int main(int argc, char **argv)
>>>>>>> slavko
{
  printf("Hello world\n");
  return 0;
}

Diff prikazuje obje nekompatibilne promjene. Prva je iz trenutne grane (odnosno to je ona Mirkova promjena koju smo uspješno preuzeli spajanjem Mirkove grane), dok je druga iz grane slavko. Rješimo konflikt modificiranjem tog dijela datoteke da izgleda onako kako mi želimo:

[...promjene hello.c...]
cat hello.c
#include <stdio.h>

int
main(int argc, char **argv)
{
  printf("Hello world\n");
  return 0;
}

> git diff
diff --cc hello.c
index 8b08068,38586b0..0000000
--- a/hello.c
+++ b/hello.c
@@@ -1,7 -1,6 +1,7 @@@
  #include <tdio.h>

 -int main(int argc, char **argv)
 +int
- main(int argc, char *argv[])
++main(int argc, char **argv)
  {
    printf("Hello world\n");
    return 0;

> git add hello.c
> git commit
[master fd96bab] Merge branch 'slavko'

Diff prikaz u slučaju konflikata je pomalo zbunjujuć, no snalaženje u samoj datoteci koju treba popraviti je relativno jednostavno - konflikt je između <<<<<<< i >>>>>>>, a ======= razdvaja konfliktne promjene.

Konflikt prilikom rebaziranja

Kao što smo već prije vidjeli, obično želimo grane održavati tako da u svakom trenu njihove promjene budu primjenjive na master (odnosno na baznu granu gdje ih na kraju želimo spojiti), a jedan od razloga je upravo izbjegavanje konflikata kod spajanja.

Jedan od razloga zbog kojih je konflikt kod spajanja nezgodan je i činjenica da problem praktički “prebacujemo” onom tko radi merge, a kod većih projekata to je obično osoba koja održava projekt (tj. glavni developer). Ukoliko od nje tražite da granu sa vašim promjenama spaja sa masterom, a to izaziva konflikte kod mergea, zapravo ste prilično nepristojni.

Zato je bolje prije nego zatražite (ili krenete raditi) spajanje rebazirati svoju granu tako da samo spajanje bude čisto. To znači da ćete eventualne konflikte morati sami rješiti prilikom rebaziranja.

Vratimo se malo u prošlost i zaboravimo da smo radili merge Mirkove i Slavkove grane:

> git reset --hard 302ef80039bd55fbbc680d84e37e5ebcf7f63a5c
HEAD is now at 302ef80 dodan README

Mirko odluči spojiti svoju granu s masterom. Njegovu granu nije potrebno rebazirati jer se nastavlja na master (tj master nema nikakvih novih promjena):

> git merge mirko
Updating 302ef80..4e5f904
Fast-forward
 hello.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

Slavko odluči spojiti svoju granu. Njegovu granu je potrebno rebazirati jer
master ima novih comittova:

> git checkout slavko
Switched to branch 'slavko'

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: prepravio definiciju funkcije main
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello.c
CONFLICT (content): Merge conflict in hello.c
Failed to merge in the changes.
Patch failed at 0001 prepravio definiciju funkcije main

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Ovo izgleda mnogo strašnije nego poruka kod mergea! Ali problem je isti, u što se možemo uvjeriti pomoću git diff (s tim da će umjesto imena naše grane biti naziv commita u našoj grani s kojim ima problema). Nakon što napravimo ispravke u datoteci, trebamo nastaviti proces rebaziranja:

[...promjene hello.c...]
> git add hello.c
> git rebase --continue
Applying: prepravio definiciju funkcije main

Ovdje nismo ručno radili git commit, nego smo nakon popravka nastavili proces rebaziranja. Kako rebaziranje ide commit po commit, ukoliko ima još konflikata u narednim commitovima, rebase bi se opet zaustavio i zatražio da popravimo stvari.

Ukoliko zaključimo da je commit nepotreban (npr. zato što je u drugoj grani taj problem već riješen), možemo ga odbaciti. Ako se radi o ozbiljnom problemu za kojeg ne znamo kako ga riješiti, možemo prekinuti rebase, a grana će nam se vratiti u prvobitno stanje. U tom slučaju ćemo vjerojatno morati rješavati merge konflikte prilikom spajanja i napraviti merge a ne rebase.

22. 02. 2010.

OpenVZ, VLANs, ethernet bridge and ssh tunneling

I know that title is mouthful. But, I occasionally use this blog as place to dump interesting configuration settings and it helps me remember configuration which helps me to remember it and might be useful to lone surfers who stumbles upon this page.

graph.png

This weekend our nice network admin upgraded VLAN setup to enables 1Gb/s network across whole private segment. That is clearly visible in green arrows on picture, especially if you compare it with last one. We still have a few slower links (100 Mb/s) which pass through NAT to Internet (red arrows), but we now have private segment on every server in library and system room in main building and each server has IP address in new 1 Gb/s segment (you can notice that by blue arrows which are loopback interface on same machine).

All is not well, however. I had to reconfigure my OpenVZ containers from point-to-point ip configuration using venet devices to ethernet bridge setup because multiple hops on OpenVZ machine produced havoc with connections from our private network to containers. It was very wired, I saw TCP retransmission requests, but first packet somehow managed to pass through. ICMP traffic worked (thanks to small packet sizes), but I can't honestly say why our new VLAN setup and/or OpenVZ had problem with it. Up to that point, I just had private IP addresses assigned to OpenVZ container using vzctl set --ipadd 10.60.0.12 and ping -R did show multiple public and private addresses, but it all somehow worked.

First, I had to make network bridge which will be new VLAN 60

root@koha-hw:~# cat /etc/network/interfaces

auto br60
iface br60 inet static
        bridge_ports eth1 veth212226
        bridge_fd 0
        address 10.60.0.10
        netmask 255.255.254.0
        gateway 10.60.0.1
Then, I removed old private IP addresses:
root@koha-hw:~# vzctl set 212226 --ipdel 10.60.0.12 --save
and add new veth device (my version of vzctl requires MAC addresses, so beware!):
root@koha-hw:~# vzctl set 212226 --netif_add veth1,00:12:34:56:78:9A,veth212226,00:12:34:56:78:9B,br60 --save
This create veth1 device inside container to which I can assign IP address:
koha:~# ifconfig veth1 10.60.0.12 netmask 255.255.254.0 up
I decided to put that in /etc/rc.local because /etc/network/interfaces is managed by OpenVZ.

Next, I needed to reconfigure my ssh VPN which was using point-to-point tunneling with tap into real ethernet tunnel:

root@brr:~# tail -10 /etc/network/interfaces 

# vpn lib -> home
auto tap0
iface tap0 inet static
        pre-up ssh -M -S /var/run/tap0 -v -f -i /root/.ssh/koha-hw-tun0 -w 0:0 -o Tunnel=ethernet -o ServerAliveInterval=5 -o ServerAliveCountMax=2 koha-hw.ffzg.hr true
        address 10.60.0.81
        netmask 255.255.0.0
        up iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o tap0 -j MASQUERADE
        post-down ssh -S /var/run/tap0 -O exit koha-hw.ffzg.hr
On remote side, force tunnel number and add new device to bridge:
root@koha-hw:~# head -1 /root/.ssh/authorized_keys 
tunnel="0",command="ifconfig tap0 up ; brctl addif br60 tap0" ssh-rsa AAAAB3Nza...

Finally, little cron job to start (and restart) VPN:

root@brr:~# cat /etc/cron.d/tap0 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/1     * * * * root    fping -q 10.60.0.10 || ( ifdown tap0 ; ifup tap0 )

19. 02. 2010.

Notes on Alpine and Topal

Almost 9 months ago I wrote an article about Alpine and GnuPG. That article covers basics of integrating Topal and Alpine, I'd like to add more notes and talk about some usage scenarios. But first I should mention that if you are an Arch Linux user the topal package is now available in the AUR. I'm the maintainer and I would appreciate any feedback, so far it got only one vote and I expect more.

I remember trying to switch to GPG2 back when I was still using the PinePG filter and it was not as easy as I hoped for. Official support was not there, and I'm sorry I failed to mention in my last article that Topal works fine with gpg2. You can set "gpg-binary=gpg2" in your ~/.topal/config file to switch. Note that the old gpg option "--no-use-agent/--use-agent" makes no difference, gpg2 always requires the agent. What this means for you is that gpg2 will try to start the PIN entry dialog every time it needs the passphrase (even when you don't use the agent normally), so if you don't run X11 set "pinentry-program" to /usr/bin/pinentry-curses in your ~/.gnupg/gpg-agent.conf file. If you would like to start using the GnuPG Agent instruct Topal to always connect to it with "use-agent=3", and read my article on the GnuPG Passphrase Agent.

Do you remember the big SHA1 scare last year? Many people generated new keys, and many more dumped SHA1 for good. My article on GnuPG basics also covered personal cipher options, and forcing stronger digests. However Topal "gpg-options" setting by default uses --no-options which instructs gpg2 not to read your ~/.gnupg/gpg.conf file, which then fall-backs to SHA1 for signing. You should remove it in order to use personal digest and cipher algorithms, and it's also useful because of other options (like auto-key-retrieve if you want to fetch missing keys). You will find my own GnuPG configuration files in my dotfiles repository.

In the past year I wrote several articles on GnuPG and they bring a lot of visitors here. Some recurring Google searches are (more or less) "sharing private keys" and "splitting gpg keys". There's already a very popular (although outdated) article on the subject so head on there. But if you are an Alpine user read on. General scenario is this: you read your mail on a remote server, which you can't trust as much as your workstation (or removable storage). Reading mail on one host, verifying it and sending from another, maintaining multiple key-rings, or even placing the primary key on both machines... is tedious and risky. Using subkeys as explained in that article is one way of solving the problem, but with Topal you don't need to because of its remote and server mode of operation.

Each time Topal is invoked you can select the remote mode of operation. In remote mode Topal with connect to your trusted machine with SSH, transfer any files necessary with SCP and then perform the wanted GnuPG action. To make use of the remote mode on the secure machine you need the SSH daemon running and Topal started in the server mode ($ topal -server). To make the whole procedure as transparent as possible you can employ SSH public key authentication.

18. 02. 2010.

bak-git: tracking remote files in central git repository

If you are system administrator this will sound familiar: you have to quickly fix something, and you know that you should document it somewhere (or keep backup) but it's so much work. You could install one of existing source control management tools on each box, but they usually come with huge dependencies, and having all files in central location would be so useful to co-relate configuration changes. To add insult to injury, existing SCMs don't do good job in tracking just few files spread across file-system.

So, what would be perfect tool for keeping remote files in central git repository look like?

I tried to solve this problem several times, writing wrappers around subversion to handle sparse checkouts and installing subversion and ssh authentication all over the place. But, all this should be simpler... Like this:

  1. add new client to track:
    dpavlin@klin:~/klin/bak-git$ ./bak-git-server.pl ~/backup/ 10.60.0.92 --install brr
    install on brr
    # lot of output stripped
    
    This will do several steps:
    • create git repository in ~/backup/ if it doesn't exist already
    • install root ssh authentication to brr using ssh-copy-id
    • install bak shell helper which uses netcat to connect back to 10.60.0.92
    • install rsync on client and use it as root over ssh to sync files
  2. Now we can login into brr and start tracking our files:
    dpavlin@brr:~$ bak add /etc/cron.d/tun0 
    dpavlin@brr:~$ bak add /etc/network/interfaces
    dpavlin@brr:~$ bak commit
    dpavlin@brr:~$ bak log
    commit df09dc5e19ef1d47311d701b4c63f0859b0b81c1
    Author: Dobrica Pavlinusic 
    Date:   Thu Feb 18 19:04:21 2010 +0100
    
        brr [commit] /home/dpavlin/
    
     create mode 100644 brr/etc/cron.d/tun0
     create mode 100644 brr/etc/network/interfaces
    
  3. change some configuration and review changes
    dpavlin@brr:~$ bak diff
    diff --git a/brr/etc/network/interfaces b/brr/etc/network/interfaces
    index 806c08e..c52c646 100644
    --- a/brr/etc/network/interfaces
    +++ b/brr/etc/network/interfaces
    @@ -2,8 +2,6 @@
     # and how to activate them. For more information, see interfaces(5).
     
     # The loopback network interface
    -auto lo
    -iface lo inet loopback
     
     # The primary network interface
     #allow-hotplug eth0
    
  4. Uups!! Where did loopback disappeared?
    dpavlin@brr:~$ bak revert /etc/network/interfaces 
    dpavlin@brr:~$ bak diff
    
  5. If we are content with changes, we can also commit them:
    dpavlin@brr:~$ bak commit /etc/network/interfaces optional note
    
As you guessed by now, it's very similar to git usage (expect revert which is from subversion) but with easy deployment on clients. It implements reduced subset of git commands: If you need anything more complex, you can use git directly on ~/backup repository (even to commit changes from multiple hosts in one go).

Whole solution seems like ftp protocol, with data channel using ssh and rsync. File transfer should be encrypted (since we are trying to manage configuration files with sensitive information) and if you want to be really secure, just run server on 127.0.0.1 and tunnel port using RemoteForward 9001 localhost:9001 in .ssh/config.

16. 02. 2010.

Fedora Chromium repo no more?

 
Tom “spot” Callaway Spot has been mainataining Fedora Chromium repo, but now it is gone and there is no explanation on Tom’s Spot’s blog :(
 
UPDATE: But there is an explanation in README.txt file.
 
It looks like Chromium won’t be making its way to Fedora repos anytime soon because of Googles non-cooperation :(
 
To make things worse Community Fedora Remix included chromium repo by default and now updates are broken for lots of people because of that :(
 
Is there some new Chromium repo or is the only solution to install Google Chrome instead?
 
Tom Spot congrats to your wife and you on baby! Also on moving to a new house, I hope you continue maintaining chromium repo.
 

10. 02. 2010.

MySQL, MariaDB and slow queries

mammoth_versus_dolphin_500.jpg I have been following MySQL saga with Sun and Oracle for quite some time, mostly because we decided to go mainstream with our Koha installation and use MySQL instead of PostgreSQL because it's support is experimental.

It seems that MariaDB is the future of MySQL if you trust Monty. There is also Drizzle but it's different enough that it's not considered drop-in replacement for MySQL. So, now that I have some hope that MySQL is here to stay I needed to find a quick way to analyze my performance on it.

And there is a great way to see overview of your slow query log: mk-query-digest. It's part of Maatkit which is very interesting and useful project for MySQL DBAs. So, with something like:

dpavlin@mjesec:~$ wget -q http://maatkit.org/get/mk-query-digest
dpavlin@mjesec:~$ perl mk-query-digest /var/log/mysql/mysql-slow.log
You will get nice report about your queries. Very useful.

If Linus was starting a kernel in 2010…

Imagine you’ve seen a blog post titled Free linux-like kernel sources for x86-64 PC’s with the following contents:

Do you pine for the nice days of linux 2.4, when men were men and wrote
their own device drivers? Are you without a nice project and just dying
to cut your teeth on a OS you can try to modify for your needs? Are you
finding it frustrating when everything works on linux? No more all-
nighters to get a nifty program working? Then this post might be just
for you :-)

As I tweeted a month(?) ago, I’m working on a free version of a
linux-lookalike for x86-64 computers. It has finally reached the stage
where it’s even usable (though may not be depending on what you want),
and I am willing to put out the sources for wider distribution. It is
just version 0.02 (+1 (very small) patch already), but I’ve successfully
run bash/gcc/gnu-make/gnu-sed/compress etc under it.

Sources for this pet project of mine can be found on github. The repo also
contains some README-file and a couple of binaries to work under it
(bash, update and gcc, what more can you ask for :-). Full kernel
source is provided, as no linux code has been used. Library sources are
only partially free, so that cannot be distributed currently. The
system is able to compile “as-is” and has been known to work. Heh.
Sources to the binaries (bash and gcc) can be found at the same place.

ALERT! WARNING! NOTE! These sources still need linux to be compiled
(and gcc, possibly gcc4, haven’t tested), and you need linux to
set it up if you want to run it, so it is not yet a standalone system
for those of you without linux. I’m working on it. You also need to be
something of a hacker to set it up (?), so for those hoping for an
alternative to linux, please ignore me. It is currently meant for
hackers interested in operating systems and x86-64’s with access to linux.

The system needs an IDE harddisk (sorry) and any VGA card. If
you are still interested, please read my blog post about it, and/or ask me
on Twitter for additinal info.

I can (well, almost) hear you asking yourselves “why?”. Next year (or the
one after it who knows) will be The Year Of Linux Desktop, and I’ve already got
Ubuntu. This is a program for hackers by a hacker. I’ve enjouyed doing
it, and somebody might enjoy looking at it and even modifying it for
their own needs. It is still small enough to understand, use and
modify, and I’m looking forward to any comments you might have.

Does this sound familiar to you? If you know your Linux history, is should - it’s a ripoff of the original Linux announcement post that Linus posted to the comp.os.minix newsgroup.

A few points to consider:

09. 02. 2010.

Git početnica, 3. dio - rukovanje promjenama

Nakon što smo u prošlom postu proučili kako raditi grananje, spajanje i rebaziranje grana, git nam već može biti poprilično koristan alat. Kako projekt raste, git nam može pomoći da ne izgubimo glavu u različitim granama i verzijama koje održavamo unutar jednog projekta.

Interaktivno dodavanje promjena

Prilikom rada na projektu, često ćemo da bi stvar uopće natjerali da radi morati napraviti nekoliko nezavisnih promjena, a tek onda biti sigurni da smo dobili dobar rezultat. Obično tek tada želimo napraviti commit, ali bismo htjeli da nezavisne promjene idu u nezavisne commitove. Ako se te promjene nalaze u istoj datoteci, običan git add nam ne pomaže jer bi on označio cijelu datoteku za commit.

U tom slučaju možemo koristiti interaktivno dodavanje. Ono nam pruža veću kontrolu nad time što dodajemo u commit, a i preglednije je (i pruža nam priliku za review napravljenoga prije commitanja), pa preporučam da ga uvijek koristite, čak i kad želite dodati sve promjene.

Recimo da smo napravili dvije nezavisne izmjene u hello.c. datoteci i želimo ih committati odvojeno (primjer radim u novoj test grani koju ću kasnije obrisati):

> git checkout -b test
Switched to a new branch 'test'

> git diff
diff --git a/hello.c b/hello.c
index 0bb4941..d560074 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
 #include <stdio.h>

 int main(void)
@@ -5,3 +6,9 @@ int main(void)
   printf("Hello world\n");
   return 0;
 }
+
+void unused(void)
+{
+  puts("I'm never used");
+}
+

> git add -p
diff --git a/hello.c b/hello.c
index 0bb4941..d560074 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include 
 #include 

 int main(void)
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? y
@@ -5,3 +6,9 @@ int main(void)
   printf("Hello world\n");
   return 0;
 }
+
+void unused(void)
+{
+  puts("I'm never used");
+}
+
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? n

Ovo će označiti (tj. spremiti u index) samo prvu promjenu u datoteci za committanje. To možemo provjeriti sa git diff --cached:

git diff --cached
diff --git a/hello.c b/hello.c
index 0bb4941..c6efc61 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
 #include <stdio.h>

 int main(void)

Pregled promjena u datotekama

Nakon što neko vrijeme radite na projektu, većina datoteka unutar projekta
vjerojatno će biti mijenjana mnogo puta. Kako bi vidjeli koje promjene smo radili
nad jednom datotekom (ili direktorijem), možemo koristiti još jedan oblik
već poznate git log naredbe:

> git log hello.c
commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

commit 04f3667425705d29f2c3a10bb45e79f5cc6b7d7d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 05:49:59 2010 +0100
malo uljepsano

commit 6e70237aaa84a0c8ff74bd0fad6cccb4d118b695
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 05:49:03 2010 +0100
prva verzija

Ovaj ispis dobar je ako želimo kronološki pregled promjena. No često je slučaj
da nas zanima zašto je baš neki dio (trenutne) datoteke napisan tako je, tj. koji
je razlog za dodavanje (ili promjenu) pojedine linije unutar koda.

Pregled promjena po pojedinim linijama datoteke omogućuje nam git blame,
tako nazvan jer nam govori tko je odgovoran za pojedinu liniju datoteke i zašto:

> git blame hello.c
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 1) #include <stdio.h>
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 2)
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 3) int main(void)
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 4) {
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 5)   printf("Hello world\n");
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 6)   return 0;
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 7) }

Popis za svaku liniju sadrži skraćeni ID commita, autora te datum promjene.
Nakon što identificiramo promjenu koja nas zanima, pomoću već poznate
git show naredbe možemo vidjeti i ostale detalje te promjene.

Označavanje (tagiranje) commitova

Naš “Hello World” projekt već ima praktički svu funkcionalnost koju želimo,
stoga je pravo vrijeme da napravimo naš prvi release. Osim što možemo napraviti
arhivu izvornog koda (kao tar.gz ili u nekom drugom formatu) i poslati je korisnicima
svog programa, korisno je i u samom repozitoriju označiti da smo napravili
release.

Kako bismo “zapamtili” da smo napravili release, možemo dodati oznaku (tag) na
trenutni commit. Kako svaki commit zna za sve koji su se dogodili prije njega,
ta oznaka poslužit će nam da bi na jednostavan način dolazili do stanja projekta
u raznim fazama razvoja, bez da pamtimo IDeve comittova.

Oznaka (tj. tag) je (pojednostavljeno) najobičniji “alias” na ID commita.
Postavljenu oznaku možemo koristiti praktički svugdje gdje moramo navoditi ID
commita. Možemo ga koristiti kako god želimo - najčešća praksa je obilježavanje
kad se dogodilo nešto značajno u projektu, kao što je release.

Tagirajmo release 0.1 našeg projekta. Kako release radimo iz master
grane, pripazit ćemo ne tagiramo commit u krivoj grani:

> git checkout master
> git tag -m "postavljamo tag" "helloworld-0.1"

tagove možemo pregledavati pomoću git tag -l, a brisati pomoću
git tag -d <ime_taga>.

Prilikom postavljanja oznake, možemo je i kriptografski potpisati (gpg-om,
uz korištenje gpg privatnog ključa za mail adresu koju koristimo kod rada
s repozitorijem), korištenjem opcije -s.

Sretni sa napravljenim releasom, krećemo dalje sa razvojem projekta. Verzija
0.1 je potpun program, ali mu nedostaje build sustav, zbog čega svaki put moramo
ručno pozivati kompilator. Namjera nam je to riješiti korištenjem make
alata.

Kreirajmo konfiguracijsku datoteku za make zvanu Makefile
(napomena: make je izbirljiv glede sintakse, stoga je bitno na određenim mjestima
koristiti tab umjesto razmaka, što je posebno naznačeno u ovom listingu):

CC = gcc
OBJS = hello.o
CFLAGS = -Wall -Werror -O3 -g

.PHONY: all clean

all: hello

hello: $(OBJS)
<tab>$(CC) $(OBJS) -o $@

%.o: %.c
<tab>$(CC) $(CFLAGS) -c $ -o $@

clean:
<tab>rm -f hello $(OBJS)

Dodajmo novostvorenu datoteku u projekt, repozicionirajmo doc granu
(pošto imamo novosti u masteru) i spojimo je natrag u master granu.
Pošto smo završili sa doc granom, na kraju je možemo i obrisati.

> git add Makefile
> git commit -m "dodan Makefile"
master b23a04b] dodan Makefile
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 Makefile

> git checkout doc
Switched to branch 'doc'

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: dodan README

> git checkout master
Switched to branch 'master'

> git merge doc
Updating b23a04b..302ef80
Fast-forward
 README.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.txt

> git branch -d doc
Deleted branch doc (was 302ef80).

Pregršt novih promjena! Pogledajmo što smo sve izmjenili od zadnjeg releasea:

< git log helloworld-0.1..HEAD
commit 302ef80039bd55fbbc680d84e37e5ebcf7f63a5c
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit b23a04b47dbc1044d44d94ee0a5df967f8f1b26d
Author: Senko Rasic <senko@localhost>
Date:   Fri Feb 5 16:02:54 2010 +0100
dodan Makefile

Poput grana, tagove je moguće checkout-ati, čime se vraćamo u prošlost,
u stanje projekta kakvo je bilo u trenutku tagiranja. Vratimo se malo u prošlost
do naše verzije 0.1:

> git checkout helloworld-0.1
Note: moving to 'helloworld-0.1' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b 
HEAD is now at 5e54751... popravljen kod

Git nas upozorava da smo došli na commit koji nije zadnji u nekoj grani. Ukoliko
želimo raditi bilo kakve modifikacije na projektu od ove točke, moramo kreirati novu
granu u koju će one biti spremljene.

Razvojne i stabilne grane

Ovo nam daje dobru ideju - možemo kreirati novu granu s početkom u helloworld-0.1,
koja služi samo za “održavanje” postojećeg koda i ispravljanje pogrešaka, dok ćemo sav
novi razvoj na projektu raditi kao i do sada na masteru. Ovime se želimo
osigurati da imamo “stabilnu verziju” projekta u koju nam neće slučajno upadati i
nove stvari koje razvijamo na “razvojnoj verziji” projekta na master grani.

> git checkout -b helloworld-0 helloworld-0.1
Switched to a new branch 'helloworld-0'

Grana helloworld-0 sadrži commit tagiran sa ‘helloworld-0.1′ i
sve njegove prethodnike i predstavlja stanje projekta kakvo je bilo u trenutku
kada smo tagirali taj commit. Granu potom možemo koristiti samo za promjene na
stabilnoj/releasanoj verziji, dok nam master ostaje za novi razvoj.

Cherry-picking

Ponekad prilikom rada na novoj verziji uočimo i ispravimo pogrešku koja postoji
i u već releasanoj verziji. Iako bismo ispravke mogli napraviti posebno na obje
grane, jednostavnije je ispravak napraviti na jednoj (obično razvojnoj, tj.
masteru) i nakon toga istu zakrpu primjeniti i na drugu. Ukoliko ispravku radimo
na masteru, primjenjivanje zakrpe i na starije release grane se zove
backporting.

Da bismo napravili backport commita koji ispravlja neku grešku, ne možemo
koristiti niti merge niti rebase, jer oni preuzimaju sve commitove iz mastera.
U slučaju kada želimo izabrati samo jedan commit (ili nekoliko njih, ali ne
cijelu granu) iz jedne grane i primjeniti ga na drugu, možemo koristiti
git cherry-pick.

Korisnici verzije 0.1 našeg softvera su ogorčeni jer ručno moraju pokretati
gcc. Smatraju da je to bug, a kako mi već imamo rješenje u obliku Makefilea
u master grani, rješenje je jednostavno - backportati commit koji je dodao
Makefile i napraviti novi release na 0.* grani.

> git cherry-pick b23a04b47dbc1044d44d94ee0a5df967f8f1b26d
Finished one cherry-pick.
[helloworld-0 f60bcbd] dodan Makefile
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 Makefile

Traženi commit je preuzet u trenutnu granu. Preciznije, promjene
koje je traženi commit napravio su napravljene i spremljene i za trenutnu granu.
Ovo je bitno zbog toga što se ID commita mijenja - kao i kod rebasea, originalni
i cherry-pickani commitovi nisu isti. Ovisno o daljnjim promjenama koje radimo
na grani, možemo se naći u situaciji da granu više nije moguće rebazirati ili
spojiti sa masterom, odnosno trebali bi rješavati konflikte. Stoga bi trebalo
izbjegavati cherry-picking iz grane koju u budućnosti želimo spojiti sa trenutnom
granom.

Više o konfliktima te što napraviti kad vam se oni dogode pročitajte u slijedećem postu u ovom serijalu, za par dana…

05. 02. 2010.

Koje aplikacije najviše koristim?

Senko je početkom godine naveo programe koje koristi u svakodnevnom radu. Dopadaju mi se postovi takve vrste jer skoro uvijek otkrijem neki novi, korisni alat kojeg do tada nisam imao prilike susresti. Zato se nadam da će i ovaj post nekome biti od koristi i otkriti neku novu, korisnu aplikaciju.

Web preglednik - Firefox, Chrome i malo Opere. Zbog prirode posla puno vremena provodim u preglednicima, još uvijek najviše koristim Firefox, najvjerojatnije iz navike, Chrome koristim sve češće, a Operu sve manje iako mi je njezin dodatak za developer jedno vrijeme bio najbolji alat te vrste.

Web aplikacije - Gmail za mail, Google Reader za feedove, HootSuite kao twitter klijent. Kad presuši Google Reader onda ponekad koristim i Netvibes u kojem imam drugu ligu feedova. Od novih aplikacija koje ne koristim, ali održavam (u stilu nahrani svinje i ništa ne diraj ;-) ), izdvojio bih roundcube kao jedan od rijetkih web mailova koji mi pristojno izgleda.

Nekada sam eksperimentirao s raznim upraviteljima prozora, ali sada se već nekoliko godina držim Gnomea, Nautilus koristim skoro isto toliko kao i mc, a ako se na računalu ne vrti GnomeDo osjećam se kao da mi je netko počupao pola tipaka iz tipkovnice. To valjda s godinama dolazi težnja prema oku ugodnijim sučeljima.

Od pomoćnih alata koristim KeePassX za čuvanje više ili manje povjerljivih pristupnih podataka, DropBox za prijenos datoteka između računala koje koristim (njih 4). Klasičan ssh klijent koristim za spajanje na različita računala, rdiff-backup za backup podaka, uglavnom s OpenVZ virtualaca. Za backup trenutno testiram i Tarsnap servis za nadnaravno paranoične.

Nakon mnogih editora smirenje mi je donijela Editra, napisana u Pythonu uz pomoć wx toolkita i poprilično je hitrija od editora koje sam nedavno koristio (Komodo Edit/Ide, Aptana). Skoro svakodnevno preuzimam novu inačicu iz repozitorija, pa moj primjer nekome neće donijeti smirenje već često čupanje kose. Ali autor brzo reagira i rješava probleme. Uz pomoć Editre razvijam Django aplikacije, njezin project manager ima podršku za git, ali to mi nije dovoljno pa koristim i git iz komandne linije te TeamGit, giggle (zbog lijepog prikaza povijesti grananja), danas sam vidio da je i gitg isto tako zgodan, a shvatio sam da nism pažljivo gledao što nudi git-cola koja je po mogućnostima jedna od najjačih git gui klijenata. Na poslužiteljima koristim i tig (ncurses git klijent), a repozitorije poslužuje gitosis. Ako mi nije dovoljan psql oku ugodan uvid u PostgreSQL mi nudi Tora.

Od grafičkih aplikacija tu je vjerni GIMP, za pregled slika koristim gthumb, za crtarije mi služi Inkscape, video i zvučne datoteke mi prikazuje mplayer, a ovaj vikend ću vidjeti da li je Openshot dobra zamjena za Kino ili ću uzeti PiTiVi za svoj video editor. Comix mi prikazuje stripove, a evince .pdf i .djvu datoteke.

Za komunikaciju koristim Evolution (najviše zbog službenih poruka i rasporeda sastanaka), Pidgin (gtalk i msn), te Mozillu Thunderbird za sve preostale e-mail korisničke račune.

04. 02. 2010.

Tjedan konferencija

FOSDEM

Ovaj vikend se u Bruxellesu održava tradicionalna FOSDEM konferencija. Broj zanimljivih predavanja i prezentacija je ogroman (samo popis stvari koje bih želio poslušati zahtjeva da se kloniram par puta :), a osim toga bit će velik broj zanimljivih ljudi koji se bave različitim stvarima, štandova, … a ne smijemo zaboraviti niti belgijsku pivu :) Tako da mi je drago da ću i ove godine prisustvovati ovoj konferenciji.

I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting

Računajte na #fosdem tweetove (po uvjetom da gomile geekova ne preopterete wireless, što je obično slučaj :) te kasnije i blog post o stvarima koje su se meni osobno isticale na konfi.

IT Showoff

Slijedeći petak će se u prostoru FERa u Zagrebu održati prvi jubilarni IT Showoff, na kojem ću održati prezentaciju i demo o tome kako i zašto koristiti git. Sa sobom ću imati i N900 i laptop sa složenom razvojnom okolinom za Maemo, pa mi se slobodno javite ukoliko želite popričati o Maemu, N900 te razvoju softvera za ovaj sustav.

IT Showoff

N900 na eHrvatska TV

Kad smo već kod N900, nedavno je ekipa iz eHrvatska TV napravila reportažu o ovom uređaju, Maemou i Linuxu u sklopu koje su i mene priupitali za par pitanja. Snimku reportaže možete pogledati na eHrvatska kanalu na YouTube-u.

This provocation must not be allowed to stand

Alan Boyle, reporting for MSNBC some of the sadder news from the last week:

Nine months after the Spirit rover sank into a Martian sand trap, NASA says the troubled traveler will have to remain stationary in order to survive the Red Planet’s winter.

These fucking Martians keep leaving their deadly sand traps everywhere. No regard for life or property. Can’t we, like, send John McCain up there to keep these guys in line?

03. 02. 2010.

Awesome window manager revisited

Awesome Logo One year ago I wrote a small article about my usage of the awesome window manager. Specifics of awesome and benefits of using it (or tiling window managers in general) I would rather leave for another article. In this one I'd like to revisit some of my projects and code related to awesome. Last year I just upgraded from v2 to v3 which introduced the Lua programming language as a way of configuring and extending awesome. My goal then was to create an identical environment as I had with v2. One of the major obstacles was replacing the Ruby widget library called Amazing with a Lua one called Wicked. I still remember my first widgets, knowing very little Lua I had to resort to Awk to grab battery or mbox information. At the time I just started visiting the #awesome IRC channel on OFTC. I clearly remember someone saying "it would be nicer if it was in Lua"...

A year has passed, so what has changed? Previously I wrote about vicious, a modular widget library written in Lua which builds on the foundations laid down by Wicked. I had certain ideas about widgets that were not shared by a lot of people, so I had to do it for myself. Making Wicked modular would have been a big design change, and on top of that I wasn't confident enough in my Lua so I decided not to contribute back, but to create a new project. Now I am very satisfied how it turned out, I'm satisfied with the code and with contributions of other users. Result is a series of Lua modules that gather data about your system, basically system monitors like those provided by Conky... at the moment we use them to feed awesome widgets but they could be used in other places just as easy. For example one could use them for populating the Ion window manager status-bar. I made the project public sometime in June, it now counts 25+ widget types and gets 10+ downloads daily. It's hard to make an estimate about the number of actual users, but the code was downloaded well over 700 times.

Since I published the vicious git repository I wanted to use the git web interface for more than just those few files, so I put my awesome configuration in git and started pushing the changes. This easy access, a lot of custom (and well commented) code and my solutions to various usability problems quickly made my awesome-configs repo into a very popular starting point for new awesomers. It gets almost as much clone requests and downloads as the vicious repository. My Zenburn theme also became very popular, in fact so popular that from v3.4 it is a part of the awesome distribution. That's not all I contributed to the awesome tree, in recent months I started sending more and more code contributions... I contributed to other open source projects but I'm very proud of being a part of this one. It has a lot of users, most of which are experienced Unix users with an interest in improving their productivity and desktop usability. As someone said on IRC just yesterday "awesome is the ultimate sysadmin console".

One of my modules that is just gaining some attention is the Scratchpad manager. It brings back functionality that was present in v2, but also expands on it by providing a drop-down applications manager, contributed by the author of Wicked. Former Ion users will also be familiar with the scratch.pad functionality, while the scratch.drop module allows users to have their favorite terminal emulator, or application launcher like gmrun, slide in from a screen edge. Another useful module that can be found in my repo is the On-Screen Keyboard, initially written by another awesome user, which I ported to v3.4. You can see it in action in this screenshot.

Finally let's see what other users have been up to. The author of Wicked wrote Eminent - a dynamic tagging library (its functionality will be familiar to WMII users) and Rodentbane - which allows for rapid control of the mouse pointer using only the keyboard. Other notable modules are Revelation (implementing OSX like expose), Shifty (dynamic tagging with advanced client matching) and Obvious (another widget library). With this I conclude my little tour of planet awesome.

Community Fedora Remix 12.2

 
We would like to announce live CD release of Community Fedora Remix 12.2
 
* 100% compatible with Fedora
* Compiz Fusion compositing window manager
* KDE + GNOME desktops
* multimedia support out of the box (mp3 playback)
* additional XFCE and Enlightenment desktops
* GNOME Do – intelligent application launcher (http://tinyurl.com/yntg9l)
* OpenOffice 3.1
* Inkscape, Scribus and GIMP 2.6
* Blender
* Evolution with native Exchange support (mapi)
* Thunderbird 3.0
* better hardware compatibility for broadcom wireless cards
* better printer hardware compatibility
* better games selection
* Educational and astronomy software installed
* Chromium Internet browser + Firefox
* wireless security tools (aircrack-ng and kismet)
* GPS and location apps (TangoGPS and tools)
* Nautilus in browser mode by default
* enabled clicking via touchpad by default
* optimized smaller iso image (1.7GB vs 2GB)
* many other enhancements
 
If you have any suggestion on how to make this Remix better and to get involved feel free to join us and make this Fedora Remix even better.
 
Download links:
direct download: http://iso.linux.hr/fedora-community-remix/
 

01. 02. 2010.

Using btrfs snapshots for incremental backup

You have heard of Apple Time Capsule, and zfs's snapshots which provide nice way to produce incremental backups which you can use to quickly recover a rm -Rf typo or compare changes... You can't really use LVM snapshots for that because they have fixed size of snapshot. ZFS has copy-on-write snapshots, but zfs-fuse isn't fastest solution on Linux.

I decided to give btrfs another try. On Debian 2.6.32-trunk kernels, it stills have problems with 686 kernel, but amd64 version (even with 32-bit users-pace) seems to work stable so far.

Let's take a look at example usage on /dev/vg/koha-btrfs logical volume.

  1. create filesystem
    root@mlin:~# mkfs.btrfs /dev/vg/koha-btrfs
    
  2. create subvolume which we will use for data
    root@mlin:~# btrfsctl -S koha-2010-01-25 /virtual.btrfs/
    
  3. populate it with some data
    root@mlin:~# time cp -ra /virtual.clone/koha-2010-01-25 /virtual.btrfs/
    
    real    15m32.507s
    user    0m1.288s
    sys     0m54.519s
    
  4. create base snapshot
    root@mlin:~# btrfsctl -s /virtual.btrfs/koha-2010-01-25.mlin /virtual.btrfs/koha-2010-01-25
    
    There is convention here: since snapshot directories have to be on same btrfs volume, I decided to use base_name(dot)something as convention for my snapshots.
  5. make some changes on base directory
    root@mlin:~# time rsync -ravH --numeric-ids --sparse --delete --exclude 'backup*' 10.60.0.90:/opl/clone/koha-2010-01-25/ /virtual.btrfs/koha-2010-01-25/
    
    sent 1538957 bytes  received 381670534 bytes  964049.03 bytes/sec
    total size is 18912566086  speedup is 49.35
    
    real    6m37.539s
    user    0m59.524s
    sys     1m23.633s
    
  6. make another snapshot for this version
    root@mlin:~# btrfsctl -s /virtual.btrfs/koha-2010-01-25.opr /virtual.btrfs/koha-2010-01-25
    
Following this, we now have three directories which share same data (tanks to copy-on-write feature in btrfs) and look like ordinary directories:
dpavlin@mlin:~$ ls -ald /virtual.btrfs/koha-2010-01-25*
drwxr-xr-x 1 root root 256 Dec 29 19:38 /virtual.btrfs/koha-2010-01-25
drwxr-xr-x 1 root root 256 Dec 29 19:38 /virtual.btrfs/koha-2010-01-25.mlin
drwxr-xr-x 1 root root 256 Dec 29 19:38 /virtual.btrfs/koha-2010-01-25.opr
After a while, you will run out of disk space, but since we are on LVM, extending filesystem is really easy:
dpavlin@mlin:~$ mount -t btrfs
/dev/mapper/vg-koha--btrfs on /virtual.btrfs type btrfs (rw,noatime)


root@mlin:~# lvdisplay /dev/vg/koha-btrfs 
  --- Logical volume ---
  LV Name                /dev/vg/koha-btrfs
  VG Name                vg
  LV UUID                kl4QUc-IyK2-IM8m-0DKD-eI5k-H2T1-HySIwE
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                40.00 GB
  Current LE             10240
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

   
root@mlin:~# lvextend -L +10G /dev/vg/koha-btrfs
  Extending logical volume koha-btrfs to 50.00 GB
  Logical volume koha-btrfs successfully resized


root@mlin:~# btrfsctl -r max /virtual.btrfs/

Hopefully this will help you to get started with btrfs snapshots. I still don't consider it super stable (especially since i did saw few kernel oopses using 2.6.32-trunk-686) but for quick experiments with Linux containers (or anything stored on filesystem for that matter) it proved more than adequate.

28. 01. 2010.

It's about system, stupid!

lib-architecture-v2.png When you are working as system architect or systems librarian, your job is to design systems. My initial idea was to create small Google out of 12 machines which are dedicated to be web kiosks. I decided to strictly follow loosely coupled principle, mostly to provide horizontal scaling for my data processing needs. I wanted to be able to add machine or two if my query is too slow... This easily translates into "now long will I have to wait for my page to generate results"....

I decided to split my system into three logical parts: network booting, data store, and quick reporting. So, let's take a look at each component separately:

When I started implementing this system last summer, I decided to use CouchDB for storage layer. This wasn't really good choice, since I didn't need transactions, MVCC or replication. Hack, I even implemented forking for document stored in CouchDB to provide faster response to clients in PXElator.

Moving to much faster MongoDB I got ad-hoc queries which are usable (as in I can wait for them to finish) and if that's too slow, I can move data to Sack and query it directly from memory. As a happy side effect, making shards from MongoDB is much faster than using CouchDB bulk HTTP API, and it will allow me to feed shards directly from MongoDB to Sack nodes, without first creating shards on disk.

I'm quite happy how it all turned out. I can configure any host using small snippet of perl code in PXElator, issue ad-hoc queries on audit data on it in MongoDB or move data to Sack if I want to do data munging using perl.

As you noticed by now, I'm using live distribution for kiosks, and machines do have hard drivers in them. Idea was to use those disks as storage with something like Sheepdog. seems like perfect fit. With it in place, I will have real distributed, building size computer :-).

27. 01. 2010.

His Last Bow

I have seen the Sherlock Holmes reboot. It is a movie that provides good entertainment; a dark mystery, solid action scenes, fantastic London scenery and an excellent director. The plot and characters are no different than anything else coming out of Hollywood these days, so it is bearable... but when I combine what I just said with the fact that the story revolves around one of my favorite characters ever I can't but be disappointed, utterly.

Reinventing, or better said rewiring, the character is acceptable... a darker Holmes, filthy, unshaven and manic is legitimate. But they had to poison it with American macho bullshit, which is especially hard to stand. Holmes even has a women in this story, he who is "not a whole-souled admirer of womankind", that is just preposterous. The movie ends by hinting there will be a sequel (they will milk it dry, no doubt) and I hope it will be better than this. But now I am certain there will never be a better Holmes than the role played by Jeremy Brett in the 1984 Granada TV series. He is, and will remain without any doubt, The Holmes.

I love that adaptation, and enjoy watching those episodes, he adds so much to the character; the short bursts of laughter, the mood swings and his eccentric hand gestures... Robert Downey Jr. is not even close. Watching Jeremy Brett play is rewarding, he was Holmes, truly living the role and completely absorbed in it. The Wikipedia article explains it all, and sheds more light on what became of Mr. Brett. Even though Granada filmed a lot of episodes they did not cover all the stories. Fortunately we can get them all for free today, on a site like Project Gutenberg.

26. 01. 2010.

10 najboljih igara za Linux

Na Twitteru se stvari odvijaju brzo. U stvarnom vremenu. Netko je spomenuo kako bi bilo dobro da se sastavi računalo za Ivana i već je na popisu komponenti za više računala. Zapravo Twitter je brži od stvarnog vremena, za sastavljanje i isporučivanja računala proći će malo više vremena. Povod ovog posta je jedan od ogranaka u vremenskoj liniji u kojem je Berislav rekao da ne trebaju firme poklanjati programe već da klincu instaliraju Ubuntu, na što mu je odgovoreno da će se klinac vjerojatno željeti poigrati pa Linux nije najbolja opcija. Ne mogu navesti adresu tih cvrkuta jer jedna od ptičica skriva svoje cvrkute od javnosti.

Berislav je onda prozvao mene da pokažem igre za Ubuntu. Nije baš da pomno tu pratim problematiku, ali mogu pomoći, ipak u kući imam male pingvine koji se igraju. :-)

Linux/Ubuntu je čak i bolja opcija za klinca jer neće imati problema s maliciozinim nametnicima, a smanjeni izbor igara će ga možda natjerati da se prije počne zabavljati s nečim kreativnim. ;-)

Prije nego što spomenem autohtone igre za Linux treba napomenuti da na njemu možete pokrenuti cijeli niz emulatora za konzole (zsnes, psx), pod wineom radi veliki broj PC igara, a ima i lijepi broj DOS igara koje ni danas nisu za baciti i mogu se vrtjeti u dosboxu. Slijedi lista koja danas ovako izgleda (ali već sutra bi zacijelo bila drugačija)…

1. Mindrover je najbolja igra ikada. Točka. Barem za programersku vrstu. Sastavljanje malih robota za borbu je jako dobra vježba za logičke sklopove vašeg uma. Teško je nabavljiva (probajte je naći na Amazonu), na mreži se mogu naći demo inačice koje rade i pod novim distribucijama. Izgleda da je firma Cogni Toy propala, ali bilo bi dobro naći nekoga tko je zadužen za ostavštinu pa da Mindrover proglasi javnim dobrom.

2. Frozen Bubble je jedna od onih jednostavnih, logičkih igara koje igrate ponovno i ponovno i ponovno…Stanuje u svakoj distribuciji.

3. X-Plane je najbolja simulacija leta za osobna računala. 29$ je mala cijena za takav biser. Ali za početne letove dobro može poslužiti i FlightGear.

4. World Of Goo je jedna odlična slagalica s primjesom fizike. Simpatično, lijepo, igrivo. Neki nivoi će nove igrače malo frustrirati, ali ova igra nudi izazov i vježbu da vaše male sive stanice.

5. The Battle for Wesnoth je strategija na poteze fantastične tematike. Neki kažu da je u rangu Panzer Generala.

6. FooBillard je simulacija biljara. Ako vas zanima samo igra teško da možete naći bolju.

7. Frets On Fire je nešto kao Guitar Hero, a kako je sada dosta popularan pretpostavljam da to i Fretsu diže ocjenu.

8. Scorched3D je modernija, 3D inačica igre Scorched Earth koju nazivaju majkom svih igara.

9. World of Padman je tu na listi zato jer ja nikada nisam volio igrati FPS-ove (zadnja koju sam odigrao do kraja je Wolfenstein3D), a znam da ima ljudi koji bi mi mogli zamjeriti kad ne bi bilo nijednog FPS-a na listi pa eto ga. ;-)

10. Tux serija igara kojima je zajedničko to što im je glavni lik pingvin i što su nastale s ciljem da poboljšaju ponudu igara na Linuxu. Ističu se Tux Racer (da je Janica pingvin…), SuperTux (da je SuperMario pingvin…), SuperTuxKart

S ove liste izostao je cijeli niz igara, od FPS-ova kojih ima najviše i gdje je izbor poprilično veliki, do portova s Windowsa (Egosoft je preveo X2 i X3 za Linux). Pristojna je i ponuda MMO igara (Second Life, Savage 2, Vendetta Online, A Tale in the Desert), WOW radi pod Wineom, pa Linux igrači imaju dovoljno načina za gubljenje vremena. ;-)

25. 01. 2010.

Git početnica, 2. dio - grananje, spajanje, rebaziranje

U prethodnom postu u serijalu o korištenju distrbuiranih sustava za verzioniranje projekata pokazao sam osnove korištenja git-a, ali se nisam dotaknuo zanimljivih dijelova kod kojih distribuirani sustavi pokazuju svoju pravu stranu - grananje projekata u različite verzije, spajanje verzija nazad u jednu i repozicioniranje pojedinih grana u odnosu na druge grane (rebasing).

Ovi pojmovi koriste se u većini (svim?) distribuiranim SCM sustavima, ali se ovdje situacija već dovoljno komplicira da različiti sustavi na ne posve identične načine pristupaju istom problemu. Zbog toga je ovaj post posve specifičan i priča o git-u. Ukoliko koristite neki drugi SCM, imajte na umu da je stvar slična, ali se pojedinosti vjerojatno podosta razlikuju.

Grananje (branch)

U našem hello world projektu zasad imamo samo jednu granu, master, na kojoj smo radili sve promjene. To nam je odgovaralo jer smo točno znali što želimo napraviti slijedeće i nismo imali potrebe raditi više stvari paralelno (ili eksperimentirati u više različitih smjerova odjednom).

No, sada bismo željeli početi pisati i dokumentaciju za projekt. Kako nam se promjene vezane uz dokumentaciju ne bi mješale sa eventualnim nevezanim promjenama koda koje ćemo možda htjeti raditi, dokumentaciju ćemo dodavati u posebnoj grani projekta koju ćemo na kraju spojiti u glavnu. Kreirajmo novu granu doc iz postojeće master grane i odmah se prebacimo u nju:

> git checkout -b doc master
Switched to a new branch 'doc'

Za početak ćemo samo kreirati datoteku README.txt i u nju staviti osnovnu informaciju o programu:

Ovo je tipični "Hello World" program pisan u C-u.

Dodajmo datoteku u repozitorij, napravimo commit, i pogledajmo što smo dobili:

> git add README.txt
> git commit -m "dodan README"
[doc 7bb37b0] dodan README
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.txt
> git log
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic 
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 459b8bd04f3667425705d29f2c3a10bb45e79f5c
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:53:32 2009 +0100
malo uljepsano

commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100
prva verzija

Kako smo granu doc stvorili iz grane master, ona je uključuje sve dosadašnje promjene. Ovaj prikaz nam nije previše koristan ukoliko želimo vidjeti samo razliku između trenutne grane i mastera. To možemo napraviti ovako:

> git log master..HEAD
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

Argumentom master..HEAD zatražili smo log svih promjena do zadnjeg commita u trenutnoj grani (HEAD) koje se ne nalaze u master grani. Osim od-do, parametar može biti i samo jedna oznaka, čime se traži log svih promjena od početka do te oznake. Tako će git log master prikazati log svih promjena na grani master bez obzira u kojoj smo grani trenutno. Oznaka HEAD uvijek pokazuje na posljednji commit u trenutnoj grani, pa je git log HEAD isto što i samo git log.

Dokumentiranje našeg programa dobro napreduje, ali paralelno s tim sjetili smo se da bi htjeli napraviti još neke kozmetičke promjene na programu. Na njima želimo raditi nezavisno o procesu dokumentiranja pa ćemo kreirati novu granu. Kako ne bi imali poluzavršenu dokumentaciju u novoj grani, novu granu beauty ćemo opet kreirati iz master grane:

> git checkout -b beauty master
Switched to a new branch 'beauty'

Trenutna inačica programa nije posve legalan C program, stoga ćemo je opet malo doraditi, tj. preraditi u nešto pristojnije:

#include <stdio.h>

int main(void)
{
  printf("Hello world\n");
  return 0;
}

Sada smo već napravili nekoliko grana i u svakoj po nekoliko commitova i sve je teže pratiti gdje se nalazi što. Podsjetimo se koje grane imamo i što one sadrže:

> git branch
* beauty
  doc
  master
> git log master..beauty
commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

> git log master..doc
...
> git log master
...

Spajanje grana (merge)

Nakon što smo napravili sve što smo htjeli i sve committali te nakon što smo zaključili da smo zadovoljni promjenama na ovoj grani, željeli bismo je spojiti nazad u master.

Napomena: radi jednostavnosti primjera, ovdje nam se grana sastoji od samo jednog commita te ćemo je odmah spojiti nazad, što izgleda kao puno kompliciranja nizašto. No u stvarnom radu promjene obično nisu ovako trivijalne i grane se sastoje od nekoliko (možda desetke) committova, kod čega branch/merge ima smisla.

> git checkout master
Switched to branch 'master'
> git merge beauty
Updating 459b8bd..5e54751
Fast-forward
 hello.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

Prilikom ovog mergea, master nije imao nikakvih dodatnih commitova kojih nema u beauty grani pa se git nije morao mnogo mučiti sa spajanjem - samo je napravio fast-forward odnosno zalijepio sve nove commitove iz beauty grane u master granu. Pomoću git log možemo se uvjeriti da se uistinu radi o istim committovima (jedinstveni ID im je jednak).

Spajanjem grana beauty nije nestala. Ona još uvijek postoji, iako sad kad su svi njeni commitovi i u masteru, nema razlike između nje i mastera - jednako kao da smo je tek sad kreirali. U daljnjem radu opet možemo koristiti istu granu i dodavati nove committove koje periodički spajamo nazad u master. Stvar je izbora (i specifične organizacije projekta na kojem radite) želite li imati dugotrajnije grane koje periodički spajate s masterom ili za nove promjene radite nove grane.

Ukoliko odlučimo da nam grana više ne treba, možemo je obrisati:

> git branch -d beauty
Deleted branch beauty (was 5e54751).

Repozicioniranje grana (rebase)

Sretni sa dosadašnjim napretkom na master grani, vraćamo se nazad na doc. No sada master ima neke comitove koje doc nema. Zasad nema problema, git bi comittove pametno spojio, no ukoliko i ubuduće mijenjamo master (tj. dodajemo nove comitove), razlika će se sve više povećavati i sve će veća biti vjerojatnost da (slučajno ili namjerno) negdje modificiramo istu stvar i uzrokujemo konflikt.

Kako bi to minimizirali, dugovječne grane možemo repozicionirati, tj. rebazirati (rebase). Rebaziranjem pomičemo točku u kojoj se grana “odvojila” od grane iz koje smo je stvorili (ovdje, mastera), tako da izgleda kao da smo je tek sada stvorili.

> git checkout doc
Switched to branch 'doc'
> git rebase master
First, rewinding head to replay your work on top of it...
Applying: dodan README

> git log
commit 6c0516dbe782173b57997039576e3b38bc20997c
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

Primjetite da je nakon rebaziranja “dodan README” comit ispao zadnji, iako je zadnja promjena koju smo mi stvarno na cijelom projektu napravili bio “popravljen kod” u beauty grani. Također, primjetite da se ID zadnjeg comitta promjenio - to zapravo više nije isti commit. Radi se o tome da je git doslovno pospremio patcheve, obrisao comittove, a kasnije ih vraćao jedan po jedan i automatski radio nove comittove.

repozicioniranje grane

repozicioniranje grane

Kao rezultat toga, grana doc više uopće ne izgleda isto. Ako solo radite na projektu, to za vas ne igra nikakvu ulogu. Ali ukoliko nekoliko ljudi radi na istom projektu, potreban je oprez - ukoliko je netko kod sebe povukao vašu granu, a vi ju naknadno rebazirate, stanje comittova u toj grani u vašem repozitoriju više se neće slagati sa stanjem u njihovom repozitoriju. Kod takvih situacija osnovno pravilo je - nikad ne modificirajte povijest grane koju je netko drugi već povukao od vas.

Merge ili rebase?

Nije odmah očito zašto bi radili rebase ako već imamo spajanje grana, no postoji razlika. Kod spajanja promjene iz druge grane “naljepe” se na trenutnu granu. Ukoliko dođe do konflikta, nemamo informaciju koji od comitova iz trenutne grane je uzrokovao konflikt. Stoga ga nećemo moći niti prepraviti, nego ćemo rješenje konflikta samo zalijepiti kao još jedan novi commit.

Spajanje logički znači “sav dosadašnji rad na grani koja se spaja sa trenutnom granom od sada se nalazi i u ovoj grani”. Ukoliko bismo koristili merge za povlačenje novih promjena mastera u doc, efekt bi bio kao da smo rekli “ok, od sada će nam doc biti glavna grana u projektu”.

Za razliku od toga, repozicioniranje znači “promjeni trenutnu granu tako da izgleda da sam sve promjene radio nad sadašnjim sadržajem mastera (odnosno granom nad kojom radim rebase - baznu granu)”, odnosno svojevrsno “osvježavanje patcheva” koje imamo u odnosu na master. Konkretno, rebase radi slijedeće:

  1. privremeno miče sve comittove iz trenutne grane koji nisu u baznoj grani i sprema ih na sigurno
  2. povlači sve nove comittove iz bazne grane koji nisu u trenutnoj (fast-forward), nakon čega bazna grana i trenutna grana imaju isti sadržaj
  3. jedan po jedan vraća nazad comittove koji su spremljeni na sigurno

Ukoliko u nekom trenu dođe do konflikta, rebase će se zaustaviti i imat ćemo priliku prepraviti commit koji uzrokuje konflikt. Na taj način praktički “osvježavamo” trenutnu granu, tako da promjene koja ona predstavlja budu primjenjive na trenutno stanje bazne grane. Ovo nam omogućuje da imamo dugovječne grane sa relativno velikim promjenama u odnosu na baznu granu, a da te promjene uvjek budu ažurne.

Kada koristiti rebase ili merge možete pročitati i u Linusovom mailu o toj temi na LKML - “Some git best practices” post na LWN sadrži malo šire objašnjenje za nas koji ne pratimo LKML.

Join us next time…

Rukovanje granama je vjerojatno najbitniji i najkompliciraniji dio git-a. Nakon što smo to apsolvirali, možemo se opet baciti na laganije, a opet korisne stvari koje korisnicima gita život čine ugodnijim i lakšim. Pridružite mi se slijedeći put dok istražujem interaktivno dodavanje promjena, pretraživanje povijesti, tagiranje, cherry-picking, …

24. 01. 2010.

MongoDB - so you want fast NoSQL database which you can grok

I have been using CouchDB for some time now, mostly as audit storage for PXElator. Audit data stores are most useful for ad-hoc queries (hum, when did I saw that host last time?), and CouchDB map/reduces took half an hour or more. I wrote mall script couchdb2mongodb.pl to migrate my data over to MongoDB (in 26 minutes) and run first query I could write after reading MongoDB documentation about advanced queries. It took only 30 seconds, compared to 30 minutes or more in CouchDB. I was amazed.

This was NoSQL database which I can understand and tune. MongoDB has indexes and profiler so tuning query down to three seconds was a simple matter of adding an index. All my RDBMS knowledge was reusable here, so I decided to take a look why is it so much faster than CouchDB for same data...

To be honest, MongoDB, High-Performance SQL-Free Database by Dwight Merriman, CEO of 10gen won me over to finally try MongoDB. It was technical enough to make me think about MongoDB arhitecture and benefits. It's clearly pragmatic, let's re-think horizontally scalable hash storage with ad-hoc queries model, but with funny twist about close coupling with language types all encoded in BSON format, which is very similar to Google's protocol buffers.

First, let's have a look at raw side of data on disk. At some level, it will translate to number of IO operations involving rotating platters and usage of buffer cache.

root@opr:~# du -hc /var/lib/couchdb/0.9.0/.pxelator* /var/lib/couchdb/0.9.0/pxelator.couch
655M    /var/lib/couchdb/0.9.0/.pxelator_design
23M     /var/lib/couchdb/0.9.0/.pxelator_temp
7.8G    /var/lib/couchdb/0.9.0/pxelator.couch
8.4G    total

root@opr:~# du -hc /var/lib/mongodb/pxelator.*
65M     /var/lib/mongodb/pxelator.0
129M    /var/lib/mongodb/pxelator.1
257M    /var/lib/mongodb/pxelator.2
513M    /var/lib/mongodb/pxelator.3
513M    /var/lib/mongodb/pxelator.4
513M    /var/lib/mongodb/pxelator.5
17M     /var/lib/mongodb/pxelator.ns
2.0G    total
Here is a first hint about performance: MongoDB's 2G of data (which are used as mmap memory directly, leaving flushes and caching to OS layer) are almost a perfect fit into 3G of RAM memory I have in this machine.

MongoDB has montodump utility which dumps bson for backup and it's even smaller:

root@opr:~# du -hcs dump/pxelator/*
1.1G    dump/pxelator/audit.bson
4.0K    dump/pxelator/system.indexes.bson
76K     dump/pxelator/system.profile.bson
1.1G    total

So I switched PXElator to use MongoDB as storage. I never pushed anything in production after just one day of testing it, but first query speedup from 30 min to 30 sec, and ability to cut it down to 3 sec if I added index (which took about 13 sec to create) is just something which provides me with powerful analytical tool I didn't have before.

20. 01. 2010.

Reading Wikipedia on N900

N900 is a device with a lot of connectivity options and a very capable browser. With that, it’s a good Wikipedia reader out of the box. But not so if your connectivity is limited (you’re on top of a mountain, or roaming, or don’t have a data plan alltogether and there are no open wifi hotspots).

Since I got a great Christmas gift from Collabora I’ve been poking at a small toy application that could store and read Wikipedia articles offline. Since Wikipedia hosts a huge number of articles, and device capabilities are limited compared to a desktop PC, this posed an interesting (but not unsolvable) challenge for the weekend hack sessions.

The result is Mawire (Maemo Wikipedia Reader):

Mawire 0.1 - home screen

Mawire 0.1 - home screen

Mawire 0.1 - search results

Mawire 0.1 - search results

Mawire 0.1 - Article view

Mawire 0.1 - Article view

The application

Having worked on bits and pieces in Maemo 5, I knew my way around the Maemo 5 SDK and some of the APIs, but nevertheless the Developer’s Guide was of great help. I’ve also perused examples, code (such as browser launcher) and packaging from marnanel’s raeddit application.

The application is a lightweight reader, so the aim is not to display complete article, but rather to show enough information for a quick check, and provide convenient way for the user to find more on the Wikipedia itself.

install mawire
At the moment you can download the application from here, or browse or download the source code from github. I hope to upload it to maemo-extras soon. If you’re reading this from your N900, you can install mawire automatically by clicking on the install icon. Warning: It’s an early development (alpha) version, only tested on my device so far, so proceed with caution and only if you know what you’re doing.

Since writing this blog post (but before I hit the Publish button), I’ve played around with portrait mode functionality, and released version 0.2 which has portrait mode support. If your keyboard is closed, mawire will switch to portrait mode. When you slide it open at any time (e.g. for typing search queries, or when you want to copy/paste part of the article), mawire will switch to landscape mode.

Data handling

Since Wikipedia (especially the English edition) has a huge number of articles, amount of text for a complete and comprehensive copy is just too large to conveniently use on the device. Recent enwiki dump contains more than 3 million articles and is almost 6GB of bzip2′d XML.

To minimise database size, and since I wasn’t trying to replicate complete Wikipedia functionality, I decided to strip the articles as much as possible, not only of markup (so only bold and emphasis are preserved), but also to only include content of a few first paragraphs - up to the first heading. The idea is that topic overview is probably outlined first, and then each paragraph expands the coverage (often also having a complete article of its own).

So, the reader only includes the overview and provides “Read more…” button that connects to Wikipedia proper. So the app can be used not only as offline reader, but as quick Wikipedia launcher by itself.

The other problem is number of articles and search performance. If database contains up to a few million articles, sequential searching through the database is extremely slow. Unfortunately, the version of SQlite3 shipped on N900 (and indeed in many Linux distros ATM) doesn’t support fast fulltext search (FTS3), which is ideal for mawire.

So, the application currently ships with its own copy of SQLite library with enabled FTS3 module. It’s installed in a private lib directory so it doesn’t clash with the OS version (similar to what Firefox on Linux distros does), and is only ever used by mawire.

The data itself was prepared by a Python program that:

  1. parses the XML dump (using expat),
  2. extracts, parses and strips Wikipedia markup (using a bunch of hacked regexps, as I haven’t found a suitable wikimedia markup parser - this is the weakest part of the program and I hope to improve it in the future),
  3. filters articles we want to exclude (special pages, lists of things, too short articles),
  4. compresses the article text (using zlib) and finally stores them to a SQlite3 database (using SQLalchemy).

The final step is manual, building of FTS3 index, and consists of two SQL statements. This is so it could be done separately, on a machine having SQLite with FTS3.

The program is included in mawire source code, so you can use it to create custom Wikimedia databases (or, indeed, database for any MediaWiki powered wiki).

install mawire-enwiki-small A database of selected articles (3000 most visited + featured + good + vital; about 14 thousand articles in total) from English Wikipedia (13.6MB). Database is installed in /opt so it doesn’t fill up your rootfs.

Complete English edition, as well as several other major language editions are also available, but I haven’t created Maemo packages for them. You can download them directly, put them on your device or MMC card and select from the application menu.

19. 01. 2010.

OmniKey CardMan 5321 supported by librfid

CardMan-5321_free.jpg I had OmniKey CardMan 5321 reader sitting on my desk for quite some time. First time I tried it, I had problem with propitiatory binary driver which expected pcscd to be compiled without hal support to make it work.

Fortunately, we now have pcsc-omnikey package in Debian which should make usage of this reader much easier. But, I really wanted more low-level implementation, allowing me to muck with cards without need to pass through whole smart card stack (since I'm really only interested in RFID part of this reader).

So, I did some searching and found out that librfid - A Free Software RFID stack implements support for this reader, so here is a quick overview of how to get started:

# build dependency
dpavlin@klin:/rest/cvs/librfid$ sudo apt-get install libusb-dev

# checkout source
dpavlin@klin:/rest/cvs$ svn co https://svn.gnumonks.org/trunk/librfid/
dpavlin@klin:/rest/cvs$ cd librfid/
dpavlin@klin:/rest/cvs/librfid$ ./autogen.sh

# build
dpavlin@klin:/rest/cvs/librfid$ ./configure --enable-ccid
dpavlin@klin:/rest/cvs/librfid$ make
Now we can test if our reader is working:
dpavlin@klin:/rest/cvs/librfid$ sudo ./utils/librfid-tool -s
lt-librfid-tool - (C) 2005-2008 by Harald Welte
This program is Free Software and has ABSOLUTELY NO WARRANTY

initializing librfid
opening reader handle OpenPCD, CM5x21
No OpenPCD found
scanning for RFID token...
Layer 2 success (ISO 15693):  eb 6e 77 1f 00 01 04 e0
And, that's not all. We can also read content of our tag:
dpavlin@klin:/rest/cvs/librfid$ sudo ./utils/librfid-tool -r -1
lt-librfid-tool - (C) 2005-2008 by Harald Welte
This program is Free Software and has ABSOLUTELY NO WARRANTY

initializing librfid
opening reader handle OpenPCD, CM5x21
No OpenPCD found
Layer2 init ok
Layer 2 success (ISO 15693)[8]: ' eb 6e 77 1f 00 01 04 e0'
block[  0:00]sec:0x8 data(4):  04 11 00 01
block[  1:01]sec:0x8 data(4):  31 33 30 32
block[  2:02]sec:0x8 data(4):  30 32 39 37
block[  3:03]sec:0x8 data(4):  31 30 00 00
block[  4:04]sec:0x8 data(4):  00 00 00 00
...
block[ 26:1a]sec:0x8 data(4):  00 00 00 00
block[ 27:1b]sec:0x8 data(4):  57 5f 4f 4b
no data(read_block(28)>> -1)
It's exactly what I was looking for: ability to do low-level block transfer with RFID card.

This is great news since I don't have to carry bulky 3M reader and antenna with me to conferences to demonstrate RFID. Since I didn't find librfid first time I searched for software to drive this reader, I hope that this post will be helpful to someone.If you intend to buy RFID reader, take a look at OpenPCD instead of this one :-)

16. 01. 2010.

Fedora virtualization has rough edges

 
After seeing lots of buzz about Virtualization improvements in Fedora 11 and 12 it was time to give it a try. I have experience using desktop virtualization over 10 years; mainly VMWare in beginning and in last few years mostly VirtualBox, but also qemu with kqemu via command line. VirtualBox is the preferable one because of it’s ease of use for desktop virtualization.
 
After installing virt-manager in Fedora 12 I hit first speed bump on the road to native linux virtualization – it failed to install libvirt (bug reported). Without libvirt virt-manager GUI just sits dead in the water. How such an obvious thing got unnoticed so far? Is anybody actually using virt-manager after installing Fedora 12 from live cd?
 
It was a simple thing to install libvirt and start the service, but something that basic should be done automatically. After starting virt-manager I was pleased with it clean looking UI.
 
The idea was to install Ubuntu and see how it performed in this virtual environment, but virt-manager only offers root partition as storage location of virtual image. That is just not acceptable for various reasons.
 
On my system root is used only for Fedora, also usually reformated on every new Fedora release. Root partition on my system is 10GB – plenty of room for Fedora but not for additional virtual images. There is no reason why virt-manager shouldn’t have a choice where to save your virtual images, I guess that I’m not the only one who would like to save virtaulization storage images in /home partition (bug reported).
 
After consulting qemu wiki it was a simple step of issuing qemu-img create -f qcow2 .virt-manager/ubuntu.img 6000M and choose that image in virt-manager. Installation went flawless, resizing VM display to fit my window worked great.
 
One thing that is missing are tools similar to VirtualBox Guest Additions that enable mouse to be used in both VM and on Fedora without VM needing exclusive right to use the mouse, and then pressing CTRL+ALT keys to ungrab the mouse to make is available on Fedora desktop again. And also clipboard sharing.
 
Native linux virtualization for desktops looks closer and closer to being a really nice experience, I know that virt-manager guys will fix these issues so go ahead and try it out and share your experience with it.
 

14. 01. 2010.

Agile web development in 2010

I have been developing web application since 1995, and things have changed a lot since than. Back in the old days, we tried to render good in text-only browsers and machines where much slower back than. Why it that important? I had interesting problem today: write csv file filtering application in an hour.

Basically, I had one hour to make semi-formated csv file somehow searchable. It had sub-totals, and you wanted to type some words and search for then within each section (they all have to be in same section to make section visible as result). Since data is really textual report from SQL database, it seemed somehow logical to put it back into database and write complex SQL query to return just parts of it. Or store it in full-text search. In 1990 or so...

But, let's take a look in directory: I have 600K csv file. I decided to write simple cgi wrapper which understands sections (and ignores rest), basically streaming csv converted to html table back to client (which provided nice incremental rendering for bigger result sets). I had simple input-box, submit button, html table application in one hour. And it was used 522 times today, speeding up manual search and retrieve work with papers.

Let's think about this situation again. There is only one simple rule for agile: scale your solution to your problem, not to your technological preferences. Rest of the day, I spent fighting utf-8 encoding (in 2010 still, sigh!), aligning columns and formatting floating numbers (with few style="color:gray" here and there) and added highlight to lines within section which match search words.

At the end of the day, I added a simple summaries on the bottom. Not bad for 1 hour/1 day application.

12. 01. 2010.

IT Showoff 2010

Jedan tweet me podsjetio na zametnuto obećanje. Ako još niste onda pogledajte što će se to događati na FER-u 12.02.2010. A ako imate želju da predstavite svoj projekt, neku ideju, inovativno rješenje problema ili bilo što slično tome onda imate još jedan dan da prijavite predavanje.

IT Showoff nije se vezao uz samo jednu tehnologiju, besplatan je za sve sudionike, a od svih posjetitelja se očekuje aktivno sudjelovanje u raspravama i diskusijama. Ptičica mi je šapnula da je u planu i jedan okrugli stol na kojem bi secirali različita razvojna web okruženja pa pretpostavljam da će to mnogima biti zanimljivo.

Ja sam razmišljao o tome da predstavim jedan svoj svrabež, jedan problem za kojega mislim da bi se mogao bolje riješiti nego što se on sada rješava. Kako nemam vremena da sam krenem u njegovo rješavanje ja bih par svojih ideja i razmišljanja o njemu predstavio zainteresiranima, a ako bi ta zrnca pala na plodno tlo možda bi mogli zajedno uzgojiti jedan uspješan open source projekt.

A sad idem natipkati prijavu…

11. 01. 2010.

Kako dobiti naša slova na Nokii N900

Ne znam koja će situacija biti jednom kad se N900 počne prodavati kod nas, ali ukoliko imate primjerak izvana, nemate hrvatsku tastaturu nego najvjerojatnije koristite englesku. Ako vam kojim slučajem zatrebaju naši dijakritici (recimo prilikom pisanja službenog maila :), dovest ćete se u neprilike.

Jedno jednostavno rješenje je nadodati naše dijakritike na kombinacije Fn + kursorske tipke, na kojima po defaultu nema nikakvih drugih simbola. Kako naših dijakritika ima 5, osim kursorskih tipki možemo se poslužiti i BackSpace tipkom.

Kako bi layout bio što sličniji onom na normalnim tipkovnicama, na svojoj Nokii postavio sam ga tako da mi Fn+Up bude Š, Fn+BackSpace Đ (malo poetske pravde je u tome da je davno prije BackSlash bio Đ :), Fn+Left Č, Fn+Down Ć, Fn+Right Ž.

Kako biste to napraivli i kod sebe, morate biti u shellu i imati root privilegije, za što vam pomoći programčić zvan gainroot. Napomena: ovim lako možete dovesti svoju N900 u stanje da se ne može bootati, stoga budite pažljivi, ne radite ovo ako niste sigurni šta radite; ne odgovaram za bilo kakve nastale probleme.

Remapiranje tipkovnice radite editiranjem datoteke /usr/share/X11/xkb/symbols/nokia_vndr/rx-51. Prije editiranja datoteke, svakako napravite backup kopiju. Napomena: Backup kopiju nemojte spremati u isti direktorij, jer će vam se N900 odbiti bootati slijedeći put!

U datoteci pronađite liniju koja spominje <BKSP> (BackSpace tipka), i promijenite je u:

key <BKSP>   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ BackSpace, dstroke ] };

Nakon toga na samom dnu datoteke pronađite blok xkb_symbols "arrows_4btns" i promijenite ga u (odlazak u novi red nakon znaka “=” je tu samo zbog čitljivosti u blog postu - u datoteci možete svaku definiciju staviti u svoj red):

xkb_symbols "arrows_4btns" {
    key <UP>   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Up, scaron ] };
    key <LEFT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Left, ccaron ] };
    key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Down, cacute ] };
    key <RIGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Right, zcaron ] };
};

(Update: popravio nazive simbola, originalno sam krivo postavio uglate zagrade).

Spremite datoteku i isprobajte odmah novi layout naredbom setxkbmap. Ukoliko vam naredba vrati grešku, popravite datoteku ili vratite backup - nemojte niti slučajno ostaviti nepravilnu datoteku, jer će vam se kod slijedećeg boota N900 odbiti podići.

Update: ispravio pogrešno napisan naziv komande, hvala Saši na dojavi.

Nakon uspješnog učitavanja novog layouta, naši dijakritici odmah su vam dostupni u svim aplikacijama, koristeći kombinaciju Fn+kursorske tipke ili backspace, za mala slova, odnosno Shift+Fn+tipke za velika slova.

Inspiraciju i sve potrebne informacije za post našao sam na Maemo wikiju, gdje možete pronaći još informacija o ovome i mnogim drugim hackovima za vašu N900.

Update: pripremljenu datoteku možete preuzeti ovdje. Datoteku skopirajte na gorenavedenu i svakako provjerite na goreopisan način (meni provjereno radi, ali ne garantiram da će i vama i ne snosim posljedice ako bude problema).

10. 01. 2010.

Fedora 13 as semantic desktop?

 

 
Nautilus + Tracker tags integration
 
After viewing this video I tried enabling Fedora (Gnome) to have these semantic desktop features.
 
yum install nautilus-python tracker-search-tool tracker
 
After restarting nautilus I enabled nautilus sidebar but didn’t see this feature there. Is this a bug or am I doing something wrong?
 
You can read about this feature more in this article: A Metadata Enabled GNOME
 
I also posted a bugzilla bug report regarding this issue and there is also a Fedora forum post also (not posted by me).
 
UPDATE:
After reading blog post from Debarshi some things got much more clear, so what we need is newer version of tracker in Fedora, this could be a cool new feature. Fedora 13 should have semanatic desktop features if it is possible, all Fedora users would surely appreciate that.

Protocol analysts of DRAC remote console

As you know by now, I have been playing with Dell's remote consoles in hope that I will be able to connect from my Linux to Dell's RAC reliably. Currently, I have to run Windows XP with Internet Explorer and Java in kvm to have access to my servers, and that's clearly not reliable combination.

DRAC is PCI card which is presented to system as VGA which then transfers screen updates over the network to client. It also allows virtual media, but in a sense, it's mix-up of http over ssl and few propitiatory protocols:

It's very strange that all documentation calls 5900 video redirection port and 5901 keyboard/mouse redirection when all traces of traffic between client and server clearly show that ports are swapped in implementation.

Did you notice ssl encrypted keyboard/mouse channel? I first decided to tackle this problem with well known SSL man in the middle approach. I decided to use simpliest possible approach first using something like:

apt-get install stunnel

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem

# https mitm
stunnel -p cert.pem -d 443 -r 5443
stunnel -c -d 5443 -r 10.60.0.100:443

# 5900 mitm
stunnel -p cert.pem -d 5900 -r 5999
stunnel -c -d 5999 -r 10.60.0.100:5900
and than recoding all output using wireshark:
sudo tshark -w /tmp/drac.pcap -i any 'port 5999 or port 5901 or port 5443'
This allowed me to capture all unencrypted traffic into single pcap file which proved very useful for initial protocol analysis using wireshark. In short, you have to do following:
  1. make https connection to https://drac/cgi-bin/webcgi/winvkvm?state=1 and acquire vKvmSessionId console redirection authentication key
  2. connect to keyboard/mouse port 5900 forcing SSL_cipher_list to supported RC4-MD5 cipher and send vKvmSessionId
  3. connect to video port 5901
Finding supported cipher for communication between us and server was a real problem. They are using openssl-0.9.7f and I had to downgrade all the way to Debian woody to make stunnel work. Same problem is visible with latest firmware update for DRAC where Active X plugin doesn't have old enough configuration in SSL handshake and doesn't work any more. Java plugin, on the other hand, provides much more cipher options, so one of them still works. ssldump was very useful for finding such problems.

Fortunately, kost was much more persistent than me, and he found out that adding 'SSL_cipher_list' => 'RC4-MD5' will force supported cipher. Armed with that new finding, I was able to modify kost's ssl mitm script up to the point where I can see decrypted key-presses, mouse movements and video settings. Hack, I even wrote drac-vkvm.pl async client which does steps outlined above.

All is not well, unfortunately. When sending authentication request, we need vKvmSessionId which we get from web server, but packet which is sent contains also two bytes which change with session. I haven't been able to figure this part out, and since same two byte sequence is needed to open video channel (to see VGA output) so I'm stuck.
Bytes don't look like crc16, and source code doesn't provide any hints about secondary 16-bit auth info. It seems that client calculates it somehow, since both connections close when I try to send different values for it.

I could write session recorder, but that isn't terribly useful, because it still forces me to use Windows+Java setup to access my console. I will collect usefull snippets about Dell's RAC protocol on wiki.

Koliko dođe jedan OIB?

Došlo je i vrijeme primjene famoznog OIB-a. Kao što snijeg zna iznenaditi zimsku službu usred zime tako je i OIB iznenadio mnoge. Neki su ga dočekali poluspremni jer su shvatili da im nedostaju OIB-ovi njihovih poslovnih partnera. Na svu sreću Porezna uprava je izložila web API uz pomoć kojeg je moguće doznati OIB bilo kojeg pravnog subjekta uz pomoć bivšeg matičnog broja. Osim OIB-a moguće je dohvatiti i službeno ime poslovnog subjekta pa možete ažurirati i nazive vaših korisnika.

Ako mislite da je to prelijepo da bi bilo istinito onda vam moram reći da je stvarno prelijepo da bi bilo istinito.

I dok se vani lijepo vide naznake trenda oslobađanja javnih podataka kod nas je trend obrnut. Australija ima Australian Business Number Lookup API koji omogućava ono što sam naveo u prvom odjeljku. Hrvatski poduzetnici će jednokratno ažuriranje svojih podataka platiti. APIS - IT d.o.o. će vam jednokratno uparivanje starih matičnih brojeva i OIB-a za 2000 partnera naplatiti 1600 kn, a ako imate 10000 korisnika onda vam treba samo 6700 kn.

Zakon o OIB-u navodi da evidenciju o brojevima vodi Porezna uprava, a u njemu stoji i da Ministarstvo financija – Porezna uprava osigurava korisnicima broja, na njihov zahtjev, dostupnost podataka o osobnim identifikacijskim brojevima primjenom informacijskih tehnologija, poštujući propise o zaštiti osobnih podataka.

Bilo bi logičnije da servise vezane uz OIB nudi Porezna uprava, njoj je u interesu da svi koriste OIB na propisani način i zbog toga bi spomenuti servis trebao biti slobodno dostupan, a ne pod komercijalnim uvjetima.

Imamo cijeli niz podataka koji bi trebali biti javno dostupni na što jednostavniji način.

05. 01. 2010.

Free software izbori

U sezoni (političkih) izbora vrijeme je za moj tradicionalni izbor free & open source softvera kojeg koristim u svakodnevnom radu i zabavi na računalu. Kako je to izgledalo pred dvije godine pogledajte u ovom postu. A ove godine, krenimo redom:

Editor - (G)VIM

Uza sve moje pokušaje i isprobavanja drugih editora, uvijek se vraćam VIM-u (odnosno njegovom grafičkom pandanu GVIM-u). Većina piskaranja koje radim je zapravo programiranje, za što je ovaj editor upravo idealan. Još uvijek sam na newb razini, ali svake godine upamtim par zgodnih shortcutova .. za jedno 20tak godina ću biti guru :) Mali demo što sve VIM može (otprilike polovicu ovoga još ne koristim .. kao što rekoh, newb sam) pogledajte u izvrsnoj Perl.Hacks.On.Vim prezentaciji.

Web browser - Google Chrome

Velika promjena u zadnje dvije godine - većina browser opcija sada je bazirana na WebKit engineu, a jedino se Firefox drži svojeg Gecka. Novi rat browsera koji se zahuktava u poslijednje vrijeme osigurao je da svi browseri budu mnogo kvalitetniji nego njihove starije inačice - Firefox više nikako nije neosporni vlasnik Linux desktop browser mindsharea.

Pri najavi Google Chrome browsera bio sam prilično nezadovoljan overhypeom koji je dotični doživio. Nakon izlaska bete za Linux, prebacio sam se par dana na nju i mogu zadovoljno reći da Googlovci nisu podbacili - browser je stvarno kvalitetan. Nakon tjedan-dva testiranja, sve svoje browsanje prebacio sam na Chrome. Zasad mi se subjektivno čini stvarno brži od Firefoxa (3.5). Koliko je stvar u činjenici da je Firefox opterećen raznoraznim ekstenzijama i alatima (jeste li znali da Firebug usporava JavaScript čak i na stranicama gdje nije upaljen?) a koliko u stvarnoj brzini enginea i rendera, vidjet ću s vremenom kad se i na Chromeu nakupi po par ekstenzija.

Jedna stvar koja mi se kod Chromea sviđa za razliku od Firefoxa je jednostavnost pisanja ekstenzija - jednostavne ekstenzije se mogu napisati u par desetaka linija JS-a, za razliku od mnoštva boilerplatea kojeg treba pripremiti za Firefox.

Kao lagano off-topic zanimljivost, napomenuo bih da iako koristim Google Chrome kao browser, ne koristim Google kao tražilicu (niti GMail, niti Google Docs, … koristim GMaps kad mi zatreba te GTalk iz Empathya); umjesto toga, koristim DuckDuckGo! zbog toga što mi daje preglednije, relevantne rezultate, a njihov 0-click info box je u većini slučajeva točno ono što me i zanima. U par mjeseci korištenja mislim da nisam više od 2-3 puta zatražio drugu “stranicu” rezultata. Mana DuckDuckGoa su slabiji rezultati za .hr prostor i slabiji rezultati ukoliko copy-pasteam neki dugački opis greške; za te stvari i dalje ručno odem na Google.

Grafičko sučelje - XMonad

Pomalo je depresivno da današnja računala subjektivno ne djeluju mnogo brža od računala koje smo koristili pred 5 ili 10 godina. Naravno da objektivno jesu mnogo brža - dovoljno je samo usporediti grafiku sadašnjih i tadašnjih igara, ili sadašnje multimedijske mogućnosti sa tadašnjim playbackom poštanskih maraka ili kockastih filmova niske rezolucije. Sama GUI sučelja su mnogo rafiniranija, sa više opcija, efekata i slično. Ali opet, pomalo je to depresivno.

Isprobavši par alternativa, otkrio sam da mi je od laganih rješenja najzgodniji XMonad, window manager pisan u Haskellu (isprobavanje XMonada pogodilo se vremenski sa čitanjem izvrsne Real World Haskell knjige o tom programskom jeziku). XMonad mi se učinio stvarno user-friendly, mnogo više od awesome WM-a pisanog napola u Lui, iz jednostavnog razloga što sam za awesome morao odmah editirati konfiguracijsku datoteku (i učiti Luu) dok za XMonad još uvijek nemam nikakvu konfig datoteku - stvar radi po defaultu točno ono što želim.

Kad sam već maknuo Metacity, rješio sam se i GNOME panela, a kako niti Nautilus ne koristim često, izbacio sam i njega. Da izbjegnem pokretanje gnome-sessions-daemona samo zbog gnome-screensavera, zamjenio sam i njega xscreensaverom, a kad već idem u tom smjeru, i gdm sam zamjenio xdm-om.

Networking - male shell skripte

Izbacivši GNOME Panel ostao sam i bez Network Managera (cnetworkmanager, komandolinijski alat, nije pretjerano korisna stvar). Srećom, Nikola mi je otkrio wicd, zamjenu za NetworkManager sa dobrim grafičkim i terminal klijentima. No zbog nekih problema drivera wireless kartice na svom laptopu, kod resumea treba reinicijalizirati driver pa sam cijelu stvar automatizirao sa par shell skripta i otkrio da mi je i sam wicd nepotreban.

Terminal - GNOME Terminal

Kako na kraju ispada da većinu stvari radim / pokrećem iz komadndne linije, bitno mi je da je terminal emulator lagan i brz. Kao pobjednik pokazao mi se GNOME Terminal, jer iako nije lagan po potrošnji memorije i prvom startupu, najbrži je u prikazu antialiasinih TrueType fontova (a od Inconsolate se ne odvajam).

E-mail - Thunderbird 3

Thunderbird 3 pokazao mi se kao odličan mail klijent - osim vidljivih unapređenja u odnosu na verziju 2 (bolji i brži search, tabovi, tagiranje), pokazao mi se kao mnogo bolji u hendlanju velikih IMAP foldera s kojima svakodnevno radim.

Media centar - XBMC

Da sam ovaj post pisao pred 3 tjedna, pod ovu stavku stavio bih Moovidu (nee. Elisa), vrlo dobar media centar baziran na GStreamer frameworku. No Moovida mi zna imati problema sa nekim formatima (ponajviše .mkv) i updateom librarya, a pogotovo sa hendlanjem velike količine fajlova u mojoj glazbenoj kolekciji (zbog čega trenutno koristim i remote kontrolirani Music Player Daemon). XBMC ne pati od tih boljki, također ima podršku za pluginove te mi se zasad ukupno čini kao bolji sustav.

Chat - Empathy

Kako sam jedan od developera na Telepathy projektu (kojeg je i Empathy client jedan dio), nije nikakvo čudo da mi je Empathy najdraži IM client. No otkad imam N900, više chatam sa njega (opet pogonjeno Telepathyem) nego sa laptopa…

Twitter - Chromed Bird

Rudimentaran, ali ima sve što meni treba (pregled svog timelinea, reply, retweet, skraćivanje linkova putem bit.ly-a). Neko vrijeme sam koristio Thwirl i poslije Gwibber, ali prvi mora učitati popriličan AIR runtime a drugi WebKit. Za razliku od njih, Chromed Bird nema praktički nikakvi dodatni load na sustav.

03. 01. 2010.

2010: Sumrak PC računala

Sumrak u ovom slučaju znači da će se svjetla pozornice okrenuti ne neke druge strane. Klasičan desktop PC će se i dalje koristiti, ali masovna korisnička baza će migrirati na neke druge uređaje i platforme. Jedan od najčešćih razloga za korištenje PC računala je pristup Internetu i korištenje različitih servisa. Sada se u toj ulozi sve bolje snalaze mobilni telefoni, ove godine možemo očekivati i veći nalet tableta i readera, a uskoro će standardni dio opreme svakog televizora biti i web preglednik.

Nema sumnje da će Appleov uređaj protresti tržište. Nakon što ga konačno predstave budemo vidjeli tko je u svojim nagađanjima bio najbliži istini. Neki od tih prognozera tvrde da Apple neće predstaviti e-reader, ali meni se čini da je najlogičnije da Apple predstaviti uređaj kojemu će to biti osnovna funkcionalnost. Novinska industrija je u krizi, treba pronaći nove načine kako da dođu do potrošača svojeg proizvoda. Apple ima veliku bazu korisnika koji su potrošači digitalnog sadržaja i bili bi idealni za neki novi iNews servis. U cijeloj toj priči je cijena takvog sadržaja jedan od glavnih faktora i ona bi trebala biti dovoljno mala da kupovina bude impuls, a ne da korisnik razmišlja o cijeni.

Najveća greška bi bila kad bi izdavači odlučili da za digitalni sadržaj traže isti iznos kao i za papirnato izdanje. Na tragu te greške je i ponuda e-izdanja Večernjeg lista. Iznos godišnje pretplate na e-izdanje je osjetno manji od godišnje pretplate na papirnato izdanje, ali prvo što će korisnik vidjeti je da su cijene za jednodnevno e-izdanje i obično izdanje iste. I tu nema mjesta za impulsnu kupnju. Ovaj tjedan me privukla reklama o sniženjima na Steamu. Nisam baš neki igrač, ali nabavim tu i tamo neko klasično izdanje. Pronašao sam ono što sam tražio, ali učinilo mi se da cijena nije bila dovoljno niska za reklamirano sniženje. Bio sam u pravu, traženi klasik sam pronašao u klasičnom e-dućanu koji isporučuje igre na dobrim, starim optičkim medijima, cijena je bila niža. Istog trena sam zaboravio na Steam i sad čekam poštara. Digitalni sadržaj mora biti povoljniji.

Jedna od stvari koje bi pridonjele sumraku klasičnih PC računala je dock za pametne telefone. Kad bi postojao uređaj koji bi mojim pametnjakovićima omogućio prikaz na većem zaslonu i tipkanje na normalnoj tipkovnici, siguran sam da bi se moje računalo puno više odmaralo. I siguran sam da nisam usamljen u toj svojoj potrebi. Snaga pametnih telefona danas je dovoljna da zavrte web preglednik na normalnoj rezoluciji, već imamo oslabljene inačice uredskih aplikacija za takve uređaje, a bez problema bi mogli poslužiti i kao klijenti za web aplikacije iz oblaka. Poslovni ljudi više sa sobom ne bi trebali nositi prijenosna računala ukoliko bi na svakom koraku imali dock za svoj pametni telefon. O ovoj ideji razmišljam već godinama i čudi me kako nitko nije pokušao napraviti nešto slično.

Klasičan PC će se naći u poziciji radija i televizije. Ljudi će ga i dalje koristiti, naročito profesionalci, ali masovni potrošači će više voljeti nešto drugo.

P.S. Kolega Gadgeterija je odradio BlogMaraton naspram kojeg Project52 izgleda smiješno nezahtjevan, ali ja sam mu se pridružio što znači da ovu godinu možete očekivati najmanje jedan post tjedno. To je u svakom slučaju više i redovnije od onoga što sam vam pružio prošle godine. :-)

30. 12. 2009.

Dell's RAC support under Linux == drek

Back in 2007 I wrote draft of blog post about semi-working solution for remote console on Dell's servers. I never finished it, but now I got a few more Dell servers and I'm not impressed. Linux support is even worse. Drek is shit in Croatian, btw.

First, update your RAC to latest firmware. It's a challenging task on Dell's web (I did it three times allready and still I can't remember procedure, so I'm documenting it here): search for drac 4 firmware (DRAC 4/I) and select newest version available (due to ranking sorting this can be hard task, select date sort). If you have DRAC 5, searching over Dell's site isn't much help. But, you can hop directly to ftp site and select file with name f_drac5*.exe.

Now download hard-drive format (it's self-extracting zip) and extract firmware:
dpavlin@t61p:~/Downloads/dell/2800$ unzip f_0603v17en_d4.exe 
Archive:  f_0603v17en_d4.exe
  inflating: firmimg.dm1             

dpavlin@t61p:~/Downloads/dell/2900$ unzip f_drac5v145_A00.exe 
Archive:  f_drac5v145_A00.exe
  inflating: firmimg.d5              
Upload firmimg.* via web interface (if you have really old version of RAC, you might need IE to do this, but recent versions from last year or two work also with Firefox. Firmware update doesn't work with Google Chrome). This is just the beginning of Internet Explorer dependencies, so get used to it.

Good idea is to ping your DRAC while uploading firmware. While flash is programming, you will get interruption in ICMP echo reply, but that's not a reason for worry. It will come back.

After all that, you still won't get Linux support. At least not with recent Firefox. Lousy work, Dell! How are you accessing your Dell servers from Linux?

28. 12. 2009.

Dump streams using mplayer and at

As you probably know, this part of the year is mostly about Chaos Communication Congress with a lot of great lectures, but you might want to record a stream or two.

When I want to schedule something at specific time, I usually use at but mplayer is picky, so at the end I used following script:

#!/bin/sh -x

mplayer http://streaming-26c3-wmv.fem-net.de/saal$1 -noconsolecontrols \
   -dumpstream -dumpfile saal$1-`date +%Y%m%dT%H%M%S`.wmv &
This will allow mplayer to detach from console, so it will work in backup. Happy hacking!

Update: stopping streams manually is not fun, so here is improved script which has three arguments: room number, from time and to time

#!/bin/sh -x

# usage: record.sh 1 13:45 15:15

room=$1
from=$2
to=$3

url=http://streaming-26c3-wmv.fem-net.de/saal$room
file=`date +%Y%m%d`-$from-$to-saal$room

echo "Record $from - $to $url -> $file"

echo "mplayer $url -noconsolecontrols -dumpstream -dumpfile $file.wmv" | at $from
echo "kill \`ps ax | grep $file\`" | at $to

If you need to see all jobs scheduled, use atq. However, there is no easy way to correlate which task will execute in which time slot in atq output, so I wrote small atq.pl script which displays commands which will be executed (you will need to run it with root privileges).

18. 12. 2009.

Fedora needs a GPS Gnome menu?

 
There are some really cool gps applications and tools in Fedora repositories, but where are they located in Gnome menu once you install them?
 
I found some in Education (Viking), in Graphics (xgpx, xgps speed) and in Internet menu (Gpsdrive, gpsman, TangoGPS, VIking).
 
Surely GPS apps could be better grouped? Maybe they should even have their own menu? What are your thoughts on this?
 

13. 12. 2009.

LDAP server application integration with virtual LDAP

You have your new shiny application, and LDAP server on the other side. Easy as pie. What can go wrong?

I had written about my saga with LDAP about augmenting LDAP search responses and exposing RDBMS data as LDAP server. But today, I added rewrite of bind, so now I can use unmodified Koha, and all needed quirks for my AAI@EduHr schema are outside application.

This made my attempt to virtualize LDAP almost complete so I created a project page on Ohloh. I will write small updates about status there, so If any of this is interesting to you, hop over there.

iRecovery Fedora Howto

 
Some time while jailbreaking and unlocking process iPhone refuses to boot in normal mode and every time you restart your iPhone it enters in Recovery mode. This situation is named as recovery mode loop. If you are in a recovery mode loop (i.e. your phone enters recovery mode on every reboot).
 
To get the rid of recovery mode loop we use iRecovery, iRecovery is a libusb-based command line utility for Mac OS X and Linux (perhaps Windows too). It is able to talk to the iBoot/iBSS in Apple’s iPhone/iPod touch via USB. If you are on Windows then you need to install LibUsb-Win32 in order to run iRecovery.LibUsb-Win32 is a port of the USB library libusb the Windows operating system. The library allows user space applications to access any USB device on Windows.
 
There are a few gotchas on Fedora so here are step by step instrucions.
 


su -
yum install readline-devel git
exit
git clone git://github.com/westbaer/irecovery.git
cd irecovery/

 
There is a bug in irecovery.c code so in order to make it compile I needed to delete line 323 containing this code:
signal(SIGINT, irecv_quit); // Close USB on ^C
 
Use vim, gedit or any other text editor or your choice and delete this line, because it won’t compile if you don’t remove it, and you will get this error:
irecovery.c:323: error: ‘SIGINT’ undeclared (first use in this function)
 
Now we can continue the compilation process:
 


ln -s /usr/include/readline .
make linux

 
Now you have iRecovery installed and can use the instructions on how to use it to Get Rid of iPhone from Recovery Mode Loop on Restart.
 

11. 12. 2009.

Distributed SCM, 2. dio - osnove rada sa git-om

git logo

U prošlom postu pokušao sam objasniti zašto je korištenje nekog DVCSa dobra ideja, čak i ako jedini radite na projektu, čak i ako se ne bavite programiranjem.

Kako to izgleda u praksi, vidjet ćemo uz primjere korištenja git sustava. Git je vjerojatno najpopularniji DVCS danas - koriste ga Linux kernel (za kojeg je i napisan), X.Org, GNOME i mnogi drugi projekti. Osim git-a, popularni DVCSovi danas su mercurial (hg) (Python, Mozilla, OpenSolaris) i bazaar (bzr) (Ubuntu). Iako se pojedini pojmovi i način rada pomalo razlikuju od sustava do sustava, osnovna ideja je ista.

Za primjer projekta uzet ćemo Hello World program u C-u pod Linuxom. Osim samog programa (hello.c datoteka), projekt će sadržavati i Makefile datoteku za buildanje programa te README.txt sa uputama za program.

Inicijalizacija repozitorija

Kako tek započinjemo s projektom, kreirat ćemo novi prazni direktorij hello i u njemu inicijalizirati prazan git repozitorij (u mom primjeru, projektni direktorij kreirao sam u home (~) direktoriju):

> mkdir hello
> cd hello
> git init
Initialized empty Git repository in ~/hello/.git/

Git sve svoje podatke sprema u poddirektorij .git vašeg projekta. Za razliku od SVN-a, koristi se samo jedan za cijeli projekt, a ne po jedan za svaki direktorij unutar vašeg projekta.

Ukoliko ste već prije započeli rad na projektu, a želite početi koristiti git na njemu, možete pokrenuti git init izravno u direktoriju projekta. Ukoliko želite raditi sa repozitorijem nekog projekta koji već koristi git, originalni repozitorij možete klonirati i onda raditi na svom klonu. Primjer za Empathy (GNOME chat client):

> cd /tmp
> git clone git://git.collabora.co.uk/git/empathy.git
Initialized empty Git repository in /tmp/empathy/.git/
....

Committanje

Jednom kad ste inicijalizirali projekt (na bilo koji način), možete raditi promjene i spremati ih. Kreirajmo datoteku hello.c i u nju spremimo prvu verziju našeg Hello World programa:

void main() { printf("Hello world\n"); }

Brza provjera pokazuje da se stvar kompajlira uz neka upozorenja. Za početak smo zadovoljni pa želimo spremiti prvu verziju. Da bi to napravili, gitu moramo reći da mora voditi računa o datoteci hello.c te da smo je upravo promijenili:

> git add hello.c

Napomena: ovaj add ne znači da smo datoteku dodali u repozitorij, nego smo datoteku označili za spremanje u slijedećem commitu. Pošto datoteka još nije bila spremana u repozitoriju, prilikom commita će biti stvorena. Napravimo commit sa komentarom “prva verzija” (ukoliko ne dodate komentar u komandnoj liniji, otvorit će vam se editor pa se možete raspisati do mile volje):

> git commit -m "prva verzija"
[master (root-commit) ac3a485] prva verzija
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 hello.c

Git nam govori da je spremio prvi commit u master granu (branch). Master grana uvijek postoji u git repozitoriju (osim ako radite čudne stvari :) te se automatski stvara kod inicijalizacije novog repozitorija ili kloniranja postojećeg, te je po defaultu aktivna.

Pogledajmo što zasad sve imamo spremljeno u master grani:

> git log
commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100
prva verzija

Ovaj čudan niz znakova u prvoj liniji je jedinstveni ID commita. Kada želite pregledavati pojedine committove, vraćati se natrag u prošlost, preuzimati committove iz jedne grane u drugi i slično, obično trebate koristiti ovaj ID. Ne brinite, ne trebate ga ručno utipkavati cijelog - git je dovoljno pametan da ga prepozna iz prvih par znakova (bar 4, ali ukoliko ima više committova koji počinju sa istim znakovima, onda možete specificirati i više znakova). Pogledajmo detalje ovog što smo upravo spremili:

> git show ac3a
commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100

prva verzija

diff --git a/hello.c b/hello.c
new file mode 100644
index 0000000..d08059a
--- /dev/null
+++ b/hello.c
@@ -0,0 +1,2 @@
+void main() { printf("Hello world\n"); }
+

Commit se sastoji od jedinstvenog ID-a, različitih polja (najčešća su Author i Date, ali može ih biti još), poruke koja opisuje što se napravilo (može biti jedan ili više redova), te same promjene u diff formatu. U ovom slučaju kreirali smo novu datoteku pa u diffu piše da je prethodna verzija bila /dev/null :)

Da biste pogledali zadnji commit, ne morate navoditi njegov ID. Tako smo istu stvar mogli napraviti i samo pozivanjem git show.

Work tree, staging area

Krenimo dalje sa našim projektom. Prva verzija datoteke nije baš reprezentativni C kod, pa ćemo je malo uljepšati. Editirajmo hello.c da izgleda ovako:

void main(void)
{
  printf ("Hello world\n");
}

U ovom trenutku u našem radnom direktoriju (work tree) postoje promjene koje još nismo pospremili. Nepospremljene promjene možemo vidjeti u diff formatu:

> git diff
diff --git a/hello.c b/hello.c
index d08059a..145804e 100644
--- a/hello.c
+++ b/hello.c
@@ -1,2 +1,4 @@
-void main() { printf("Hello world\n"); }
-
+void main(void)
+{
+  printf ("Hello world\n");
+}

Ukoliko je promjenjeno više datoteka, razlike za pojedinu datoteku (ili pojedini direktorij) možemo vidjeti navodeći njeno ime: git diff hello.c. Primjetite da će git diff pokazati promjene samo u datotekama koje prati, odnosno one za koje ste mu rekli da su dio repozitorija. Čim datoteku jednom označite sa git add, git će je pratiti (sve dok je ne obrišete sa git rm). Pregled stanja radnog direktorija, s popisom promjenjenih praćenih(tracked) i popisom nepraćenih (untracked) datoteka možemo vidjeti sa git status.

Označimo datoteku za spremanje:

> git add hello.c
> git diff
> git diff --cached
diff --git a/hello.c b/hello.c
index d08059a..145804e 100644
--- a/hello.c
+++ b/hello.c
@@ -1,2 +1,4 @@
-void main() { printf("Hello world\n"); }
-
+void main(void)
+{
+  printf ("Hello world\n");
+}

Nakon označivanja za spremanje, git diff više ne prijavljuje nikakve razlike! To je zbog toga što su razlike sada u pripremi za commit (staging area). Pripremljene razlike možemo vidjeti sa git diff --cached. Ukoliko smo nešto zeznuli pa ne želimo napraviti commit nad njima, git reset miče promjene nazad iz staging area i možemo ih nakadno opet označiti za spremanje. Napomena: git reset, ukoliko dodate još neke parametre (npr. –hard koji briše promjene i iz radnog direktorija, ili id committa, koji vas “vraća” na taj commit i briše sve naknadne promjene), može biti vrlo opasna po vaše podatke. Prilikom eksperimentiranja svakako pročitajte manual za git-reset.

Ukoliko samo želite označiti sve promjenjene datoteke (koje su dodane u repozitorij, tj. git ih prati) i napraviti commit svih njih, to možete učiniti ovako:

> git commit -a -m "malo uljepsano"
git commit -a -m "malo uljepsano"
[master 459b8bd] malo uljepsano
 1 files changed, 4 insertions(+), 2 deletions(-)

Uz ove osnove možete već početi raditi sa repozitorijom, spremati i pregledavati svoje promjene, ali zasad se git ne čini previše različitim od CVS-a ili SVN-a. U slijedećem postu bacit ćemo se na zanimljivije stvari - branching, merging, rebasing. Stay tuned :)

10. 12. 2009.

Distributed Source Code Management, 1. dio - što, kako i zašto

Bavite li se programiranjem, dizajnom ili nekim drugim kreativnim radom na računalu?

DVCS For The Win

tree

Ukoliko je odgovor da, vjerojatno koristite neki sustav za rukovanje različitim verzijama vašeg uratka, pa makar to bili to direktoriji nazvani “novo”, “novije-2″, “staro-prošli-tjedan”. Moguće je da već i koristite neke od mnogobrojnih VCS / SCM sustava; no, podržava li sustav koji koristite i distibuiran rad?

Čak i ako sami radite na projektu i nitko nikada neće vidjeti ništa osim finalnog proizvoda, isplati se koristiti distribuirani sustav za verzioniranje projekta (DVCS - Distributed Version Control System) — osim jednostavnosti zbog toga što nije potrebno konfigurirati i spajati se na centralni repozitorij (čak i ako on bio na vašem lokalnom disku), DVCS-ovi vam pružaju nešto mnogo više, a to je puno, puno veća sloboda u eksperimentiranju na vašem projektu.

A kod kreativnog rada gdje možete imati mnogo draftova koje kombinirate, bacate u zaborav, vučete nazad iz ladice, slažete jedne preko drugih i na kraju dobijate konačan proizvod, ta sloboda u eksperimentiranju je ključna.

Što ne valja kod klasičnih sustava…

Kod klasičnih sustava (u koje spada i “kreiram-backup-direktorije-svako-malo” ad-hoc pristup), princip čuvanja verzija je linearan. Imate neku početnu verziju vašeg uratka, napravite promjene na njoj i kad ste zadovoljni pospremite novu verziju negdje na sigurno (npr. commit na server ili novi backup dir). Ukoliko kasnije saznate da ste nešto zeznuli, uvijek se možete vratiti na raniju spremljenu verziju, odnosno imate beskonačni undo.

Ali, jednom kada se vratite u prošlost (odlučite da novija verzija ne valja) i krenete drugim smjerom (kreirate novu granu projekta), praktički ste prisiljeni baciiti sve načinjene promjene u smeće, čak i ako dio njih još uvijek ima smisla. U teoriji vi možete iz zadnje verzije izvući dio promjena koji želite sačuvati i onda to primjeniti na novu granu. U praksi, svatko tko je radio netrivijalne SVN mergeove ili ručno kopirao izrezani dizajn i onda prepravljao da paše po drugom layoutu zna da to nije nimalo zabavan posao. U praksi, vi ručno morate napraviti posao koji bi VCS trebao moći napraviti za vas.

Zbog toga, najčeće se commitovi rade jednom kad ste prilično sigurni da je stvar ono što bi htjeli da bude. Rezultat toga je da se commit više koristi kao checkpoint, tj. pamti se trenutak u kojem je draft u “dobrom stanju”. Odnosno, promjene imeđu commitova su velike i često uključuju detalje koji nemaju nužno veze jedni s drugim, ali ste ih mijenjali u istom vremenskom periodu pa su eto završili zajedno.

… i kako distribuirani sustavi to popravljaju

Za razliku od toga, DVCS-ovi počinju od pretpostavke da postoji puno različitih grana u kojima se projekt neovisno razvija (jedan developer ima bar po jednu granu na kojoj on ili ona radi). Zbog toga si DVCS-ovi daju mnogo truda da osiguraju da se promjene jednog developera mogu jednostavno i sigurno kombinirati sa promjenama drugih, odnosno da se različite grane projekta mogu na siguran način mergeati.

Kako bi to osigurali, DVCS-ovi traže što manje promjene iz commita u commit, jer su male promjene puno manje ovisne o globalnom stanju u kojem je vaš projekt - ovise samo o nekoliko “susjednih” stvari (npr. nekoliko linija ispred i iza promjene u programskom kodu). Na taj način i developere “tjeraju” da promjene spremaju što ćešće i da međusobno neovisne promjene spremaju u različitim committovima.

Isto vrijedi i za vas kao solo developera na projektu. Filozofija DVCS-a je da za svaku ideju u projektu imate po jednu granu, u kojoj onda promjene nižete u puno commitova od kojih svaki sadrži malu promjenu. Ukoliko imate nekoliko stvari (ili alternativa iste stvari) na kojima radite u isto vrijeme, imat ćete nekoliko grana u repozitoriju. Ukoliko se tijekom razvoja pokaže da bi vam u jednoj grani dobro došle promjene koje ste već napravili za drugu granu, jednostavno “povučete” dotične commitove i automatski primjenite njihove promjene.

Odnosno, kod DVCS-ova grane projekta (branches) preuzimaju ulogu koju kod klasičnih VCS-ova imaju committovi. DVCS-ovi comittovi su, pak, dovoljno mali da ih je puno lakše preslagivati i kombinirati — ukoliko i dođe do konfliktalakše je izolirati problem i popraviti ga.

Kako organizirati repozitorij

Ukoliko ste novi u korištenju DVCS-a (ili čak klasičnih VCS-ova), sve ovo vam vjerojatno zvuči prilično zakomplicirano. Evo nekoliko općenitih savjeta kako jednostavno organizirati repozitorij za solo rad:

Za trenutni “dobar” draft (stanje s kojim ste zadovoljni i koje dalje nadograđujete - ono što biste zadnje skopirali u backup direktorij da sve to radite ručno) obično se koristi zasebna grana zvana master. Master je dakle početna točka za promjene koje radite.

Za svaku ideju, dodatak funkcionalnosti, bugfix, alternativu …., koju planirate, otvorite novu granu u kojoj ćete raditi samo na tome. Grana se kreira “grananjem” od mastera. Nakon što napravite par promjena u grani, ona će imati nekoliko comittova više od mastera (tj. sve comittove od prije + par novih koje ste napravili).

Kad ste zadovoljni sa promjenama koje ste napravili (npr. napisali ste i istestirali bugfix za vaš kod), granu spajate nazad u master, tj radite merge. Sustav će to napraviti tako da će uzeti sve comittove koji postoje u vašoj grani i redom ih zalijepiti na master. Ukoliko dođe do konflikta, trebat ćete popraviti samo zeznuti commit.

Da biste minimizirali mogućnost konflikta, trebate samo paziti na nekoliko stvari: da pojedini committovi budu što manji (i stoga što manje ovisini o ostatku koda), da pojedine grane ne rade promjene na istom mjestu (odnosno, ako rade, da koriste isti commit a ne zasebne committove za istu stvar) te da razlika između pojedine grane i mastera bude što manja.

Ovo zadnje zvuči kontra-produktivno - koji je smisao grane ako se ne smije (mnogo) razlikovati od mastera? Ne brinite, dugovječne i velike grane su sasvim česta pojava. Nema nikakve opasnosti da grana ima mnoge committove kojih nema u masteru - kod mergea će se oni samo zalijepiti na mastera i gotovo. Problematični dio su committovi kojih ima u masteru, a nema u dotičnoj grani - ova situacija događa se kad imate više grana pa jednu mergeate u master - ostale grane nemaju committove koje je ta grana sadržavala.

Stoga, da bi se smanjila mogućnost konflikta, ili bar olakšalo njegovo rješavanje, u dugovječnim granama treba s vremena na vrijeme povući u granu nove committove koji su došli u master. To se obično naziva rebase, a radi se tako da se privremeno maknu svi committovi iz grane, povuku se nove stvari iz mastera, a na kraju se committovi iz grane vraćaju jedan po jedan. Na taj način dobija se efekt kao da je grana kreirana iz trenutnog mastera.

Napomena: terminologija i organizacija razlikuju se ponešto od sustava do sustava; npr. neki nemaju više grana u jednom repozitoriju nego je svaka grana repozitorij za sebe. Ali osnovna ideja i način rada isti je za bilo koji od DVCS-ova.

Za kraj, najava

Ako ste nakon svega ovog pomalo (ili malo više od malo) zbunjeni, ne brinite. Stvar u praksi nije toliko komplicirana kako se čini (a moguće da sam je i ja komplicirano objasnio, primam sugestije u komentarima :). Stoga ne propustite slijedeći post u kojemu ću proći kroz osnove korištenja DVCSa koristeći kao primjer git, vjerojatno najpopularniji distribuirani VCS.

git_branch_madness
kako to izgleda kad zakomplicirate stvari ;-)

09. 12. 2009.

xxd: hexdump something quickly

We have all been in this situation: you have two files which are subtly different, and you need to take a quick look in them. Let me point you towards xxd which is part of vim. Users of other editors can stop reading now! :-)

dpavlin@t61p:~/t61p/utf-8-accents$ xxd good
0000000: 506f 7669 6a65 736e 6f20 6172 6865 6f6c  Povijesno arheol
0000010: 6fc5 a16b 6920 766f 6469 c48d 2070 6f20  o..ki vodi.. po 
0000020: 4f73 6f72 750a                           Osoru.
dpavlin@t61p:~/t61p/utf-8-accents$ xxd bad
0000000: 506f 7669 6a65 736e 6f20 6172 6865 6f6c  Povijesno arheol
0000010: 6f73 cc8c 6b69 2076 6f64 6963 cc8c 2070  os..ki vodic.. p
0000020: 6f20 4f73 6f72 750a                      o Osoru.

Now, if I could only find peace of perl code which puts accents back to characters...

07. 12. 2009.

DIY: napravite vlastiti Firefox OS u 3 koraka

firefox-os

Ukoliko ste u zadnje vrijeme pratili IT vijesti, vjerojatno ste već čuli za Google Chrome OS koji je baziran na Linux jezgri i Google Chrome web pregledniku. Ovaj operacijski sustav namjenjen je uporabi samo web aplikacija - niti podaci niti programi se ne instaliraju na računalo.

(Gotovo) cijeli Chrome OS je, kao i sam Chrome open source (po standardnoj Googleovoj “open source” filozofiji: napravi nešto interno i izbaci kod van). Zbog toga je razmjerno jednostavno napraviti vlastitu verziju (npr. sa nekim izmjenama i dopunama) koristeći originalni izvornik kod dustupan u sklopu Chromium OS projekta.

Ali mi ćemo ovdje krenuti drugim smjerom - koliko je teško složiti OS poput Chromea počevši od obične Linux distribucije, sa Firefoxom kao browserom? Vrlo jednostavno! Evo kako:

1. Kreirajte i skinite personaliziranu Slax distribuciju

Distribucija Slax je idealna za ovu priliku. Slax je vrlo mala distribucija koja je istovremeno i Live CD/USB i installer. Još bolje, odmah na web stranicama moguće je uz par klikova odrediti što točno želite uključiti u distribuciju.

Za naš OS, trebat će nam Linux baza (Core), X sučelje (Xorg) i Firefox. Krenite na Build Slax stranicu i isključite višak paketa. (Na popisu spremnih modula je i Opera pa ukliko ste Opera korisnik možete Firefox OS pretvoriti u Opera OS).

Nakon odabira koponenti, preuzmite TAR verziju Slaxa.

2. Modificirajte Live CD/USB da odmah pokreće Firefox

Raspakiravanjem TAR verzije dobit ćete boot direktorij koji sadrži alate za podizanje sustava te slax direktorij koji sadrži osnovni sustav, zapakirane module tzv. rootcopy direktorij koji služi za customizaciju Slaxa. Što god stavite u ovaj direktorij, bit će kopirano na sustav kad se podigne sustav.

Da bi po pokretanju grafičkog sučelja odmah bio pokrenut i Firefox i to u full-screenu, potrebno je kreirati direktorij slax/rootcopy/root i u njemu datoteku .xinitrc koja će specificirati pokretanje Firefoxa umjesto normalnog grafičkog sučelja:

  > cd slax/rootcopy
  > mkdir root
  > echo "/usr/bin/firefox" > root/.xinitrc

Osim ovog, trebamo još maknuti boot izbornik koji se kod Slaxa po defaultu pojavljuje i čeka na korisnikov odabir. Nas zanima samo izravno pokretanje sustava. Konfiguracija za bootloader nalazi se u boot/slax.cfg datoteci. Umjesto cijelog sadržaja datoteke (koji prikazuju grafički boot izbornik) potrebna nam je samo jedna linija (napomena: ovo ide u jednu liniju iako je to ovdje razlomljeno u dvije):

  DEFAULT /boot/vmlinuz initrd=/boot/initrd.gz ramdisk_size=6666
      root=/dev/ram0 rw autoexec=xconf;telinit~4 changes=/slax/ nohd

Ovo je zapravo prepisana linija iz originalnog slax.cfg koja pokreće grafičko sučelje uz dodatak nohd opcije koja osigurava da sustav neće pokušati pristupiti hard diskovima u računalu.

Da bi stvar natrag zapakirali u Live CD koristite priloženu slax/make_iso.sh skriptu koja će kreirati ISO image za CD. Za kreiranje Live USB-a koristite skriptu boot/bootinst.sh koja radi instalaciju izravno na stick. Oprez: pazite da prilikom pokretanja bootinst.sh kao uređaj ne navedete vaš disk, jer skripta modificira MBR i može vam zeznuti sustav.

3. Konfigurirajte Firefox i uključite ekstenzije po želji

Isprobajte netom napravljenu instalaciju, na pravom ili virtualnom računalu. Ja sam koristio ISO image i stvar isprobavao u KVM/QEMU virtualnom računalu, no ako preferirate VMWare ili VirtualBox, stvar je analogna. Računalo (virtualno ili stvarno) trebalo bi imati bar 512 MB memorije kako bi Firefox mogao nesmetano raditi.

Ukoliko je sve prošlo kako treba, Firefox bi se trebao podignuti odmah po startu. Kao dodatni bonus, Firefox na Slaxu po defaultu dolazi sa Chrome-like temom :-)

Slijedeći korak je konfiguracija Firefoxa i instalacija add-onova na standardni način. U svom testiranju ja sam instalirao AdBlock+ i Adobe Flash. Flash instalacija nije automatska, nego je potrebno preuzeti arhivu u tar.gz formatu, raspakirati je, a dobivenu libflashplayer.so datoteku prekopirati u plugins direktorij:

  > cd /root/Downloads
  > tar xzf install_flash_player_10_linux.tar.gz
  > mkdir /root/.mozilla/plugins
  > cp libflashplayer.so /root/.mozilla/plugins

Restartom Firefoxa Flash plugin bi trebao biti aktivan.

Kako se sve radi u ramdisku, sve napravljene promjene će biti izbrisane po gašenju računala. Da bi sačuvali Firefox konfiguraciju, cijeli /root/.mozilla/ direktorij (sa vašeg novog Firefox OS sustava) treba skopirati u slax/rootcopy/root/.mozilla/ direktorij na sustavu gdje slažete instalaciju.

Gotov proizvod: samo vaš Slax Firefox OS!

Nakon što još jednom generirate installer (da uključi i Firefox konfiguraciju), vaš novi OS je spreman! Ukoliko ga zapržite na CD ili postavite na USB stick, možete ga uvijek nositi sa sobom i koristiti na bilo kojem računalu koje možete bootati :)

Ako želite isprobati kako stvar radi, a ne želite se mučiti sa opisanim koracima, konačni rezultat u obliku DVD ISO imagea možete preuzeti ovdje: Slax Firefox OS (ISO, 117 MB). Ukoliko stvar želite testirati na virtualnom računalu, ne trebate pržiti CD, samo vašem omiljenom programu (VMWare, VirtualBox, qemu ili što već) kažite da za virtualni CD koristi priloženi image (a možete ga i “mountati” koristeći DaemonTools pod windowsima ili losetup pod Linuxom).

Jedna napomena uz wireless: Slax bez problema pronalazi i konfigura žičanu mrežu putem DHCP-a. Kako sam cijelu stvar isprobavao u virtulanom računalu, nije mi trebala wireless podrška, stoga ne znam kakva je wireless podrška po defaultu u Slaxu. Dodatnu/alternativnu podršku pružaju dodatni moduli koje je moguće uključiti u vaš Slax sustav pa taj dio ostavljam kao vježbu za čitatelja :)

Osim toga, u daljnjem razvoju bi bilo zgodno kreirati običnog korisnika i složiti pokretanje Firefoxa pod njim (umjesto pod root accountom kako je po defaultu) kako čak i u slučaju kompromitacije Firefoxa ne bi postojala nikakva mogućnost da napadač u otvorenom remote shellu pokuša pristupiti lokalnim diskovima. Naposlijetku, bilo bi zgodno izbaciti sve ostale stvari iz Slax Core i ubrzati boot proceduru za još nekoliko sekundi. Ovo također ostavljam kao vježbu za čitatelja :)

04. 12. 2009.

i-gotU GT200 GPS on Fedora

 
i-gotU GT200 GPS is the greatest pocket GPS gadget you can find, if you are a geek then this is one gadget you have to get.
 
Why is it so great? It is a really cheap GPS device (around 55$ or 45€), it has a great SiRF III chipset and it works as a standalone GPS logging device because it has on-board memory! Did I mention it is really cheap? ;)
 
i-gotU GT200 software that comes with it support only Windows XP, there is no support for Linux, OSX or Windows 7.
 
The good news is that there is a project called igotu2gpx that adds Linux and OSX support for this great device!
 
To get this utility running on Fedora here are step by step instructions on how to do it:

su -
yum install bzr ctags gcc-c++ libstdc++-devel boost-devel qt-devel libusb-devel chrpath
exit
bzr branch lp:igotu2gpx
cd igotu2gpx
/usr/lib/qt4/bin/qmake
make
su
make install
ln -s /usr/local/lib/libigotu.so.1 /lib/
exit


You can use GUI tool by running igotugui command or cli version by using igotu2gpx command.
 
To download gps tracks from your i-gotU GT200 GPS use this command:
igotu2gpx dump --gpx > track.gpx
And to clear GPS memory just use this command:
igotu2gpx --action clear
 
You can use igotU GT200 via USB cable but first you need to initialize it:
su -
modprobe navman
echo -n "0x0df7 0x0900" > /sys/bus/usb-serial/drivers/navman/new_id

 
Now you can start gpsd and all aplications should see GPS dongle:
gpsd -b -N -D2 /dev/ttyUSB0
 
If you want to use igotU GT200 via bluetooth you can use this Bluetooth GPS Fedora howto guide to set it up.
 

02. 12. 2009.

Dohvaćanje i prikaz Twitter lista pomoću PHP-a

Jučer su vam pokazali kako na jednostavan i efektan način na stranicu dodati listu prijatelja.

Inspiriran njihovim uratkom i nedavnom Twitter novotarijom - listama, složio sam malu skriptu koja omogućuje dohvaćanje popisa Twitter korisnika sa neke liste (ili popis svih listi nekog Twitter korisnika) i jednostavno ubacivanje u postojeću stranicu.

Prvo demonstracija; kliknite ovdje kako bi vidjeli popis Twitter lista by Nikola (ja sam zasad prelijen složiti svoje liste pa koristim tuđe :), a nakon toga i ljude na njegovoj listi za odstrel.

Kod za to izgleda otprilike ovako:

<?
  # Učitamo pomoćne funkcije za dohvaćanje lista
  require('twitter-lists.php'); ?>

  # Podesimo parametre za pristup Twitter API-u
  $twitter_username = 'vas_twitter_username';
  $twitter_password = 'vas_twitter_password';

  # Zatražimo popis svih Nikolinih lista
  $liste = twitter_get_lists('nikolaplejic');

  # Zatražimo popis ljudi na linux-people listi
  $linuxasi = twitter_get_list_members('nikolaplejic', 'linux-people');

  # Ispišemo jednostavnu UL sa popisom lista
  display_twitter_lists($liste, 'css-class-za-ul');

  # Analogno za popis ljudi u linux-people
  display_twitter_lists($linuxasi, 'css-class-za-ul');

  # Isti popis, ali uz korištenje IMGova za avatare ljudi
  display_twitter_lists($linuxasi, 'css-class-za-ul', true);

Kod za dobavljanje i ispis lista možete pogledati i skinuti odavde. Podaci sa Twittera se pamte 1 sat, što znači da koliko god da vam stranica bude posjećena nećete preći Twitter limit. Ukoliko Twitter servis nije dostupan (zna se dogoditi :), neće doći do greške nego će dobivene liste biti prazne.

CSS spriteovi se ne koriste jer bi ih trebalo ručno generirati što pobija cijelu poantu ovog koda, a automatsko generiranje (iako moguće) bilo bi overkill i presporo i svakako bi bilo tema za neki drugi put.

Kod bi trebao dobro raditi na bilo kojoj novijoj instalaciji PHP-a (specifično, instalacija biti PHP 5.2.0 ili viši i imati uključenu JSON podršku i podršku za otvaranje URLova kao datoteka)

Ukoliko vam se kod čini koristan, slobodno ga koristite na bilo koji način. Još jednom hvala braći Blagonić na njihovom tutorialu, kako zbog korisnosti tako i zbog inspiracije za ovaj post :)

01. 12. 2009.

HTML5TV: video archive with slide sync without plugins

Last weekend we had Nothing will happen event and I did small presentation about HTML5TV which is:

I have collected some of presentations at http://html5tv.rot13.org/, so hop over there and have a look. If you have more interesting presentations, you can easily fork HTML5TV at github, annotate presentation and submit it for inclusion (or make your own archive if you prefer that). Have fun and let me know what you think about it.

30. 11. 2009.

Linux Mint 8 - Helena

Zadnjih tjedana su me iznevjerila dva tvrda diska pa sam u svoje glavno kućno računalo stavio dva nova diska i povezao ih u RAID 1, zlu ne trebalo. Ako bih se pouzdao u statistiku onda bi mogao računati na to da će me jedno vrijeme zaobilaziti takve havarije, ali dobar stari peh i Murphyevi zakoni uče me da vrag nikada ne spava. I kad je tu novi disk onda sam se odlučio i na novu distribuciju.

Linux Mint i ne bi trebao biti puno drugačiji od Ubuntua jer se na njemu bazira. Instalacija je brza i jednostavna. Prva stvar koja mi se nije dopala je izbornik, više mi se dopada Ubuntu pristup, ali možda je to stvar navike. Ali ja ionako ne koristim izbornik već mi je glavni pokretač Gnome Do. Mintov Software Manager ima problema s njegovim nalaženjem (nije ga našao), ali Package Manager (Synaptic) je sretnije ruke. Nije mi se dopalo ni defaultno mapiranje hrvatske tipkovnice jer su umjesto znakova < i > krajnjoj lijevoj donjoj tipki dodijeljeni \ i |. Izgleda da je to maslo nekog admina kojemu su ti znakovi važni i ne može podnijeti da mora držati Alt Gr da stigne do njih. To što većina tipkovnica na domaćem tržištu na toj tipki ima < i > nekome je manje važno.

Zanemarim li te sitnice, čini mi se da je sučelje Linux Minta kompaktnije i dorađenije od klasičnog Ubuntu sučelja, bliže korisniku. Izbor paketa u osnovnoj distribuciji se razlikuje (npr. Mint nema Evolution već Thunderbird), ali kako je isti repozitorij možete instalirati ono što želite. Prva stvar koju bi novi korisnici trebali napraviti je da barem prolistaju korisnički priručnik, a dalje pomoć i upute neka potraže na forumu i wikiju.

Za par dana moći ću dati potpuniju ocjenu za Linux Mint, ali ovako od prve izgleda da bi mogao zamijeniti Ubuntu na mojem glavnom desktopu koji je tu još od 4.10 inačice.

Ideja za web projekt: usporedba cijena namirnica

Formula za uspješno poslovanje u vremenima recesije:

Uzevši u obzir da je u Hrvatskoj recesija u punom zamahu (i ne zna se kad će joj biti kraj), ova formula je prilično dobar način da procjenite koliko vaša ideja ima ili nema smisla (osim ukoliko za realizaciju projekta treba više vremena nego što očekujete da će kriza trajati).

Jedna od ideja koja mi se u zadnje vrijeme vrti po glavi spada u prvu grupu, odnosno pomaganje korisnicma (i to specifično, krajnjim korisnicima iliti običnim ljudima) da prođu što jeftinije. Uzevši u obzir da su kod nas i inače nakon blagdanskog ludila svi u besparici tijekom siječnja i veljače, upravo sada je pravi trenutak za realizaciju ideje.

Korak prvi: ideja

carts

Ideja je jednostavna - nabava.net za namirnice. Cijene pojedinačnih namirnica obično ne odstupaju mnogo od dućana do dućana (ili od lanca do lanca). Kod veće kupovine (što je i uobičajeno, npr. za tjedan/mjesec dana) te razlike se međusobno poništavaju pa na kraju ispadne otprilike svejedno gdje radite kupovinu.

Ali, ukoliko na osnovu namirnica koje trebate kupiti (a koje su često unaprijed poznate i ne mijenjaju se mnogo od mjeseca u mjesec) izračunate u koji dućan vam je najisplativije ići, ili kupovinu raspodijelite tako da namirnice kupujete u 2-3 dućana na način da u svakom kupujete podskup koji je tamo najjeftiniji, ušteda može biti značajna.

Dakle ideja projekta je web stranica koja bi svojim korisnicima omogućila da:

Korak drugi: realizacija

Osim izrade web servisa (koji su vam, ukoliko se bavite web razvojem, poznata stavka u cijeloj priči), bitan sastojak projekta je i prikupljanje ažurnih informacija o cijenama. Na sreću za projekt, tržište namirnica u Hrvatskoj je prilično okrupnjeno, tako da postoji nekoliko velikih nacionalnih lanaca koji pokrivaju velik dio tržišta. Zbog toga je relativno jednostavno početi s pokrivanjem manjeg broja lanaca, a opet odražavati realno stanje tržišta, pogotovo ako se uzme u obzir da manji “kvartovski” dućančići obično imaju nešto više cijene od velikih trgovačkih lanaca.

Za obavljanje istraživanja tržišta (čitaj: odlaska u dućan i popisivanja cijena) idealna radna snaga su studenti preko SC-a jer posao mogu obavljati bilo kad (kad ionako idu u dućan), nije vremenski zahtjevan i ne zahtjeva nikakve specijalne vještine. Okvirna računica troška:

Ukupno ispada da bi mjesečni trošak praćenja jednog dućana (ili svih dućana istog tipa istog trgovačkog lanca u jednom gradu) bilo 240 kn.

Potencijalni problem kod praćenja dućana je precizno vođenje računa o raznim akcijskim prodajama i sniženjima u pojedinim dućanima (od kad do kad traju, itd). Korisnost i točnog cijelog web servisa prilično ovisi o točnim informacijama o akcijama, jer su modifikacije cijena pri akciji po iznosima veće od samih razlika “osnovnih” cijena od dućana do dućana.

Pod pretpostavkom da veliki trgovački lanci mijenjaju cijene namirnica od regije do regije, očita startna pozicija za projekt bi bio Zagreb, čisto zbog velikog broja stanovnika. Ukoliko neki lanac ima unificirane cijene namirnica u cijeloj državi, još bolje, ispitivanjem na samo jednom mjestu može se utvrditi cijena svih dućana za cijelu zemlju.

Ukoliko se u Zagrebu ograničimo na 6 najvećih lanaca: Konzum, Billa, Interspar, Plodine, Getro, Mercator i uzmemo u obzir da Konzum ima 3 klase dućana (SuperKonzum, “mali” SuperKonzum i kvartovski Konzumovi dućani), a Billa i Mercator po 2 (po tome što sam vidio dosad), to je 10 različitih vrsta dućana. Mjesečno praćenje cijelog Zagreba po gornjoj računici koštalo bi ukupno 2400 kn.

Korak treći: korisnici

Za uspjeh projekta ključno je imati što više korisnika servisa. Pretpostavka je da bi se jednom zadovoljni korisnik (onaj koji je preko servisa uspio uštedjeti pri svojoj kupnji). Uštedu je teško procijeniti - iz osobnog iskustva prateći malo cijene, vjerujem da prosječna ušteda od 5% nije nerealna brojka. Dok 5% kao rezultat sve ove kemije možda ne zvuči puno, treba imati na umu da standardne akcije “skupljanja bonova” i “nagrađivanja vjednosti” kupaca obično u konačnici rezultiraju uštedom od 1%. Vjerujem da bi uz pravi pristup marketingu kupcima ovako nešto bilo dosta zanimljivo.

Za pridobijanje novog korisnika možemo iskoristiti činjenicu da su naši najbolji potencijalni korisnici upravo ljudi koji idu u kupovinu u dućan / trgovački centar. Reklamu bi zato bilo najbolje ciljati izravno na njih. Kako projekt već ionako predviđa radnike koji bi popisivali cijene proizvoda, ciljano reklamiranje možemo pokriti tako da radnici osim popisivanja cijene i distribuiraju letke postavljanjem na automobile ljudi koji su u dućanu što znači za to nemamo dodatnih troškova.

Brza pretraga po netu mi daje cijenu letka od 10 lp/kom. Uz procjenu da samo 5% ljudi koji su pogledali letak odu na web stranicu, popune podatke, pogledaju cijene i budu zainteresirani, cijena akvizicije jednog stalnog korisnika je 2 kn.

Korak četvrti: profit

Model zarade je oglašavanje. Na spomen oglašavanja kao načina zarade ljudima se opravdano diže kosa na glavi pa je red da se malo objasnim: oglašavanje trgovačkih lanaca na ovakvom servisu se poprilično razlikuje od oglašavanja na drugim portalima, televiziji, radiju i putem letaka po sandučićima. Naime, svi korisnici servisa zaista žele kupovati namirnice pa bi se prema tome oglasi servirali savršeno ciljanoj grupaciji potencijalnih korisnika. Ne znam procjeniti postotak učinkovitosti takvog oglašavanja, ali sam poprilično siguran da je bar za red veličine veći od bombardiranja oglasima na televiziji ili web portalima.

A kad se uzme u obzir velika količina novca koju trgovački lanci stvarno troše na oglašavanje, vjerujem da nije nerealno poretpostaviti da bi i oni bili zainteresirani da svojim dopru do korisnika web servisa. Pritom oglašavanje ne bi bilo samo klasičnim bannerima, nego i specijaliziranim targetiranjem korisnika na osnovu onog što su odabrali u svoju virtualnu košaricu. Zamislite: došli ste na stranicu provjeriti cijene mlijeka; osim te cijene. dobijate i reklamu o nekoj akcijskoj prodaji mlijeka u dućanu X. Usporedite to sa istom reklamom prije dnevnika ili za vrijeme omiljene serije.

Dodatna mogućnost monetizacije su affiliate linkovi za web dućane koje već imaju neki trgovački lanci, pogotovo ako je cijelu “virtualnu košaricu” moguće izravno primjeniti na neki web dućan i u 2-3 klika napraviti kupnju. No bar zasad, cijene namirnica u web dućanima su nešto više od cijena u normalnim dućanima pa sumnjam da bi (dovoljno) velik broj korisnika želio iskoristiti tu mogućnost.

Korak peti: širenje

Kao što sam već naveo, Zagreb bi vjerojatno bio najpogodniji izbor za početak bootstrap projekta. Ne računajući početnu investiciju u infrastrukturu, već unutar par mjeseci bi se projekt mogao sam financirati i omogućiti širenje na ostale velike gradove u Hrvatskoj. Ukoliko postoji veći početni kapital, veći centri u državi mogli bi se pokrivati od prvog dana, pogotovo ukoliko nema prevelikih razlika u cijeni namirnica u pojedinom dućanu u različitim regijama.

Naposlijetku, nakon pokrivanja cijele države, ne postoji razlog zašto se za daljnje širenje slična formula ne bi primjenila i na zemljama regije, kroz odvojene web servise.

Korak nulti: zašto se time već ne bavim?

Ukoliko je ova ideja tako sjajna kao što zvuči, dobro pitanje je zašto ja o tome pišem na svom blogu, a nisam već krenuo u njenu realizaciju? Vjerujem da cijela stvar ima potencijala i u nekom trenu sam ozbiljno razmišljao da se primim projekta, no zaključio sam da je ne bih mogao gurati usporedo sa stvarima koje se trenutno bavim i koje lijepo napreduju. Uostalom dobre ideje začinju se svakodnevno, ali kad bi stalno hvatali novu dobru ideju nikad ne bi realizirali niti jednu.

Zato sam, radije nego da pustim da ova trenutna ideja trune negdje u mračnom zakutku mog uma, odlučio dotičnu tretirati kao zanimljiv case-study i podijeliti s vama, ako ništa drugo onda zbog poticanja rasprave i razmišljanja, kako o samom projektu, tako i o evaluaciji potencijala nekog projekta, razradi poslovnog plana (npr. ovo sve navedeno bi se moglo smatrati ad-hoc poslovnim planom) i realnoj procjeni parametara kao što su cijena akvizicije korisnika ili mjesečni burn-rate. Dakle, volio bih čuti i vaše komentare zašto sve što sam napisao ima ili nema smisla :)

29. 11. 2009.

Finally!

On thursday, 2009-11-26, I have finally defended my PhD! I'll be starting on the new job on tuesday...

Ubuntu and VIA VT6421 PCI SATA Howto

 
I have seen question of how to make VIA VT6421 PCI SATA card work under Ubuntu on number of forum posts and only solutions I have seen on Ubuntu forum was: “Solved:: Installed Windows. Got data no problems.” :(
 
This obviously is not the solution. I found a solution that works on Ubuntu 8.10 but probably will work on any other Ubuntu version.
 
So in order to make this device work you need to see what module it uses:
 
lspci -k|grep -i VT6421 -A 2
 
01:07.0 RAID bus controller: VIA Technologies, Inc. VT6421 IDE RAID Controller (rev 50)
Kernel driver in use: sata_via
Kernel modules: sata_via

 
So we can see that the module this card uses is called “sata_via”, now just load the module for this VIA card and of you go:
 
sudo modprobe sata_via
 

27. 11. 2009.

Evolution international support fail :(

 
I really like Open Source software and would like have completely Open Source desktop at work, as I have at home. Our company uses Exchange mail server and since our admins switched to newer Exchange mail server 2007 there wasn’t an option to use anything but Microsoft Outlook for reading email on Linux desktop:(
 
Since evolution-mapi project got started I got really happy because it promised full Exchange 2007 compatibility, so that I could again use 100% Open Source desktop.
 
I tried it causally when Fedora 10 and 11 launched but knowing that the project was still fresh I didn’t expect much. Now that Fedora 12 with Gnome 2.28 launched I really hoped that evolution-mapi got stable enough for real use. Unfortunately there are some bugs that prevent international users from using Evolution. It is so close to being a perfect solution for lots of us who have to use Exchange, and that “almost there” feeling makes it even more frustrating :)
 
I know that lots of great hackers are working on fixing this solution, and we all are thankful for their contribution. I’m asking myself can we, regular users, donate and make some online actions so that we also get companies donate? Hopefully that would help the project in getting these issues fixed faster.
 
Do you have other/better suggestion how to help developers?
 
These are the mentioned bugs :
Mail is in the wrong encoding
unable to send mails containing UTF8 strings

26. 11. 2009.

TwinLab Calcium 1000 sa Vitaminom D

Ovo je otvoreno pismo poslano gosp. Ivanu Tudoru iz firme Agram 89 d.o.o, koja je zastupnik tvrtke TwinLab.

Nedavno sam u jednoj ljekarni u Dugom Selu kupio proizvod firme koju zastupate, TwinLab Calcium 1000 sa Vitaminom D.

U ljekarni gdje sam kupio proizvod su me uputili na vaš broj 01 3888 555. Vaše kontakt informacije dobio sam jer su me na vas uputili kada sam nazvao 01 6138 000.

Računao sam na pomoć u ljekarni oko odabira najboljeg dodatka u prehrani koji sadrži kalcij i Vitamin D i bio mi je preporučen ovaj proizvod.

Moj otac je nedavno operiran zbog rane faze adenokarcinoma (odstranjen mu je dio plućnog krila). Nedavno sam naišao na studiju koja govori da kombinacija Vitamina D i kalcija pomaže kod uobičajenih vrsta karcinoma (http://www.ncbi.nlm.nih.gov/pubmed/17556697).

Iako ovo istraživanje nije provedeno specifično za adenokarcinom, mislio sam da ne može škoditi ako ocu kupim dodatak u prehrani koji sadrži Vitamin D i kalcij.

Otvorio sam novo kupljeni proizvod i nakon što sam uzeo jednu tabletu primjetio sam u popisu sastojaka Titanijum dioksid, koji se u ovom proizvodu vjerovatno koristi zato da bi tablete bile bijele boje. Titanijum dioksid, E171 (http://www.ukfoodguide.net/e171.htm). Na priloženoj internetskoj stranici piše da je TiO2 zabranjen u Njemačkoj i da se može detektirati u limfnim čvorovima i plućnim stanicama nakon ulaska u ljudsko tijelo.

Pošto TiO2 nema biološku ulogu u ljudskom tijelu, a spominje se da je iritant i da je potencijalno kancerogen, pitam se zašto se ovakvi proizvodi uopće prodaju, tj. zašto se u proizvod stavlja potencijalno opasan dodatak koji nema nikakvu funkcionalnu ulogu. Mislim da marketing i igranje sa psihologijom nebi nikad smjeli imati prednost nad funkcijom posebno kada se radi o ljudskom zdravlju i kada dodatak koji se stavlja iz marketinških potreba može štetiti.

Stranica wikipedije http://en.wikipedia.org/wiki/Titanium_dioxide sadrži ukupno 6 referenci na studije kojim su okarakterizirani negativni učinci na ljudsko zdravlje.

Nisam zadovoljan sa ovim proizvodom i neću ga koristiti, a niti moj otac. Proizvod sam platio 173 kn i imam račun iz ljekarne. Nije mi iznimno važno da dobijem natrag novac i nekakvu "zadovoljštinu", nego da se ljudi informiraju. Povrat novca bio bi lijepa gesta sa vaše strane.

Možda ću pokrenuti inicijativu o zabrani proizvoda koji sadrže ne funkcionalne, kozmetičke E dodatke a koji imaju uz sebe povezane negativne efekte (E110, E171 itd). Molim zainteresirane da mi se pridruže.

Pokrenuo sam raspravu o ovoj temi na adresi:

http://ff.im/c2BgG

No siguran sam da se o ovome raspravlja i na mnogim drugim mjestima na internetu.

23. 11. 2009.

x2x: share mouse and keyboard over ssh

For quote some time I have been using x2x to have single keyboard and mouse for multiple machines (EeePC or third monitor at work), but I had problem with selection buffers. x2x was written for scenario where all X servers are listening to network connections, so if you had two machines klin and t42 and you wanted to use keyboard and mouse on klin you would have to do something like this:

dpavlin@t42:~$ xhost klin

dpavlin@klin:~$ x2x -to klin:0 -west
However, recent Debian systems are not listening to TCP connections, so you will have to modify xserverrc for this to work:
dpavlin@t42:~$ cat /etc/X11/xinit/xserverrc 
#!/bin/sh

exec /usr/bin/X11/X #-nolisten tcp
However, it's much nicer to depend on ssh X11 forwarding to provide encryption using:
dpavlin@klin:~$ ssh -X t42 x2x -to :0 -west
To finish this post, I have to include small patch which allows to switch copy/paste direction (which I don't need any more, but it proved useful in at least one case):
diff -r 2ce6789a43da x2x.c
--- a/x2x.c     Tue Mar 18 22:47:34 2008 +0600
+++ b/x2x.c     Tue Nov 24 14:08:16 2009 +0100
@@ -1125,7 +1125,7 @@
       if (doSel) {
         // pDpyInfo->initialClipboardSeen = False;
         pDpyInfo->winSelText = NULL;
-        pDpyInfo->hwndNextViewer = SetClipboardViewer(pDpyInfo->edgewindow);
+        pDpyInfo->hwndNextViewer = SetClipboardViewer(pDpyInfo->bigwindow);
       }
 
       pDpyInfo->onedge = 0;

21. 11. 2009.

Wasp

Last year I noticed an interesting cover picture in a bookshop. Girl sporting a dragon tattoo, on a book that was called exactly the same; "The Girl with the Dragon Tattoo", by the late Swedish journalist Stieg Larsson. I have a thing for dragon tattoos and despite this cheesy title I got interested. I researched a little on-line and found that it's a story about a journalist and a female hacker (the tattooed girl, imagine that), hired to write a biography for an old Swedish industrialist. Cheesy title and tattooed female hackers sounded too cheap and I didn't buy in.

In October I noticed that they made a movie based on the book, called "Men who hate women", which also turned out to be the original title of the book (that dragon thing was a result of the English translation). Movie was good, a thriller with dark northern atmosphere, a detective story and a mystery all in one. I immediately knew the book is excellent and that I made a mistake. Best selling book of the decade in Europe, and the whole trilogy (which it is a part of) an international phenomenon.

The actual story is much more deeper than it can be depicted in just 2 hours of film. It works on so many levels; corporate world and journalism, serial murders and a dark mystery. Interestingly all that is only an introduction to a deeper story about the girl with the dragon tattoo. The second book took a surprising turn for me, I had no idea the girl will become the center of attention. But let's stay with the first book a bit more. As much as I liked the book and considered it a good story there were some small things that almost ruined it for me. Larsson (being a reputable journalist) paid so much attention to detail that I can't understand some (what I consider) huge errors in judgment. To start with the obvious, he nailed the basic tech but when it came to hacking he had to go out and invent stuff. Some things he wrote about are much more complicated than what is already out there, completely unnecessary. In fact I've read an article in a Swedish newspaper where they asked a security consultant about hacks from all three books. Guy laughed on some counts. One telephone call and you could have it all worked out in detail, for the whole series. Then there is Dragan Armansky: born in Croatia by an Armenian father and a Bosnian-Muslim mother, somehow ending up with a Serbian nationality (as registered by the immigration office). What is going on here, a Korean-Mexican with a French passport would sound more convincing.

I was glad that things started revolving around the girl in the second book, titled "Girl who played with fire". When I least expected it some Russian spies turned up and again added some (more than) fantastic elements to the story, but by then I was more or less immune to these mass-market elements. I kept going because of the girl, which was a fascinating character. You could object to a lot of things regarding her, but along with the (sometimes) unconvincing hacking only thing that bothered me was her photographic memory. It is a myth. Why couldn't she have "extraordinary memory", which would be plausible for a person with asperger (or something like the syndrome, which is suggested she has)? Second book tells us much more about the girl. She is wanted by the police, and while she hacks their networks to stay one step ahead we get to learn a lot about her past. Again Larsson's story works on many levels. The journalist from book one is also back, this time working on a story about sex trafficking. The end of the book leaves things unresolved and leaves you desperately wanting more.

The air castle that blew up is the third and final book of the series (which is also known as the Millennium trilogy). It ties up all the loose ends from previous books and gives a nice closure, I consider it a good ending. The girl was a great character and it would be nice to see here once again, but unfortunately the author died just as he completed the third book. Last week I watched an interview with the Croatian publisher of the series. He just got back from Sweden and said that there are rumors that Larsson wanted to write a bigger series, some 6 or 7 books. In fact he said that Larsson already had an outline for the fifth book on his computer. I guess we will never know, but these books we do have definitely deserve your attention.

Site info

Planet Linux.hr is an aggregation of Linux and Open Source themed blogs written by Croatian people from the whole wide world. Blog entries aggregated on this page are owned by, and represent the opinion of the author.

Planet Linux.hr je skup blogova sa Linux i open source tematikom koje pisu nasi ljudi u domovini i inozemstvu. Clanci sakupljeni na ovoj stranici su u vlasnistvu i predstavljaju misljenje svojih autora.

Last time updated: 14. 03. 2010. 06:00

Aggregated blogs:

If you want your blog to be aggregated on this planet, contact Senko Rasic.