Vėl pykstu ant PHP

Jau antrą kartą šią savaitę esu supykęs ant PHP, nors šį kartą gal ne
tiek supykęs bet dar kartu ir pasimetęs. Būtent man sugadino nuotaiką šis PHP vabaliukas.
Atrodo jis turėtų lyg būti pataisytas, tik kažkokiu mistiniu būdu man
sesijų kintamuosius prie URL prideda su &, o ne
& (nors vartoju PHP versiją 4.3.3 –
vabaliukas pastebėtas ir ištaisytas 4.0.4 versijoje). Ko pasekoje aišku
puslapis nesivaliduoja kaip XHTML. Heh.

Programavimo kalbų saugumas

Perlmonksuose kilo diskusija apie tai kokia kalba yra saugesnė
– PHP ar Perl. Atsakymas bent jau mano nuomone yra vienareikšmis
(ne, atsakymas nėra Perlas) – saugumas priklauso ne nuo
kalbos, o nuo programuotojo. Galima rašyti nesaugias (lygiai taip kaip
ir saugias) web aplikacijas tiek su PHP, tiek su Perlu, tiek su C, tiek
su Pitonu ar Java. Aišku kaip sako amerikonai „the devil is in
the details
“ – kai kurios kalbos saugumo prasme leidžia
užmerkti akis ir pasitikėti pačia kalba (kartais be reikalo), kai
kuriose pats turi pasirinkti kaip užtikrinsi saugumą.

PHP aplikacijas senais laikais buvo gana sudėtinga padaryti saugias
(register_globals=On?), bet jau senokai ši situacija
pasikeitė. Kalba įgavo naujų saugumo galimybių, tik neaišku ar patys
programuotojai pasikeitė nuo tų laikų kai viskas buvo globalu. Vis dar
tenka matyti baisius Dreamweaver‘iu darytus skriptus su
globaliais kintamaisiais ir jokio parametrų tikrinimo. Perlas nuo senų
laikų irgi buvo gana nesaugus, ir vėlgi ne dėl pačios kalbos, o dėl
programuotojų neišmanymo. Perlo bendruomenė iki šiol griežia dantį ant
Matt’s Script Archive, kurio
programose skylių daugiau nei kodo eilučių. Kas blogiausia, daug žmonių
būtent mokėsi Perlo iš tokių kreivų skriptų, nepagalvodami apie saugumą.
Tiesa, Perlas gali ir pagelbėti programuojant saugias aplikacijas: tam
yra taint mode (-T), CPAN yra gerų saugumui padedančių modulių, o Perlo
įpraiškos tokios lengvos (na… reliatyviai lengvos. bet jei
programuotojas negali suprasti paprasčiausių įpraiškų, ta ir negalima
sakyti, kad jis moka Perlą) naudoti, kad jomis labai paprasti išsivalyti
reikiamus duomenis.

Galvoje dabar sukasi mintis „Jei programuotojas
ignoruoja kalbos pateikiamus saugumo įrankius, tai kaltas
programuotojas, o ne kalba.
“ Ir nesvarbu kuo jis
programuoja.

Ilga pertrauka

Ilgokai čia nerašiau. Kaip pasakė kažkoks Amerikos
weblogininkas, internetiniai dienoraščiai dažnai būna pilni
atsiprašymų, jog dėl susikaupusių darbų ar dar ko nors nėra laiko juos
pildyti. Tad štai man dabar yra panašiai ;-).

Pačiame Lietuvos internetinių dienoraščių pasaulyje pradeda jaustis
štilis (mada pradeda praeiti?) – štai Džibas neatnaujina savo dienoraščio jau
20 dienų, aubergine miręs visą
mėnesį (nors gyvybingumu ir taip nepasižymėjo), blondattack ryškiai
sužibo ir greitai perdegė, why2liz primigęs rudens miegu,
Xawiers matyt užsiėmęs šeimyniniais
reikalais, ir t.t. ir panašiai. Įdomu kaip čia viskas toliau vystysis,
ar atgis visi tie dienoraščiai, ar bus užmiršti kaip senos asmeninės
svetainės iš gūdžių 1996 metų su užrašais „Under
construction
“ ir <blink> žymėmis?

Automatiniai CSS generatoriai

