I suppose you all feel a warming/familiar sensation when observing at the following image :)

Am I the only one puzzled by the location of the sign-in link?

Although “personal reccomendations” is probably the most used functionality of the personalized Amazon web site, I don’t think it should replace the widely used “Sign in” paradigm.

E.g. I signed in a few moments ago to track my recent order. I had to click “personalized reccomendations” in order to get the status of my orders. Not really intuitive.

I know they want me to check the newest reccomendations no matter what. And I know that the fact that “Sign in” is not a link to the sign in page should not bother me that much :)

,

[caption id="attachment_111" align="aligncenter" width="500" caption="Paul Newline"]Paul Newline[/caption]

After inserting the contents of a multiline .NET TextBox into the postgreSQL database, I went to check the results.

Three operating systems, three different representations. Nota bene, we’re talking about newline characters here, not really something exotic.

I know there’s a series of unfortunate historic events that lead to this situation - but you just have to love it :)

p.s. notice the letter “n” from “Wien” missing in the pgadmins :)

, ,

[caption id="attachment_107" align="alignleft" width="251" caption="Search"]Search[/caption]

MS Windows XP is still a necessary evil. That’s why I like to keep it closed in a virtual machine. Occasionally though, I have to give it some air.

Last time I tried to find a file, this funny dog caught my eye.

It’s even animated.

I wonder if he is friends with Clippy :)

, ,

As I mentioned in the previous post, I’m going to write about an observation. I named it McAtom.

Take a random group of software developers. Put them on a project. After some time, their individual RSS/Atom subscriptions will converge to an identical set.

The real-world source of this post, the McClintock effect, is also referred to as the “social regulation of ovulation”. I guess that would make my observation the “social regulation of procrastination”.

, , ,

So, this is the second (and hopefully last) part of my e-banking rant. It’s a question of my mental health to get this through, so please excuse me. And stay tuned, as I had an epiphany this morning and new post is just behind the corner :) It’s about the developer’s version of the McClintock effect (I sincerely hope you have to google this term). Bye!

A mi, osuđenici na kombinaciju amaterizma i visokih marži, možemo nastaviti dalje sa analizom meni omiljene web aplikacije. Danas ću se baviti nalozima, vjerojatno najkorištenijom funkcionalnošću e-bankarstva.

[caption id="attachment_97" align="aligncenter" width="500" caption="Unos naloga"]Unos naloga[/caption]

Prijavu na sustavu i nelogičnosti “početne” stranice sam već obradio u proteklom postu, pa nastavljam izravno sa unosom novog kunskog naloga. Sam unos podataka je, što bi mi hrvati rekli, pretty straightforward. Unos podataka je ipak nešto što rade korisnici, pa tu Zaba nije imalo puno manevarskog prostora za napraviti nešto krivo. No, po unosu računa primatelja otvara se mogućnost prve interakcije sa sustavom (provjera računa), što u zabinom slučaju neminovno rezultira … pogodite kako :)

Akcija “Provjera računa primatelja” otvara prozorčić s podacima primatelja za zadani broj računa:

[caption id="attachment_94" align="aligncenter" width="486" caption="Podaci o primatelju"]Podaci o primatelju[/caption]

Očekivano, “Popuni kunski nalog” ne radi web pregledniku Firefox 3. Zašto podržavati web preglednik čiji je tržišni udio 42.6%  (statistike od rujna 2008)? Podržavanje isključivo Internet Explorer web preglednika ipak ne čudi s obzirom na ostatak “silovanja” Microsoft tehnologija. Razloge odabira Microsofta kao platforme nije potrebno dodatno analizirati. U situaciji ili/ili i ja bi odabrao isto. Problem je što te dileme uopće nema. Zašto korištenje Zabine smart-kartice kao preduvjet ima Windowse? Ne, nije istina da firme rade samo na Windowsima. Da, aplikacija za smart kartice mogla se napraviti na način da ne ovisi o platformi. Sva sreća da smo kao firma odabrali drugu banku, koja pravnim osobama dopušta korištenje tokena. Jer kao što znamo, tokeni su jako nesigurni i zato ih pravne osobe ne bi smjele koristiti. A čitač kartice, kojeg 99% ljudi koristi tako da svoju smart karticu drži konstantno u čitaču, je izuzetno siguran. Odličan način stvaranja osjećaja prividne sigurnosti kod korisnika.
Evo i primjera iz stvarnog svijeta: kartica cijelo vrijeme u čitaču, na polici kraj kompjutera Zabin instalacijski paket koji sadrži i 4-znamenkasti PIN.

