Reikalingi Perlo dokumentacijos vertėjai

Vakar gavau laišką iš žmogaus, kuris ruošiasi standartizuoti Perlo programavimo kalbos dokumentacijos vertimo sistemą. Kadangi prieš kokius trejus metus aktyviai tame reiškiausi, tai jis pakvietė mane prisidėti:

I am currently planning to create a platform/repository for the
translation of the Perl documentation. I would like to invite you to
join the “core team” that does the initial planning and will hopefully
co-ordinate the translations as well as contribute to them.

If you are interested in getting involved, please read my “Initial
Posting” to get a more comprehensive view on this project:

http://perldoc2.joergen-lang.com/?p=3

Bėda tame, kad kai perėjau į finansų sritį, su programavimu ir Perlu nelabai ką turiu bendro, tad gal kas nors iš programuotojų ar dokumentacijos vertėjų (kurie dar šioje svetainėje retkarčiais apsilanko) norėtų prisidėti prie šio projekto? Pats tikiuosi atrasti laiko perdėti į naują sistemą (kai ji jau bus sukurta) tuos kelis menkus straipsnelius, kuriuos esu išvertęs.

Kwiki, Perlinis wiki

Šiandien darbe pasikūriau dar vieną nedidelę wiki sistemėlę visokiems greitiems užrašams susikategorizuoti. Savaime suprantama (na, savaime suprantama, jeigu pažįstate mane), ji rašyta Perlu. Labiausiai maloniai nustebino jos įdiegimas. Tereikia instaliuotis modulį per CPAN ir parašyti tris eilutes konsolėje:

moxliukas@bluecarrot:~$ mkdir public_html/kwiki
moxliukas@bluecarrot:~$ cd public_html/kwiki
moxliukas@bluecarrot:~/public_html/kwiki$ kwiki-install
Kwiki software installed! Point your browser at this location.

Paprasčiau nebūna. Beje, ši wiki sistema vadinasi Kwiki, o ją galima rasti čia.

Perl klaida

Pastarąją savaitę Perl susirašinėjimo sąrašuose labai aštriai diskutuojama viena Perl klaida, kuri ką tik buvo ištaisyta. Kai kurie sako, kad tai visai ne klaida, kad viskas turėtų būti palikta kaip ir buvo. Na, gal kas galit pasakyti, kur čia klaida šitame sakinyje:

my $foo = 1 if $bar;

Problema yra tame, kad $foo yra leksinis kintamasis, ir nelabai aišku, kaip apibrėžti jo galiojimo sritį. Jeigu tą patį perrašysime kitaip, tai srities ribos žymiai paaiškės:

if ($bar) {
      my $foo = 1;
}

Iš čia paaiškėja, jog priskyrimas my $foo = 1; yra visiškai bevertis, nes $foo yra vietinis (leksinis) kintamasis, kurio galiojimas pasibaigia tuoj už figūrinių skliaustelių užsidarymo. Bet čia ir yra visa klaida, nes iki šiol jo galiojimas nebuvo užbaigiamas čia pat:

[petras@lietuvoje ~]$ perl -Mstrict -wle 'my $bar = 1; my $foo = 1 if $bar;
print $foo;'
1

…kai Perlas turėtų pasiskųsti, kad bandoma pasiekti nenustatytą kintamąjį.

Dabar ši klaida pataisyta, bet audros nerimsta, nes pasirodo nemažai kodo priklauso nuo šitos klaidos.

Perl konferencija?

Po PHP konferencijos jau kokie trys žmonės manęs teiravosi, ar aš nesiruošiu daryti kokios nors atsakomosios konferencijos Perl tema. Tiesą sakant tokia maža ir neryžtinga mintis buvo kilus, paskui labai greitai jos atsisakiau, o vat dabar tie klausinėjimai vėl privertė ją prisiminti.