Pastaruoju metu labai populiarėja visokie internete pasiekiami
automatiniai CSS dizainų
generatoriai, kurie leidžia vienu formos užpildymu susikurti standartus
atitinkančią svetainę be lentelių. Štai du, kuriuos neseniai atradau: Layout-o-Matic
ir Firdamatic.
Tikėkimės kažkada ir Frontpage generuos standartus atitinkančius
dizainus be lentelių (na, pasvajokim…)

Prie to pačio dar šiandien išsibandžiau Style
Master
programėlę (reiktų kada nors su tais CSS pagaliau susitvarkyt). Atrodo ganėtinai patogus
dalykas. Tik aišku mokamas.

Benchmarkai

LG
sumąstė labai sick idėją – paaukoti kodo komentarus
vardan kodo greičio. Na, nieko čia nuostabaus, kad kodas be komentarų
veikia greičiau – juk greičiau jis nuskaitomas iš disko (Nes
mažiau skaityt. Logiška.) Šiaip pati kodo greitinimo idėja išimant
komentarus yra E V I L
dar išimkit visus tarpus, ir tada bandykit redaguot tą kodą ;-)

Pasibenchmarkinau ir aš. Pagrindinis testavimo skriptas yra paleidžamas iš konsolės. Štai jis
(nenaudoju Benchmark modulio, nes jis skaičiuoja tik realų
procesoriaus laiką, o mums kaip tik reik žinot kiek laiko laukiama
duomenų iš serverio nieko neveikiant):

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use Time::HiRes qw/tv_interval gettimeofday/;

cmpthese(1000, { 'full_php' => sub { get "http://localhost/full.php"},
                 'nokom_php'=> sub { get "http://localhost/nocom.php"},
                 'full_pl' => sub { get "http://localhost/full.cgi"},
                 'nokom_pl' => sub { get "http://localhost/nocom.cgi"},
                 'full_pasm'  => sub { get "http://localhost/full_pasm.cgi"},
                 'nokom_pasm' => sub { get "http://localhost/nocom_pasm.cgi"},
                 'full_c'    => sub { get "http://localhost/full_c.cgi"}});

sub cmpthese {
        my ($kiek, $ka) = @_;
        my $result = {};
        for my $kuri ( keys %{$ka} ) {
                my $start = [gettimeofday];
                &{$ka->{$kuri}} for (1..$kiek);
                $result->{$kuri} = ($kiek/tv_interval($start, [gettimeofday]));
        }
        my @r = sort { $result->{$a} <=> $result->{$b} }
                keys %{$result};
        printf "%10s %.2f kartu/s\\n", $_, $result->{$_} for @r;
}

O štai patys tikrinami skriptai:

full.php

<?php
# blah blah blah
/* blah blah blah */
// blah blah blah
for ($i = 10; $i <= 1000; $i++) {
print "blah";
}
?>

nocom.php

<?php
for ($i = 10; $i <= 1000; $i++) {
print "blah";
}
?>

full.cgi (Perlas per CGI)

#!/usr/bin/perl
print "Content-type: text/html\n\n";
# blah blah blah
=blah
blah blah blah
=cut
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

nocom.cgi

#!/usr/bin/perl
print "Content-type: text/html\n\n";
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

full.c (kompiliuotas su gcc -O3 -o full_c.cgi full.c)

int main() {
        int i;
        puts("Content-type: text/html\n\n");
        for(i = 10; i <= 1000; i++) {
                puts("blah");
        }
        return 0;
}

full_pasm.cgi (Parrot v0.0.11 assembly, kompiliuojamas on-the-fly)

#!/usr/bin/parrot -a
# blah blah blah
# blah blah blah
# blah blah blah

        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

nocom_pasm.cgi

#!/usr/bin/parrot -a
        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

Štai rezultatai:

 full_pasm 92.14 kartu/s
nokom_pasm 92.35 kartu/s
   full_pl 130.01 kartu/s
  nokom_pl 139.57 kartu/s
    full_c 189.88 kartu/s
  full_php 236.95 kartu/s
 nokom_php 278.25 kartu/s

PHP komentarai daro atrodo 17% įtaką kodo greičiui (kas tikrai daugoka),
Perlo CGI kodo su komentarais ir kodo be komentarų skirtumas yra 7% (hmm…
reiktų pasibandyt su kešuojančiu mod_perl – iš vis neturėtų būti skirtumo).
Parrot atrodo tie komentarai nei šilta nei šalta.