No, nastavimo sa svojim nalogom. Što točno znači “spremiti nalog”? Pretpostavljam da se kod njih na sustavu nalog prvo “sprema” da bi se kasnije “proveo”, samo neznam zašto bi mene kao korisnika zanimalo što se dešava ispod haube. Ja želim svoj nalog provesti, a ne spremiti. Glagol spremiti je kod mene asociran uz englesku riječ “save”, a to nije ono sto želim napraviti.
Nadalje, provođenje naloga je akcija. Prema tome čak i da je glagol “spremiti” ispravan za ovu namjenu, trebalo bi pisati “Spremi nalog” a ne “Spremanje naloga”. Ja nalažem sustavu da moj nalog “spremi”. Inače nisam ljubitelj lokaliziranih aplikacija (navike), ali koliko sam upoznat s hrvatskim lokalizacijama, meniji sadrže stavke “Spremi”, “Zatvori”, “Kopiraj”, “Izreži”. A ne “Spremanje”, “Kopiranje”, “Rezanje” i ostale imenice.

U trećem činu zbunjivanja korisnika, stavke “Izbriši sva polja”, “Izbor predloška” i “Spremanje naloga” predstavljene su linkovima. Linkovi asociraju na akciju koja ima navigacijski smisao. Link “Izbor predloška” ima smisla jer nas vodi na drugu lokaciju. S druge strane, stavke “Izbriši sva polja” i “Spremanje naloga” su akcije i moraju biti predstavljene gumbićem. Ispravan odabir kontrola pristuan je u odjeljku “UNOS NALOGA IZ DATOTEKE” (”Browse” gumbić). Nažalost, kad već hvalim odabir gumbića za “Browse” akciju, moram primjetiti kako to nije zasluga dizajnera stranice nego se gumbić pojavio u sklopu standardne kontrola za odabir datoteke, koju web majstori očito nisu bili u stanju niti lokalizirati. Sličnu situaciju opisao sam u proteklom postu - opet postoji jedna jedina kontrola koja nije lokalizirana, na stranici gdje je sve ostalo na hrvatskom. Za ne vjerovati, postoje ljudi koji neznaju engleski a htjeli bi možda koristiti ovu web aplikaciju. Ali bolje da ih uguramo u koš s onima koji ne koriste Windowse i ostalim luđacima.

I još malo šlaga za kraj. Nakon borbe sa spremanjem naloga i popunjavanjem polja, evo me konačno pred samim činom provođenja naloga. Tu postaje jasno kako je Zaba previdila još jednu sitnicu. Iako na nalogu koji je spreman za izvršenje postoji polje “Datum izvršenja”, čini se da je to samo ukras. Zaista je odlična pretpostavka da svaki nalog koji želim provesti, želim provesti sada. Vjerovatno je Zaba namjerno htjela ljudima ublažiti prijelaz sa šalterskog poslovanja na e-poslovanje. Ovdje je zaista analogno dolasku na šalter i plaćanju računa :)

A kada sam već izvršio nalog kojeg sam mislio izvršiti za par dana, kao vječni optimist nadao sam da će bar postojati opcija “Spremi izvršeni nalog kao predložak”. Ali čemu?

,

Dear readers, I apologize beforehand for writing this post in Croatian language. It’s a rant about the user experience of the e-banking web site of one of our biggest banks (Zagrebacka banka). It would be uninteresting to non-Croatians anyway. I hope banks in your countries have more competition and better-suited people at relevant positions :)

Pa da krenemo na hrvatski. Već se neko vrijeme premišljam o pisanju ovog posta, akumulirajući pritom nezadovoljstvo korištenjem e-bankarske web stranice Zagrebačke banke. Rijetko koja profesionalna web stranica, čija svrha nije samo čitanje već podrazumijeva izvjestan stupanj korisničke interakcije, sadrži ovoliku količinu nelogičnosti, nekonzistentnosti i, moram reći, neprofesionalnosti.

Krećući jutros u sakupljanje konkretnog materijala shvatio sam da ću neminovno morati ovu lamentaciju podijeliti u više od jednog posta, tako da - očekujte nastavak :)

