UTF-8 naujienos: nagi?

Tai vat, RSS dabar eina UTF-8 kodavimu. Šitą sugebėjau greitai
padaryti, nes tas skriptukas, kuris gaudo el.paštu siunčiamas naujienas
ir jas deda į duombazę bei sugeneruoja RSS eina ne per Apache, o tiesiog
per shellą. Apache vis dar gyvena su perl5.6.1, kuris nepalaiko normalių
simbolių užkodavimų/atkodavimų.

Faktiškai vienitelis pakeitimas, kurį padariau buvo šios eilutės
pakeitimas (duomenys vis dar saugomi iso-8859-13 duombazėje):

$dt = encode("utf8", decode("iso-8859-13", $dt));

Lyg validuojasi
normaliai
. Žiūrėsim.

Kelias UTF-8 link

Nagi pradėjau žygį UTF-8 link. Pirmas etapas: perl5.8.0 įdiegimas.

Nesu labai geras linux adminas (heh, aš juk programeris), tad dedant
šį dalyką susidūriau su keletu problemų. Viskas įsidiegė lyg ir
normaliai, tik paskui taiop gavosi kad Perlas neberado pusės savo
modulių (jie ten liko kur gyveno 5.6.1). Na, lyg anokia čia bėda.
Persikompiliuosiu ir modulius. Pasirodo CPAN laikinoji atmintis
(cache) vis dar likus po senovei ir bandant įdiegti tarkim
DBD::mysql man sako kad viskas jau įdiegta ir nereik čia nieko
atnaujint. Pravaliau atmintinę. DBD::mysql vis dar nesulenda, nes
neranda mysql.h. Einu apt-get
išsitraukt. O pasirodo tas irgi neveikia, nes neranda kai kurių modulių
(apt-get yra perlinių skriptukų rinkinys). Galų gale viską lyg
išsprendžiau. Beje, keistas dalykas: Apache ir mod_perl vis dar gyvena
su senuoju perlu. Hmmm… tai dabar pas mane dvi perlo versijos. Čia
pats velnias koją išsisuktų. Perkompiliavau mod_perl, galvojau kad
pasigriebs naują perl5.8.0. Klydau, vis dar 5.6.1. Einu pasižiūrėt kame
čia replės.

Oh, ir jei staiga visas servas nebeveiks, tai čia mano bandymai su
mod_perl ;)

RSS: tolimesni sprendimai

Na, išsitestavau su RSS validatoriumi: Valid RSS. Tiesa, buvo problemų su <pubDate>
lauku – valandos buvo rašomos ne dviem skaitmenimis, o vienu,
tad tą pataisiau. Koduotę palikau tą pačią. Tiesa, HTTP headeryje XML
koduotė buvo nurodoma blogai (T.y. “Windows-1257”), tad pakeičiau ir
tą, bet tai neturėtų turėti reikšmės (o gal?). Pažiūrėkit ar dar vis
yra problemų.

Beje, pukomuko
RSS
nesivaliduoja, nes randa klaidą XML Parsing error: unknown encoding. Tai visgi aš teisus?

Ateityje turbūt vis tiek judėsiu link UTF-8. Jau tam susidėjau
perl5.8.0, kuriame pagerintas Unicode palaikymas.

Nusiskundimai dėl RSS

Pastaruoju metu populiarėjant C# bei .NET vis gaunu nusiskundimų
kad mano RSS naujienose „kreiva lietuvybė“. Tokių
priekaištų esu sulaukęs iš Emilio, bei
scooox (Tiesa,
scooox tik prašė pakeisti koduotę).

Tai kame pas mane problema? Jos pas mane nėra. Kalta .NET, kuri
nepalaiko standartinės lietuviškos ISO-8859-13 koduotės. ISO
koduotės yra standartas, ir jei jį ignoruoja Microsoft, tai čia ne
mano bėdos. Skamba griežtai? Galbūt. Čia panaši situacija kaip ir su
Outlook Express, kuri iki šiol lietuviška ISO koduote laiko
ISO-8859-4.

Mano lietuvybės RSS naujienose problemos sprendimas paprastas
– nenaudokite .NET. Aš neturiu jokių problemų su lietuvybe, nes
naudojuosi technologijomis, nepririštomis prie .NET