Kad ir kaip ten bebūtų, komentarų išėmimas dėl greičio padidinimo yra manau
kvailokas dalykas. Geriau jau kompiliuotis kodą, laikytis jį keše (Zend optimizeriai?).
Na, jei jau labai labai reikia tų kelių procentų grečio padidėjimo (kažkaip abejotina), tai
visada galima pasirašyti perlinį skriptuką, kuris nustripins visus komentarus,
kai jau ruošitės viską dėti į serverį ;-) (ir tai jokiu būdu nereiškia kad galit nekomentuot
savo kodo ;-)

Perl-dev susirašinėjimo sąrašas

Kaip jau labai labai seniai žadėjau, šiandien pagaliau pakūriau
susirašinėjimo sąrašą perl-dev@skopos.lt norintiems
prisijungti prie lietuviškos svetainės apie Perl kūrimo. Norintys
prisijungti prie šio sąrašo turėtų atsiųsti elektroninį laišką adresu
majordomo@skopos.lt su eilute:

subscribe perl-dev

Pagrindinis šio sąrašo tikslas yra lietuviškos svetainės apie Perl
programavimo kalbą sukūrimas. Kartu tai ir galimybė dalyvauti Perliniame
projekte taip išmokstant šią kalbą bei gaunant daugiau patirties.
Tikiuosi šis projektas bus sėkmingas ir naudingas visiems, o ne tik jame
dalyvaujantiems, nes visas kodas bus atviras, o ir pati svetainė turėtų
kaupti lietuvišką dokumentaciją apie Perlą ir skatinti jo platesnį ir
lengvesnį naudojimą.

Naujasis Perlas

Šiandien pilnai perėjau prie naujojo Perl
5.8.1
. Persikompiliavau mod_perl ir panašiai, tad ši
svetainė veikia būtent jau su naujuoju Perlu.

Nors ir yra angliška perldelta, štai
pagrindiniai Perl pokyčiai nuo 5.8.0 versijos:

  • Asociatyviųjų masyvų atsitiktinės tvarkos pagerinimas.
    Anksčiau asociatyviųjų masyvų (hešų) raktai būdavo saugomi ne
    visai atsitiktine tvarka, o dėl to atsirasdavo šiokių tokių saugumo
    problemų (ten viskas labai sudėtinga, bet idėja tame, jog galima kažkaip
    programėlei padaryti DOS ataką).
    Dėl šio pagerinimo gali neveikti kai kurios programos, kurios būtent
    priklausė nuo ne visai atsitiktinės hešų tvarkos (Tarkim turėtų
    skirtis Data::Dumper modulio išvedamų asociatyvaus masyvo
    raktų tvarka)

  • UTF-8 flagas nebenustatomas byloms
    automatiškai, net jei lokalė ir sako jog viskas yra UTF-8
    (Atrodo lokalės dažnai pervertina savo galimybes, ir dėl to būna
    problemų)

  • v-stings (versijų eilutės) prieš =>
    traktuojamos kaip paprastos simbolių eilutės. Tad šitas:

    %h = ( v65 => 42 );

    Iki 5.8.1 reiškė:

    %h = ( 'A' => 42 );

    O dabar reiškia:

    %h = ( 'v65' => 42 );

    Kaip turbūt ir buvo tikimasi.

  • Vėl galima naudotis „nesaugiais“ signalais. Praeitoje
    Perlo versijoje signalai (SIGHUP, SIGKILL ir panašiai) buvo padaryti
    saugiais, t.y. jų vykdymas buvo atidedamas iki paskutiniės
    operacijos užbaigimo, nes ne laiku atkeliavęs signalas galėjo nutraukti
    programą netinkamoje vietoje ir „nulaužti“ visą programą.
    Dabar galima naudoti tiek saugius signalus, tiek nesaugius, užtenka
    atitinkamai nustatyti aplinkos kintamąjį PERL_SIGNALS

  • Dabar galima pririšti su tie() ir masyvus su
    neigiamais indeksais

  • Dabar veikia ir netiesioginė lokalizacija:

     local ${$x}
    
     local @{$x}
     local %{$x}
  • Unikodo lentelės duomenų bazė atnaujinta iki 4.0.0 versijos (kuri buvo išleista visai neseniai)

  • Keletas dalykų kurių bus atsisakyta kitoje versijoje, ir dėl to atsirado naujų perspėjimų: $* kintamasis,
    5.005 versijos stiliaus threadai, pseudohešai.

  • Vienas svarbiausių pagerinimų, kuris užbaigs daugelį metų trukusius šventuosius karus map vs for: map nuo šiol
    supranta savo kontekstą ir nekonstruoja sąrašo grąžinimui, jei jo nėra kam grąžinti.
    Tai žymiai pagreitina map vartojimą tuščiame
    kontekste (tarkim map { print "$_\n" } @a)

  • Daug klaidų pataisyta MAth::BigInt modulyje. Ypač dideli greičio patobulinimai.

  • Visiškai perrašytas perldoc

  • Kai kurie pataisymai threaduose, pataisyta atminties nutekėjimo klaidos Linuxe

  • Pridėta dokumentacija: perlcheat, perlreref (lietuviškas vertimas).

  • Cygwin aplinkoje dabar veikia threadai.

  • Naujos platformos, kuriose veikia Perl: Hitachi HI-UXMPP, LynxOS, IBM’s OS/400 PASE, OpenZaurus (Sharp Zaurus PDA). Vis dar nėra PalmOS :/