Kao početnu napomenu, reći ću da je moja struka razvoj softvera. Nisam profesionalni dizajner korisničke interakcije, iako mi je ta sfera izuzetno zanimljiva. Volio bi da ovaj post pročitaju odgovorne osobe u Zagrebačkoj banci, možda ih potakne da krenu misliti o stvarima s kojima se njihovi korisnici/klijenti bore na dnevnoj bazi.

Post je dovoljno dug i bez dodatnog uvoda, pa bolje da krenem.

[caption id="attachment_70" align="alignleft" width="412" caption="Link za prijavu na sustav"]Link za prijavu na sustav[/caption]

U web preglednik upišem “http://www.zaba.hr”. Znajući već da moram kliknuti na link “bankarstvo” u sekciji “e-zaba za građane”, mišem dolazim na link već tijekom učitavanja. U tom trenutku me web stranica redovito prevari, ubacujući sličicu “VeriSign Secured” što rezultira naknadnim pomicanjem linka kojeg sam već “naciljao” mišem. Sitnica, ali jednom kad primjetite ne može a da ne smeta. Sličicu su zaista mogli staviti ispod navigacijskih linkova.

[caption id="attachment_71" align="alignleft" width="191" caption="Navigacija"]Navigacija[/caption]

Nakon uspješne prijave u sustav nalazim se na početnoj stranici. Zapravo, na stranici koja se samo zove “početna stranica”. Koncept početne stranice odnosi se na centralno mjesto jednog weba, mjesto s kojeg korisnik započinje svoju navigaciju i mjesto na koje se korisnik najlakše vraća. Upravo zato je početna stranica najčešće prva u navigacijskoj strukturi, ili je istaknuta na neki drugi način.

Na slici lijevo može se vidjeti zabina lokacija “Početne stranice”. Rezultat - svaki puta kada trebam na početnu stranicu iznova je tražim po meniju. Valja dodati kako se ponekad na prvoj navigacijskoj poziciji javlja izuzetno iritirajuća blinkajuća sličica koja vrišti “NOVA PORUKA”. Osim što izgleda na klasične navlakuše zlonamjernih web stranica koje svim silama žele privući vaš klik, svrha tog linka je da vas odvede u vaš osobni pretinac s porukama gdje ste dobili reklamu za zabinu novu uslugu. Zabo, hvala ti!

Inače, “početna stranica” je prilično logična, očekivano prikazuje stanja svih računa. U ovom postu baviti ću se najjednostavnijom funkcionalnošću e-bankarstva - pregledavanjem stanja na računu i dohvatom transakcija po istome. Budući da želim odabrati tekući račun, klikćem na njegov broj (ne bi škodilo da i opisni naziv, “tekući račun”, bude link na isto). Stranica na koju sam odveden prikazuje sve relevantne podatke za moj tekući račun, poput stanja, iznose prekoračenja i slično. Zabava počinje.

[caption id="attachment_74" align="alignleft" width="263" caption="Opcije"]Opcije[/caption]

Na slici lijevo prikazane su ponuđene opcije. U sljedećem ću postu više pažnje posvetiti (lošem) odabiru kontrola, zasad ću samo reći kako su sve opcije prikazane kao linkovi, iako je priroda istih potpuno drugačija. Linkovi asociraju na navigaciju i korisnik očekuje da će klikom na link biti odveden s trenutne stranice. S druge strane, akcija poput “Download” ili “Save” ili “Print” mora biti označena gumbićem. A kad smo već kod downloada, čini se da ta riječ ima čast biti jedina engleska riječ na sučelju. Zaista konzistentno :) Moglo je pisati “Dohvat datoteke …”, vjerujem da bi korisnici razumjeli. Dodatno, isti link spominje i “označene promete po računu”, iako se ne stranici ne mogu označiti nikakvi prometi. Postoji samo odabir vremenskog perioda, koji isto tako zaslužuje svojih 5 minuta slave.

[caption id="attachment_76" align="aligncenter" width="500" caption="Kalendari"][/caption]

Gornja slika prikazuje dio stranice namjenjen odabiru vremenskog intervala. Klik na sliku kalendarčića otvara prozorčić s kalendarom, no zanimljiv je odabir lokacije. Nije li logično da se prozorčić kalendara otvori u neposrednoj blizini kalendarčića na kojeg sam kliknuo? Zašto moram šetati mišem na drugi kraj zaslona?

