Niedawno miałem okazję przekonać się jak ukształtowanie interfejsu użytkownika może wpływać na sposób w jaki aplikacja będzie odbierana przez użytkowników. W skrajnym przypadku może prowadzić do odrzucenia systemu.
Czekając w kolejce do bankomatu zauważyłem, że dwie osoby przede mną odchodzą nie pobierając gotówki. Gdyby to była tylko jedna osoba pomyślałbym, że chodzi o brak środków na koncie. Gdy druga osoba odebrała kartę obstawiałem problem z bankomatem. Postanowiłem sprawdzić co jest przyczyną problemów.
Na pierwszym ekranie widocznym po włożeniu karty pojawiło się pytanie:
Czy potrzebujesz gotówki?
Poniżej znajdowały się dwa przyciski: TAK i NIE. Pytanie wydało mi się dziwne jak na bankomat sieci Euronet.
(more…)
GIT is a distributed version control system – that means it doesn’t require to have any central repository. It’s possible to build system by exchanging commits between equal nodes. It’s convenient, however, to mark one repository as central one. Of course you can change your decision at any time. I’ll show you how to do that.
(more…)
Recently I started new project targetting STB (set top boxes). STB is a networking device (Ethernet based) that allows you to watch (record in some cases) HD films on your TV screen. I have no TV device in home (who cares TV if Internet is availabe?), but it’s interesting to see the direction where current TV devices will go in near future.

Anyway, the most important difference to previous projects is “new” language: no more Java, no more Python, it’s C++. You can find few C++ projects I published on SourceForge, but they’re created >5 years old now, so I can use “new” word here
. The first thought of old Test Driven Design fan when creating development environment was: whre’s JUnit for C++?
Sometimes you need to make some directories available (R/W mode) to a group of developers on a Linux / Unix server. Using shell tools make this task very easy.
First, ensure all files group are switched to desired group:
find . ! -group group1 -exec chgrp group1 '{}' \;
Then +s (sticky) bit must be attached to directories to ensure group will be preserved in newly created directories:
find . -type d ! -perm -g=s -exec chmod g+s '{}' \;
Then writeability for the group should be set:
find . -type d ! -perm -g=w -exec chmod g+w '{}' \;
And finally some users must be added to the group:
adduser user1 group1
Additionally you have to set default umask to 0002 (only o+w filtered out). It’s done by installing libpam-umask and adding to /etc/pam.d/common-session:
session optional pam_umask.so umask=002
That’s all.
Recently I’ve got the following error during SQL named query execution:
SQL Error: 17006, SQLState: null Invalid column name
In order to track the problem down I enabled SQL logging and collected SQL query issued, then run it under SQL monitor and … it was working without error! I was surprised.
In order to debug what’s going on I enabled detailed logging in Hibernate. What was happened then?
[INFO] could not read column value from result set: entityKey215_0_; Invalid column name
This message showed me that the problem was not related to generated SQL query but to column names expected by Hibernate. Generated recordset didn’t has entityKey215_0_ column. I added:
entityKey AS {list.entityKey}
to named SQL query and error dissapeared.
This error is not-very-obvious kind of error because Oracle hides column / table names in error messages returned. Why? I don’t get this cryptic error messages idea. In order to track an error under Oracle I had to enable verbose logging (error message standalone din’t give anything useful). Much simpler database MySQL has better error reporting than “fat” Oracle.