Konferenciją suorganizuoti gal ir nėra taip sudėtinga, tačiau pats neaiškiausias dalykas būtų tokios konferencijos reikalingumas (na… kiek žmonių iš vis tai būtų įdomu… Lietuvoj ta Perlo kalba yra primiršta ir entuziastų kaip ir nedaug) bei jos kokybė (Tarkim Perlo pradmenis aš moku gal ir neblogai, bei moku pritaikyti jį web aplinkoje, bet su sistemų administravimo moduliais nesu dirbęs… ir ar atsirastų žmonių kurie sutiktų aukoti savo laiką ir būtų pasiruošę pašnekėti apie vieną ar kitą niuansą).

Randal Schwartz nuomone galima per vieną dieną (8-10 valandų) išdėstyti visą Learning Perl, bet visgi tam reikia tikrai nemažai pasiruošimo, ir vėlgi neaišku ar
tai kam nors reikalinga. Be to, turbūt nedaug žmonių mokosi Perlo šiais laikais kaip pirmos programavimo kalbos, tad galbūt jiems nebereikia paskaitų nuo nulio?

Mano nuomone, dabar turbūt geriausia būtų neorganizuoti kažkokios Perlo konferencijos, o tiesiog pabandyti įkurti Perl Mongers grupę, kuri galėtų kiekvieną mėnesį ar panašiai susitikti, gal išklausyti vieno ar kito trumpo pranešimo ir išgerti draugiškai alaus. Vėlgi, jei tai ką sudomintų. Na, bent jau kokius 5 žmones tai tikiuosi surinksim ;)

Tai va, jeigu turit kokių idėjų, ar bent jau jus tai domintų, tai netylėkit ir susisiekit su manim ;-)

Parrot bei egzegezės

Vakar išleista pirma jau kiek rimtesnė Parrot versija – v0.1.0. Parrot yra platforma, šiek tiek panaši į .NET bei JVM, skirta interpretuojamoms kalboms kaip PHP, Ruby, Python, TCL, Basic, LISP, o ypač Perl6. Šioje naujoje versijoje svarbiausi pokyčiai yra gijų palaikymas (threads), bei svarbiausia – objektai. Taipogi atsirado daug daugiau dokumentacijos. Parsisiųsti
galima adresu http://www.cpan.org/authors/id/L/LT/LTOETSCH/parrot-0.1.0.tar.gz,
o daugiau apie patį Parrot – http://parrotcode.org.

Tuo tarpu Damian Conway išleido septintą egzegezę (Perl6 sintaksės aprašymą) apie tai, kas Perl6 pakeis Perl5 formatus. Atrodo, jog galų gale šių metų pabaigoje jau turėsim Perl6 specifikaciją ir po dar kokio pusmečio turėtume veikiantį Perl 6.0.0.

Naujos versijos

Keletas naujienų iš naujų versijų pasaulio: ką tik išleistas Perl 5.005_04. Tai labai senas perlas, tačiau jei kartais sėdite prie senų dinozaurų, tai atsinaujinimas nepakenks. Daugiausia šioje versijoje yra klaidų pataisymai, bei pritaikymai naujesniems kompiliatoriams.

Kita, įdomesnė naujiena, yra Subversion 1.0 išleidimas. Subversion yra bylų versijų kontrolės sistema, kuri ruošiasi pakeisti CVS. Subversion išsprendžia problemas,
nuo kurių kenčia CVS – ji palaiko bylų pervadinimą, direktorijų struktūros pokyčius, dvejetaines bylas, metaduomenų pokyčius ir t.t.

Oh, ir dar šiek tiek krapštausi su moxwiki. Žiūrėsiu, kiek čia nenusibos.

Perliška vartotojų sistema

Skaičiausi čia neseniai apie Perlo modulį Class::DBI ir šiandieną sumaniau jį šiek tiek išbandyti. Šis modulis yra duomenų bazės objektinė abstrakcija, ir viską daro tokiame aukštame lygyje (t.y. taip toli nuo pačios duomenų bazės), kad norint ja naudotis net nereikia mokėti SQL (OK, OK, SQL visada pravartu mokėti, bet labai paprastiems dalykams gali to ir neprireikti). Taigi išbandymui sugalvojau pasirašyti vartotojų prisijungimo sistemą.