Kad smo već kod odabira datuma, neugodno me iznenadila spoznaja da je “Prikaz prometa po računu” dostupan samo za period od godine dana. Nakon što sam odabrao datum koji je od danas udaljen manje od 365 dana, konačno sam uspio doći do nekih podataka. U mojem slučaju, dobio sam tablicu s preko 320 redova. U jednom komadu. Što se točno desilo straničenju (engl. paging) ? Iz mojeg iskustva, tablice podataka najčešće se raspodjeljuju na stranice od 20ak redaka. Ja sam upravo suočen sa tablicom visine 60ak centimetara.

Nažalost, to nije sve što primjećujem (odnosno ne primjećujem) kod ispisa prometa po računu. Polje “Opis” je prazno za sve transakcije u protekloj kalendarskoj godini. Zaista neznam koji bi mogao biti razlog tomu, osim čuvanja diskovnog prostora na poslužiteljima. U svakom slučaju, krasan odnos prema klijentu koji kod dotične banke ima najveći korisnički paket, stambenu štednju, kreditnu karticu i III. mirovinski fond. Nemogu ne imati osjećaj da imam “ograničeni” paket dok istovremeno neznam gdje da nadoplatim kako bi imao pristup svim svojim podacima (moj bankovni račun star je oko 10 godina).

Prilikom testiranja opcije “Download prikazanih podataka” greškom sam odabrao početni datum koji je veći od završnog. Sustav me uredno propustio na sljedeću stranicu koja nosi samo jednu informaciju: “Početni datum mora biti manji ili jednak današnjem datumu”. Mislim da je bilo jednostavnije to provjeriti JavaScriptom na klijentskoj strani, odnosno uopće ne dopustiti odabir besmislenog vremenskog perioda. Dodajmo to u košaru s nesmotrenostima koje razbijaju slijed korisničke interakcije.

Nadajući se da sam konačno pronašao vremenski period koji sustavu odgovara, gledam u link “Download označenih prometa po računu”. Što da očekujem pokretanjem te akcije? Ništa ne daje za naslutiti o kakvom je formatu datoteke riječ. Budući da je priroda podataka tablična, a aritmetičke operacije nad njima imaju smisla, za očekivati je nekakvu tabličnu (spreadsheet) datoteku.

[caption id="attachment_79" align="aligncenter" width="500" caption="Izvoz podataka"]Izvoz podataka[/caption]

Na moje razočaranje, datoteka koju sustav generira je u PDF formatu, a u gornjoj slici prikazan je dio iste. Saldo je naravno posve izmišljen i ne odgovara stvarnom stanju na mojem računu :)

Dokument izgleda sve samo ne profesionalno. Sadržaj ćelija dira njene rubove, ne postoji zaglavlje ili logo. Sve u svemu, ne može se razaznati da je riječ o dokumentu kojeg je izdala Zagrebačka banka. Uz navedeno, portabilnost (slovo P od PDF) kod ovog dokumenta nema nikakvog smisla, osim u slučaju da svoje stanje računa želim podijeliti sa svojim prijateljima. Pregled podataka ionako je moguć direktno s web stranice, tako da tu nema nikakve dodane vrijednosti. Vjerujem da nisam jedini koji numeričke podatke, pogotovo ovako stvarne, želi prikazati u vidu grafova, štrudli ili pita. Razočaran, usudio bi se reći da je čitava stvar razvijena u jedno popodne, koristeći neku gotovu programsku biblioteku za stvaranje PDF datoteka (iText?) s “defaultnim” postavkama. U svakom slučaju, daleko od nivoa kojeg očekujem od organizacije ovog kalibra.

Sumnjajući da je itko imao dovoljno strpljenja doći do ovog dijela posta, pozdravljam čitatelje do sljedećeg nastavka.

[Update: komentar kolege fressnera pogađa u sridu, u sljedećem nastavku istražujem misterij "spremanja" naloga]

,

I just read a post about some ways to be a healthier programmer, so I felt compelled to add a few of my observations.

The things mentioned in the post, like ergonomic keyboards or regular glasses of water, are important. But the post title should have been “7 additional ways to be a healthier programmer” :)

I believe there are more crucial things to your general well-being, both physical and psychic.

Do you work out regularly? Are you having fun in the office? Do you feel light when going to the office in the morning? What kind of food do you eat there? etc. etc.

To me, it just makes more sense to ask yourself such questions before examining table comparisons of ergonomic mice…

,

Some thinking, some typing, some OpenArena and a lot of blank stares at the screen… All of these are parts of a working day in the life of a software engineer! Enjoy!