Tvarkau stalčių

tvarkiausi šiandien vieną savo stalčių. Veiksmas vyksta kaune, ten
jau senokai nebegyvenu. Užtad stalčius prisikaupęs visokių įvairių
senienų, krapštantis po jį jaučiuosi kaip archeologas, nes kuo gilyn
tuo senesnis kultūrinis sluoksnis. Štai ką radau stalčiuje, pradedant
nuo viršaus (naujausi laikai) ir einant gilyn (arba senyn chronologine
tvarka):

  • Infrared <=> Serial kabelis. Neaišku iš kur papuolęs.
    Ryškiai naudotas bet ne mano. Reiks išbandyt.
  • Varžtai nuo monitoriaus, kurį atidaviau mr2
  • 10 kompiuterinių varžtukų. Labia gerai. Visur man jų trūksta.
  • Motorolos T2299 akumuliatoriai. Gal kam reik?
    Atiduodu.
  • Antikvarinis metalinis kryžius. 10 cm x 15 cm. Hmmm…
  • Omnitelio sąskaitos iš 2001 metų, kai mokėjau ne 200 Lt o 20 Lt
  • Bukletėlis „Kokią dantų pastą pasirinkti?“.
    Nenuskaitytas, nesuteptas dantų pasta.
  • 2001 vasario mėnesio Naujoji komunikacija. Pagrindinis
    straipsnis – CD-RW apžvalga.
  • 1999 rugpjūčio Kompiuterija.
  • 1997 liepos „Popular Science“. Pamenu jog lyg skolinausi
    aš jį iš kažkieno. Ryškiai negrąžinau.
  • Laiškas merginai. Neišsiųstas. (!!! – buvau kažkada
    normalus!)
  • Laiškas IŠ merginos. Merry Christmas, remember me? bla bla
    bla…
    . 2000 Kalėdos.
  • Matlankis, pieštukai….
  • Ant popieriuko užrašyta Napster. Matyt pirmą kart
    išgirdau ir užsirašiau kad nepamiršt
  • Nuotrauka
    (labai tamsi gavos)
  • „SETI@home certificate of appreciation“
  • Delta force klaviatūros išplanavimas. Kažkada
    geiminau
  • „Kauno Jono Jablonskio gimnazijos 1A klasės mokinio Petro
    Kudaro rišliosios kalbos darbai“. Sąsiuvinis tuščias.
  • Trys popieriniai lektuvėliai. Vienas dažytais markeriu sparnais.
    Nei vienas neskrenda.
  • Du skaičiuotuvai
    šviečiančiais ekranais. Fainesnis Canon neveikia. Kitą
    pakūriau.
  • Trijų merginų vizitinės. Su viena dar vis palaikau ryšius. Ką
    tik ji skambino paklaust koks jos slaptažodis.
  • Tarybinis talonėlis autobusui už 4 kapeikas. Nepramuštas. 1985
    metų.
  • Ženkliukas su vienaragiu begančiu pro vaivorykštę. Čia tikrai
    darželio laikai.