subota, 6. veljače 2010.

Anegdote podrazumjevanog

Joj joj joj. Napravim nekom program, meni radi korisniku ne. Popravim problem i nakon nekog vremena novi problem. Na drugom mjestu al zbog iste stvari. Zvuči ko da sam šeprtljavo napravio program, je l' da? Dam vam 5 minuta, razmislite. Koliko je teško pretvoriti niz znakova u broj?

Vrlo
Vrlo teško, pogotovo kad ne znate da l imate decimalnu točku ili zarez. To što ste si u operacijskom sustavu postavili možete si objesit za rep, to vam korisnik programa može a i ne mora poštivati. Eeee, al ima još jedna zamka jer da je nema, mogli bi ste točku ili zarez pretvoriti u znak po volji i dalje imat predvidivu situaciju. Zamka je u tome što je sasvim legalno imati znak koji razdvaja tisućice. A da zamka bude s otrovanim šiljcima, taj znak je isto ili točka ili zarez. I za to bi mogli smislit postupak koji pazi na to ali tada smo već daleko od jednostavnosti i korak bliže umjetnoj inteligenciji. Eh, ni umjetna inteligencija ne bi radila ak ne bi znala "domenu" odnosno koji raspon brojeva očekivati. To vam je stvar koja se podrazumjeva da kao programer znate napraviti.

Locale
U C#-u (a valjda i Javi) ugrađene funkcije za pretvaranje stringa (niza znakova) u broj gledaju u postavkama operativnog sustava koji su znakovi za što u formatu brojeva i na temelju toga vrše pretvorbu. No, po mom sudu, škrtare na dojavi pogreške. Da vam ispričam jednu anegdotu.

Na svom računalu postavke o formatu brojeva imam uštimano na ono što sam učio u osnovnoj školi: tisućice odvajaj s pola razmaka a decimale s točkom, ne sa zarezom nego s točkom. Pošto pola razmaka nije lako za utipkat, obično stavljam cijeli. I s tim postavkama sam počeo raditi Zvjezdojeca i bilo mi dobro na Zemlji. Jednom prilikom sam bio dao frendu proba Zvjezdojeca na svom računalu, i kako je upalio igru odmah sam imao što vidjet. Zvijezde su bile pre prevelike. Tada nisam znao u čemu je problem a Vi iz teksta kojeg sam napisao možete pretpostaviti. Problem sam skužio tek kada sam reinstalirao operativni sustav. Naime, prije toga nisam mogao na svom računalu rekonstruirati problem a nakon reinstalacije sam zaboravio pošimat format brojeva. Pošto Microsoft misli da mi Hrvati koristimo točku između tisućica i zarez između decimala i cijelobrojnog dijela broja, ugrađene funkcije za pretvaranje stringa u broj su krivo tumačile tekst. Tekst koji glasi "0.2" bi prevele u broj 2. Osobno bih za takvo nešto očekivao da mi baci NumberFormatException iznimku s tekstom "kak moš imat 0 tisućica i nakon toga samo 2 bez još 2 znamenke?". Ono što je bilo još gore u cijeloj priči je da je taj propust u ugrađenim funkcjama bio vidljiv samo djelomice. Kada su veličine jednog tipa zvijezda trebale biti pomnožene s faktorom između 0.2 i 0.6, on bi množio s faktorom između 2 i 6 a ja bi jednostavno vidio 10 puta veću sliku nego što bi trebala biti i tražio bi uzrok na totalno desetom mjestu. Hvala Bogu, imo sam tip zvijezda koji ima faktor veličine između 0.7 i 1, koji kada se krivo prevede je od 7 do 1 a pošto je tada minimum veći od maksimuma, ispalo je da su zvijezde tog tipa bile sve iste veličine.

MS SQL Express 2005
U svojoj igri mogu reć da ću svugdje koristiti određen znak. Korisniku aplikacije mogu reć da je krivo unio broj. Ali bazi podataka ne mogu reć da je sama sebi nedoslijedna. To je još jedan biser oko pretvorbe teksta u broj i broja u tekst. MS SQL baza iz naslova će vam uredno vratiti unose s decimalnim zarezom odnosno točkom, ovisno o tome kako imate u OS-u postavljeno ali kad unosite podatak on mora biti s točkom. I opet, kod mene radi a kod korisnika ne. I samo za MS-ovu bazu moram ubacivati dio kôda koji ko za retardirane pretvara broj u tekst koji ona može prihvatiti.

Hvala Bogu sad to radi! A ima vam još jedna zafrkancija oko obrade teksta s kojom još nisam morao imati posla, sortiranje. Što po abecedi ide prije? C ili Č? U nas Hrvata C je l' da. E, al kako idu E-ovi s črčkama? Poredajte mi po abecedi E, Ě, Ę, É i Ë.