You need to a flashplayer enabled browser to view this YouTube video

, ,

Saturday afternoon. Perfect timing for an exhaustive debug session.

So here we are, debugging a relatively straight-forward algorithm that handles objects based on their Date field. Supposedly, a piece of cake.

A few hours later (and 3 mins prior to solving the issue), we notice that a collection of Date objects sometimes contains objects of type TimeStamp.

A quick glimpse on the TimeStamp class javadoc reveals the following:

TimeStamp is a composite of a java.util.Date and a separate nanoseconds value

and

The Timestamp.equals(Object) method never returns true when passed a value of type java.util.Date because the nanos component of a date is unknown.

To put the same statements into something more comprehensible:


Date d = new Date();
Date ts = new Timestamp(d.getTime());
System.out.println(ts.equals(d));	 //returns false
System.out.println(d.equals(ts));	//returns true
System.out.println(ts.compareTo(d)); //return 0
System.out.println(d.compareTo(ts)); //returns 1

Now, it’s not very polite to have two references of type Date, with ‘o1.equals(o2) = true’ and ‘o2.equals(o1) = false’ :) If you have an application that fetches data from the underlying database via ORM (in this scenario we use Hibernate) and from the GUI, chances are you will have this situation.

But the biggest problem has yet to come!

By now, we all learned that TimeStamp extends Date and adds the nanosecond ’support’. OK, let’s accept that. So when implementing the compareTo method, they obviously took care to check if it the argument they’re comparing to was a TimeStamp or a Date. If it was a Date, they created a temporary TimeStamp object from its milliseconds-from-1-1-1970 value (getTime() method), and the output was correct (in the example above, it returns 0). But what about the last example? ‘d.compareTo(ts) = 1′ ?! How can that be? If the Date object has no perception of nanos and the TimeStamp object is created from its getTime() method, how can the Date be *after* the TimeStamp?

By bad design decisions, i dare say :)

In the last paragraph, when i told you about the TimeStamp’s compareTo(Date d) method, I left something out intentionally. Now i can drive the point home :) Here’s the original method implementation (taken from the java.sql.TimeStamp source code):

public int compareTo(java.util.Date o) {
if(o instanceof Timestamp) {
// When Timestamp instance compare it with a Timestamp
// Hence it is basically calling this.compareTo((Timestamp))o);
// Note typecasting is safe because o is instance of Timestamp
return compareTo((Timestamp)o);
} else {
// When Date doing a o.compareTo(this)
// will give wrong results.
Timestamp ts = new Timestamp(o.getTime());
return this.compareTo(ts);
}
}

Notice the comments in the ‘else’ block? Nice!

After some more digging through the TimeStamp and Date implementation, we found the epicenter of this stupidity :) Take a look at the TimeStamp constructor:

public Timestamp(long time) {
super((time/1000)*1000);
nanos = (int)((time%1000) * 1000000);
if (nanos < 0) {
nanos = 1000000000 + nanos;
super.setTime(((time/1000)-1)*1000);
}
}

See the first line? It removes the millisecond part and calls the Date constructor. Everything smaller than a second is kept in the ‘nanos’ field. Very clever. Although it’s not a photon, TimeStamp is of dual nature :)

When calling the compareTo method on a Date object it compares the ‘fastTime’ fields. Unfortunately, TimeStamp changed the original ‘fastTime’ field by subtracting everything that’s smaller than a second and putting that data in the separate field called ‘nanos’. Meanwhile, calling the equals() method will compare the same object by calling their getTime() method which will produce the correct result since the TimeStamp implementation takes care of adding back the ‘nanos’ part to the ‘fastTime’ field.

Sun Microsystems, you’re doing it wrong.

Conclusion: when using TimeStamp and Date objects interchangeably, the preferred way to go is force casting to one of them…

p.s. credits for this post go to !alk and fressner, we all invested a few hours in this post :)

[Update 16/10] Seems we were the only ones not using the Joda Time library

, , ,

Who said that we, left-brainers, cannot be creative?

To be honest, the origin of this poster is 99% left-brain, but nevertheless it can be printed - i guess that makes it art :)


The masterpiece is generated using the popular “ctrl+c/ctrl+v” technique, which was applied on one of our Java source code files, and pasting it in the web-based word cloud generation system (wordle.net).

p.s. the “Infigo” t-shirt i’m wearing in the pic is just a ticket for a free lunch…;)