Class::DBI priverčia viską apgalvoti ir išdėlioti objektiškai, į atskirus modulius, tad atsiranda krūvos mažų failiukų, kuriuos reikia dėti kažkur į atskirą lib direktoriją. Bet pirma pradėkim nuo SQL lentelės:

CREATE TABLE `vartotojai` (
  `vartotojoid` int(11) NOT NULL auto_increment,
  `login` varchar(40) NOT NULL default '',
  `pass` varchar(32) NOT NULL default '',
  `status` int(11) NOT NULL default '0',
  `vartotojaskada` timestamp(14) NOT NULL,
   PRIMARY KEY  (`vartotojoid`),
   UNIQUE KEY `login` (`login`)
) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=1;

Tiesa, login yra unikalus, tad realiai užtektų tik jį padaryt pirminiu raktu, bet man kažkodėl patinka turėti ir skaitinį vartotojo ID. Nevisai dar sugalvojau kodėl.

Pradedam apsirašinėti duomenų bazę. Byloje lib/Bilekas/DBI.pm saugom duomenų bazės prisijungimo duomenis:

package Bilekas::DBI;
use base 'Class::DBI';
Bilekas::DBI->set_db('Main', 'dbi:mysql:bilekas', "root", "");
1;

Apsirašome klasę Bilekas::Vartotojas ir išsaugom byloje lib/Bilekas/Vartotojas.pm:

package Bilekas::Vartotojas;
use base 'Bilekas::DBI';
Bilekas::Vartotojas->table('vartotojai');
Bilekas::Vartotojas->columns(All => qw/vartotojoid login pass status vartotojaskada/);
1;

Bilekas::Vartotojas modulyje užtenka tik nurodyti kurią SQL lentelę naudoti, bei kokie yra tos lentelės stulpeliai (jeigu būtų ir daugiau lentelių tai reikėtų nurodyti ir ryšius tarp jų)

Galvojant apie ateitį, reikėtų pasirašyti ir vieną pagrindinį modulį Bilekas.pm, kuris būtų atsakingas už bendrą visai svetainei kodą (reikiamų modulių užkrovimą, CGI objekto sukūrimą, sesijas ir pan). Štai ir Bilekas.pm:

package Bilekas;
use strict;
use CGI;
use CGI::Session;

BEGIN {
        use Exporter ();
	our (@ISA, @EXPORT);
        @ISA = qw/Exporter/;
        @EXPORT = qw/$q $s/;
}

our $q = new CGI;
our $s = new CGI::Session("driver:File", $q, {Directory => '/tmp'});

END {
	$s->close;
}
1;

Šiame pakete yra šiek tiek magijos, kurią vertėtų paaiškinti. Pačioje pradžioje yra užkraunami moduliai CGI ir CGI::Session. Toliau eina BEGIN blokas, kuriuo iš paketo Bilekas vardų srities (namespace) eksportuojami kintamieji $q ir $s – tai leidžia vėliau bet kurioje byloje parašius use Bilekas; iš karto naudotis jau sukurtais ir užpildytais kintamaisiais $q ir $s (viename iš jų yra CGI objektas, o kitame – sesijos objektas).

Kitomis dvi eilutėmis yra sukuriami minėtieji eksportuojami kintamieji, o po to seka END blokas, kuri yra vykdomas paskutiniu programos gyvavimo metu. Jo pareiga yra teisingai įrašyti visus sesijos duomenis į bylą, kad jie neliktų laikinojoje atmintinėje (tą daro $s->close;)

Kadangi turime šitus modulius, galima pradėti jais naudotis. Pirma parašome index.pl, kuris nesant užsiregistravusio vartotojo rodys formą, kurios pagalba galima prisijungti prie sistemos:

#!/usr/bin/perl -w
use strict;
use lib './lib';

# Mūsų parašytieji moduliai
use Bilekas;
use Bilekas::Vartotojas;

# Siunčiame HTTP antraštes (su sausainiuku su sesijos informacija)
print $s->header;

# Jeigu yra nustatytas sesijos kintamasis, pranešantis apie klaidą, tai ją išspausdiname
if($s->param("bilekas_error")) {
        print "<h1>!!! " . $s->param("bilekas_error") . " !!!</h1>";
	# Išspausdinę klaidos pranešimą ištriname šį sesijos kintamąjį, kad
	# nespausdintume klaidos keletą kartų
        $s->clear(['bilekas_error']);
}

# Jeigu yra nustatytas sesijos kintamasis 'user', reiškia vartotojas prisijungęs
if($s->param('user')) {
        print "Esi isilogines kaip UID <em>", $s->param('user')->{vartotojoid}, "</em>";
} else {
	# Vartotojas neprisijungęs, rodome prisijungimo formą
        print <<EOHTML;
        <form action="login.pl" method="post">
        <input type="text" name="user"><br>
        <input type="password" name="pass"><br>
        <input type="submit">
        </form>
EOHTML
}

Beliko parašyti patį prisijungimo kodą login.pl:

#!/usr/bin/perl -w
use strict;
use lib './lib';

use Bilekas;
use Bilekas::Vartotojas;
use Digest::MD5 qw/md5_hex/;

my $location = $q->referer || 'index.pl';

if ($q->param('user') && $q->param('pass')) {
        my $user = Bilekas::Vartotojas->retrieve(login => $q->param('user'),
                                                 pass  => md5_hex($q->param('pass')));
	if ($user) {
		$s->param('user', $user);
		$s->expire(user => "+15m");
	} else {
		$s->param('bilekas_error', "Blogas login/pass");
        }
}

print $s->header(-location => $location);

Sitepoint apie PHP::Strings

Harry Fuecks, PHPPatterns kūrėjas ir sitepoint PHP weblogo savininkas, pastebėjo minėtame webloge mano dabar palaikomą Perlo modulį PHP::Strings. Harry klaidingai mano, jog perlininkai priešiškai nusiteikę prieš PHP dėl to, kad pavydi jam sėkmės. Kiek teko bendrauti su viso pasaulio perlininkais, tai požiūris į PHP visada būdavo neigiamas ne dėl pavydo, o dėl to, kad PHP nelaikoma rimta kalba (dėl tokio įsitikinimo teisingumo, aišku, galima ginčytis, bet enterprise lygyje PHP vis dar neturi tokių stiprių pozicijų kaip Perl, Java ir panašiai). Na, tikiuosi neužvirs šventasis karas dėl mano palaikomo modulio. Juolab, kad stengsiuosi jį padaryti naudingesniu PHP programuotojams.

Smarty ant Perl?

Perlo konferencijoje buvo iškeltas pasiūlymas, kad į standartinius Perlo modulius reiktų įtraukti ir kokią nors šablonų sistemą. Tiesa, ši idėja priimta nelabai gerai, nes paskutiniu metu stengiamasi Perlą sumažinti kiek įmanoma paliekant tik svarbiausius modulius, kurių reikia pačiam Perlui bei kitų modulių pasiėmimui per CPAN.

Tačiau šioje diskusijoje iškilo dar viena labai idomi idėja – galbūt reikėtų nuportinti Smarty ant Perl. Štai citata:

By the way, has anyone written a perl module to correctly interpret the
“Smarty” templating language? My PHP-using co-workers claim it is
becoming the de-facto standard in PHP. This strikes me as odd because
I thought PHP was itself a templating system, but it seems the division
of labor between Modern HTML and Process has become such that it is no
longer enough to embed PHP in web pages, and the PHP “web applications”
are now explicitly generating their output from read-in external files
just like the Perl templating systems. Go figure.

Gal kas apsiimat portint phemplate? ;-)