Ech, turbūt visiems atrodau kaip užsispyręs ožys, norintis įrodyt
kad Microsoft yra blogai. Tebūnie. Tarkim čia vienas nedidelis
bandymas priversti žmones naudotis standartus palaikančiom
technologijom. O jei turit kokių kitokių problemų su RSS, tai esu
pasiryžęs jas ištaisyt ;)

Excel, VisualBasic ir goto

Universitete tenka man retkarčiais prisėsti prie Visual
Basic
ir suprogramuoti vieną kitą Excel makrosą (kaip
sakant tenka iš tikrųjų pažinti VBasic blogybes :). Tiesą pasakius,
pati kalba neatrodo ten per daug baisi ir bloga (na, jei tik
apsiriboji makrosų rašymu ir viską taikai neprogramuojantiems
ekonomistams… nors ir čia turbūt Python ar Ruby būtų
aiškiau ir suprantamiau). Vienas blogiausių dalykų tas, kad kodo
pavyzdžiai, kuriuos gaunu iš dėstytojų (t.y jie rašyti dėstytojų) yra
ganėtinai košmariški – pilni painių goto
(taip, taip, goto!) ir kitokių įdomybių. Na, todėl ir nekeista,
kad kai ateina laikas atsiskaitymui, programa būna nukopijuojama nuo
pavyzdžių ir tuo viskas baigiasi. Štai pavyzdukas VBasic kodo, kuris
buvo duotas per paskaitą, aiškinant kirstinių metodą funkcijos
šaknims rasti:

sub .......
...........
a = 0.0001
b = 1
1 x = F(a)
 y = F(b)
If (x * y) > 0 Then
Cells(1, 2) = "nera saknu"
GoTo 2
End If
c = a - (b - a) * x / (y - x)
If (Abs(F(c)) < 0.001) Then
Cells(1, 1) = c
GoTo 2
End If
If F(a) * F(c) > 0 Then
a = c
Else: b = c
End If
GoTo 1
2 end sub

Ypač gražiai atrodo tie pora goto. O juk jau
1968 metais Djikstra sakė jog „Goto is
considered harmful
“. Perrašiau tą kodo gabaliuką Perlu
(naudojau rekursiją… gal ekonomistams čia jau ir per sudėtinga, bet
galima tą viršutinį algoritmą perrašyt panaudojant keletą
while. Be to ir nuorodos į subus nėra būtinos,
galima supaprastint ;):

sub kirst {
        # $fja yra kodo gabalas (nuoroda i suba)
        my ($fja, $a, $b) = @_;
        die "Nera saknu?" if ($fja->($a) * $fja->($b) > 0);
        my $c = $a - (($b - $a) * $fja->($a)) / ($fja->($b) - $fja->($a));
        if (abs($fja->($c)) < 0.00001) { # 0.00001 yra epsilon
                return $c;
        } elsif ($fja->($a) * $fja->($c) < 0) {
                return kirst($fja, $a, $c);
        } else {
                return kirst($fja, $c, $b);
        }
}

Atrodo kad čia daugiau kodo? Taip, tiesa, nes čia pilnas
subas, kurį galit imt ir naudot. Be to perlo stilium galima dar jį
žymiai sutraukt iki kokių trijų eilučių :)

Kad ir kaip ten bebūtų, dėstytoja mane išklausė, ir lyg ir ruošiasi
atsisakyti goto vardan while.

Švartzinės transformacijos

Šiandien skaičiausi apie Švartzines transformacijas. Tai tokia technologija, kuri labai praverčia sortinant
sudėtingus dalykus. Tarkime turim krūvą įrašų, kuriuose įrašyti vardas
ir pavardė (Na, stilium „Petras Kudaras“) ir norim
susortinti šiuos įrašus pagal pavardę abėcėlės tvarka. Paprasčiausia
būtų daryti taip:

@susortintas = sort {
               ($vardas1, $pavarde1) = split / /, $a;
               ($vardas2, $pavarde2) = split / /, $b;
               $pavarde1 cmp $pavarde2
} @nesortintas;

Tik čia slypi nemaža problema: kiekvieno lyginimo metu iš naujo
išsitraukinėjam pavardes, tad jei sąrašas, kurį reikia susortinti
labai ilgas, gali tekti ilgai laukti rezultatų. Čia padeda Švartzinė
transformacija, kurios esmė ta, kad pavardes galime išsitraukti vieną
kartą, tai išsisaugoti, ir lyginimui naudoti jau išsaugotas reikšmes.
Štai kodas:

@susortintas = map { $_->[0] }
               sort { $a->[1] cmp $b->[1] }
               map { [$_, (split)[1] ] }
               @nesusortintas;

Norint susigaudyti kas čia vyksta, reikia kodą skaityti nuo galo.
Pirmiausia, nesusortintas masyvas perleidžiamas per funkciją
map {}, kuri kiekvienam elementui sukuria
nuorodą į anoniminį masyvą, kurio pirmas elementa syra toks pats kaip
nesusortinto masyvo elementas, o antras – jau išskirta pavardė.
Čia dar aišku labai gudriai panaudojama split
funkcija, nes jei jai neperduodame jokių argumentų, tai ji splitina
$_ pagal tarpus (tiksliau pagal
whitespace). Po to šita sukurta nuoroda į anoniminį masyvą
perduodama funcijai sort, kuri ir atlieka visą
darbą, sortindama antrąjį elementą (kuriame yra pavardė). Paskutinis
map atkuria tvarką iš anoniminės nuorodos
padarydamas normalų elementą. Paprasta, ar ne? :)

Beje, galvojau gal padarysiu ką nors panašaus ant PHP, bet labai
jau ten sudėtingai tie array_map ir
usort naudojami. Ech…

Lietuvos bankų sistema: huh?

Priminimas sau ateičiai: niekada netvarkyti bankinių reikalų Kaune šeštadieniais. Gavau vat sąskaitą iš Litnet už vieną domeną. Reikia pervesti pinigus į Vilniaus banką. Na, galvoju, jokių problemų, nueisiu kur nors mieste šeštadienį ir pervesiu. Klydau.

Pirmiausia tas dalykas, kad Vilniaus bankas Kaune šeštadienį nedirba. Hmm… Na, gal jis orientuotas į verslo klientus, tai dėl to ir nedirba šeštadieniais. Aišku mano pagrindinė banko sąskaita kaip tik jame, na bet ką darysi. Pasivažinėjau Laisvės alėja ieškodamas kitų veikiančių bankų. Radau Snorą. Na, galvoju, jame irgi juk turiu sąskaitą. Užėjau. Sako „nieko nežinau, pirma perveskit pinigus į savo sąskaitą grynais (aš toj sąskaitoj gal kokius 5 Lt tik turiu) o paskui jau pervesim. Bet pavcedimus darom tik darbo dienom, tad teks palaukti pirmadienio. Tada ateikit.“ Huh? Na ką darysi… Einu kitų bankų ieškot.

Na, dar radau Hanza LTB. Atstovėjęs eilę tarp bobučių, laukiančių atsiimti savo pensijas, gavau atsakymą kad būtinai reikia turėti sąskaitą Hanzoje jei nori pervesti pinigus į kitą banką. Nesupratau. Nu sako galim atidaryt jumi sąskaitą jei norit pinigus pervest. Hmmm… Tai pala… Jei aš noriu išsiimt pinigus tai galiu tai daryt iš bet kurio bankomato, bet noriu įdėt, tai tik iš to banko, kuriame turiu sąskaitą? Ar aš čia jau per daug pripratęs pire šiuolaikinių technologijų gerovių, kad mane tokie dalykai baisiai stebina?

Technologijų ir kalbų karai

Ech, na ir dienelė. Nepakanka to, kad lauke karšta, tai ir
php-konf atgijo ;)

Viskas prasidėjo gana nekaltai. Pradžioje buvo bandoma aprašyti, kas
yra geras PHP programuotojas, po to nusivažiuota į lankas ir gavosi
šaudymai iš visų pusių: C vs PHP, C++ vs PHP, C++ vs asm, Perl vs PHP,
JSP vs the world ir panašiai. Bet bent jau įdomiau nei krūva kasdieninių
klausimų „Ka reiškia “headers already sent”?“.
Labiausiai mane suintrigavo Kewlar idėja:

<sarcasm>Flame forever!</sarcasm>

Ideja sekanciam developeriu susibegimui - gal yra savanoriu padaryti
ivairiu programavimo kalbu/technologiju pristatymus? Butu puiki proga
susipazinti su alternatyvomis, isklausyti ivairiu poziuriu, suzinoti
ne visiems zinomus privalumus ir trukumus, etc.

Tiesiog ideja.

Nedarbingo visiems savaitgalio,
  Mindaugas

Vat reikės kada Jumi stipriai smegenis apie Perl technologiją praskalaut ;)