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 ;)

Java ir Perlas

Aš vis dar susidomėjęs Java. Tačiau nepamirštu ir Perlo. Šiandien į
savo Palm’ą susidėjau Oreillio Advanced Perl
Programming
, kurią jau senokai varčiau, o kai ją varčiau tai dar
nelabai mokėjau patį Perl ir nelabai supratau apie ką ten rašo.

Smalsumo vedamas nuėjau į CPAN
ir paieškojau ko nors susijusio su Java. Ir aišku radau. Kad Perlu
galima manipuliuoti Java VM ir klases tai nieko čia nuostabaus, mane
daugiau suintrigavo Inline::Java
modulis. Imi ir Perlinio skripto vidury pradedi rašyti Java ;).
Aišku nieko čia ypatingai keisto. Inline::C modulis jau seniai
egzistuoja ir yra ganėtinai populiarus, bet čia juk Java… Štai
pavyzdukas:

use Inline Java => <<'JAVA_KODO_GALAS';
    class Javine_klase {
        public Javine_klase(){
        }
        public int prideti(int i, int j){
            return i + j ;
        }
    }
JAVA_KODO_GALAS
my $klase = new Javine_klase();
print($klase->prideti(9, 16) . "\n"); # atspausdina 25

Kiekvienai Java kodo klasei iškviečiamas javac
kompiliatorius, tada Perlas apžiūri sukompiliuotas klases ir randa
kokius jos turi viešus metodus. Tada šie metodai ir klasės pasiekiami
per Perlą lyg jie būtų rašyti pačiu Perlu. Gražu.

Perl6 – better Perl than Perl

Perl6-language mailing liste pasirodė threadas, kuriame
klausiama kaip būtų galima keliais žodžiais nusakyti Perl6.
Man labai patiko Sam Vilain atsiųstas eilėraštukas:

Perl6 is --
A better Java than C#,
   A better Lisp than Scheme.
A better Makefile than Prolog,
   A better macro assembler than C.
A worse ADA than Python,
   A better awk than Perl5.

With apologies to poets worldwide.
-- 
Sam Vilain, sam@vilain.net

Java: gal ne taip ir blogai

Šį vakarą praleidau (man) labai neįprastai: programavau Java. Taip,
aišku ne savo noru. Prašomas pažįstamos merginos, kuriai reikia
padaryti darbą. Na, aš tikrai nesu Java guru, tiesą sakant Java beveik
visia nemoku. Atsimenu prieš kokius metus ar porą bandžiau kažką daryt
su Java ir mane tai labai užkniso (hmm… atsimenu tais laikais Java
1.1 buvo naujovė… tai turbūt tikrai senokai). Na, galvojau, nieko
nebus. Aišku užduotis lengva, nusiskaityt bylas iš direktorijos,
aprašyti keletą jas apibūdinančių parametrų ir rezultatus išsaugot į
kitą bylą. Kokios trys eilutės Perle (jei viską daryt tik konsolėj),
arba kokia dešimt jei naudot GUI per Tk. Žodžiu galvojau kad teks
pasiniurkyt porą vakarų prie šito. Klydau.

Pasigriebęs seną Oreilly knygą apie Java, trumpai
pasiRTFMinau ir kibau į darbą. Po valandos, savo paties
nuostabai, turėjau veikiančią programą. Ar čia aš subrendau ir
patobulėjau kad per valandą galiu nauja kalba parašyt programą, ar
Java tapo lengvesne ir suprantamesne? :)

Aišku jokiu būdu ten nėra gera programa. Ir ilgoka gavosi. Su
visomis GUI išėjo 70 eilučių. Bet veikia. Tiesa, kai kuriose vietose
primena LISP’ą savo skliaustelių gausa ;):

pw.println("Dydis: " + (new File(".",l.getSelectedItem())).length()+" baitu");

Na bet čia mano programavimo stiliaus klaidos gal. Reikia gal
pakeisti savo požiūrį į Java nuo “bjauri, vemt verčia” į
“pakankamai bjauri bet, kraštutiniu atveju galima naudot”.