perl away

(Da, stiu ca n-am mai scris de mult, sorry).

Uite problema pe care am avut-o azi: sa se ia un script existent care sterge dintr-un maildir mailurile mai vechi decat o data specificata in linia de comanda si sa se ajusteze sa ia si parametru de tip "X days ago".

Sounds pretty easy. And it is. Da' mi s-a facut mila cand am vazut ca scriptul (perl) se uita intr-un maildir cu sute de mii de fisiere si itereaza peste `ls -g -G -U --time +%Y%M%d`, asa ca m-am induplecat si l-am rescris (zic eu) mai elegant.

In primul rand mi-am zis ca e pacat sa faci mega-liste cu ls si ca poti gasi ceva metoda decenta de a face asta direct din perl. Cu ce traversezi frumos structuri de fisiere? Cu File::Find, of course! E in core? Este de la 5.0, nu e nevoie de instalare. Un super feature al lui File::Find e ca exista un programel care se cheama find2perl care accepta (aproape orice fel de) argumente pentru GNU find si returneaza un program perl care face aceeasi chestie cu File::Find (ocazie cu care mi-am adus aminte ca in Higher Order Perl era un capitol foarte dragut cu ce poti face cu stilul asta de callbacks, ar trebui sa-l recitesc). Bonus points ca am descoperit ca stat() face cache la filehandle in _ ca sa poti face repede mai multe teste succesive pe acelasi fisier. Useful trick.

Boon, acum aproape ca avem un script decent, ramane sa-i fac si partea de UI, anume stabilita semnificatia argumentelor. Mi-am adus aminte ca Damien Conway avea niste sfaturi utile in Perl Best Practices, asa ca am recitit capitolul cu pricina (bine ca port dupa mine exemplare electronice pirat ale cartilor din biblioteca), ocazie cu care am adaugat si Getopt::Long in lista de dependinte (don't worry, tot core module). Am adaugat ici-colo niste defaults si niste mesaje, si iaca scriptuletul. Nu e cine stie ce, dar mi-a dezmortit putin mintea (sunt gripat zilele astea) si, sper eu, va fi mai usor de citit/debugat de catre urmasi. Maine fac si niste teste de performanta, sunt curios cum se comporta fata de versiunea dinainte.

PS: Am cautat cateva minute si n-am gasit niste template-uri decente de usage(), help() si eventual POD pt. subrutine. "Decent" inseamna "nu trebuie musai sa fie CPAN-friendly, dar cat sa arate ok la un --help sau perldoc". Please share.

sysadmin day 2010

Anul asta n-am prea mult timp de "ziua noastra", dar dau cateva linkuri de sezon:

devops humor

Banuiesc ca dintre putinii mei cititori se gasesc cativa care sa urmareasca fenomenul Devops (sau DevOps? sau ##devops? whatever). Le recomand trei id-uri de twitter care sunt in ultima vreme un soi de lolcats pt. mine:

@ShitMyDevOpSays, @devops_borat, @DBAHULK

(call me sick, dar rad la cam toate glumele de-acolo, cum ar fi: "If you like masturbate on Java, I use nosql and tell you also like masturbate on Ruby, Clojure and TDD. #hunch")

Have fun ;)

RLUG – intalniri de weekend

So, am dat deja de stire pe lista, vreau ca weekendul urmator sa incerc un alt format de intalniri: sambata pe la pranz, intr-un format ceva mai deschis, fara proiector sau prezentari prestabilite, om vedea ad-hoc ce iese, in functie de cine vine, fie ca s-o lasa cu ceva reparari de laptopuri, fie ca ne povestim pataniile recente sau incropim ceva tutoriale. Deocamdata nu garantez prezenta altcuiva in afara de mine, asa ca nu va asteptati la prea mult de la prima editie :D

Motivul pentru care am initiat miscarea asta e faptul ca pe la intalnirile noastre lunare din a doua joi a lunii vin relativ putine fetze noi care se fofileaza repede-repede dupa sesiunea de prezentari, astfel incat "la bere" ramanem tot cei "din vechea garda". Poate fie orarul, fie situatia mai interactiva sa incurajeze oamenii noi sa iasa la vedere.

Treaba asta se va desfasura sambata 29 mai, intre orele 11-13 intr-o sala a Bucharest Hubb, pe strada Stelea Spatarul nr. 21 (in zona Sfanta Vineri, unde am avut si intalnirile precedente). Dat fiind ca spatiul e relativ restrans, sugerez celor care au mai mult chef de socializare decat de Linux sa apara pe la 12:30-13:00 ca sa ne retragem la o terasa/carciuma/parc/whatever.

Cine are nevoie de mai multe detalii, e rugat frumos sa le ceara, sa n-aud texte cu "as fi venit, dar nu stiam unde" sau alte asemenea.

Doi la suta si de ce nu ma intereseaza

Saptamana asta este data limita pentru depunerea formularelor minune de redirectionare a 2% din impozitul pe venit catre o entitate non-profit la alegere. Marea majoritate a acestor entitati, asociatii si fundatii, isi imping campania la extrem pe ultima suta de metri mai ceva ca un candidat prezidential in preziua alegerilor. Personal (repet, per-so-nal) am decis ca nu o sa insist prea tare cu cererile de 2% pentru Asociatia Prolinux pentru ca cine era dispus sa doneze a facut-o deja (probabil catre cauze mult mai nobile si in mai mare nevoie de bani) iar cine n-a facut-o ar face-o doar ca sa se culce pe o ureche ca a facut o fapta buna pe anul asta.

Am facut socoteala cat e acel 2%. Data fiind cota unica de impozitare pe venit de 16%, 2% dcin inpozit ar fi ceva mai mult de 3 la mie din venit. Adica trei lei (hartii de-alea verzi) la fiecare zece milioane (zece hartii de-alea albastre). Cu alte cuvinte, alergatura cu hartiile aduce dupa ea donarea a ~10 RON pe luna (give or take, stiu destui oameni cu mai putin de trei mii salariu si destui peste;probabil media e sensibil mai jos, mi-a fost frica sa ma interesez). Nu stiu altii cum sunt dar eu incerc sa sustin diverse cauze nobile si nu gasesc imposibil sa dau de mai multe ori pe an fabuloasa suma de un milion si ceva. Direct celor care au nevoie de ea, fara jdemii de ture prin diverse ministere.

Departe de mine gandul de a sugera oamenilor sa NU doneze acei 2%. By all means, daca puteti gasi timpul necesar sa completati si depuneti formularul cu pricina, do it! Dar tineti cont ca e vorba de un milion si ceva (intr-un an, aproape 4% din venitul pe o luna). Nu e doar o bifa, e un bun inceput. In ultimele doua luni am intalnit o gramada de cauze carora as fi dedicat daca nu timp si efort, macar niste bani si intentionez sa o fac pentru cat mai multe dintre ele in anul urmator. Recomand asta oricui a fost macar vag interesat de programul "Doi la suta".

cand n-are omul de lucru, isi face

Cei care mai umbla prin locul de pierzanie numit #mumu sunt relativ la curent cu faptul ca saptamana asta a ajuns serverul pentru care am facut atata tam-tam acum ceva vreme. Pentru mine partea grea abia incepe. Cateva zile la rand au durat "negocierile" hardware (intrucat daca pui la un loc diverse componente pretentioase, nazurile se multiplica), dar pot anunta ca suntem (oarecum) in faza in care toate avem un server functional dpdv. hardware si testam configuratia. Vorbesc la plural pentru ca desi chipurile e treaba mea asta, sunt un whiner si cer mereu sugestii si ajutorul altora (dar macar sunt un whiner recunoscator).

Nu stiu exact cam cat mai dureaza (multumesc inca o data celor de la Ines si pe aceasta cale ca ma lasa sa tin amandoua masinile in paralel pana ma scarpin in cap), dar la intalnirea de joi planuiesc sa improvizez (hopefully tot asistat, macar din public) un segment despre cum a mers si ce probleme am avut pana atunci. Cu poze, screenshoturi si live demo (well,  ssh pe obiectul in cauza). Asa ca va invit sa veniti sa vedeti unde-s banii dumneavoastra :P

PS: sugestii sunt oricand binevenite, asa ca daca e vreunul interesat de amanunte operationale, dati-mi de stire si va pun la curent.

uneori trebuie si mai din topor

Inainte de toate, admit ca nu e prea frumos ce urmeaza sa prezint, nici ca idee, nici ca implementare, dar pledez pentru "temporary insanity", asta sa nu avem vorbe ;)

Problema cu care m-am confruntat e un site "pehaspe-maieschiuel", cu articole tinute in db, care suferea de clasica problema "s-au stricat diacriticele". La inceput mi-am zis, eh, am mai facut de-astea, un iconv bine plasat pe dumpul initial, import si alter tables, dupa care ta-da!

Ntz. Site-ul suferise de vreo doua astfel de migrari, plus diversi destepti care au "reparat", plus editori diferiti, plus copy-paste din word (cu bulinute, smart-quotes, em-dashes, ellipsis, samd). Caracterele cu diacritice erau in vreo trei forme diferite, asa ca nu puteam gasi o solutie generica. Ca atare am facut un script care sa inlocuiasca diversii "viermisori" cu lucruri mai normale. Eu am transformat totul la ascii pentru ca oricum aveam mai bine de jumatate din texte scrise fara diacritice si am zis ca nu ma mai complic degeaba. Scriptul pe care l-am folosit de fapt e ceva mai complicat pentru ca scormoneste prin DB si imi da si contextul in care gaseste caractere necunoscute, pentru a completa hashul, plus ca face si update.

Am produs pana la urma doua hash-uri, pentru a forta precedenta intre cateva substituiri, dau mai jos hashurile folosite si cum se pot utiliza (pentru a preveni "false friends" cauzati de diversele transformari RSS-friendly, recomand downloadul direct, intrucat contine caractere UTF-8 multibyte si cateva caractere html-encoded):

my %changes = (
 'ş' => 's',
 'Ş' => 'S',
 'ţ' => 't',
 'Ţ' => 'T',                                               
 'ă' => 'a',                                               
 'Ă' => 'A',                                               
 '–'    => '-',                                                 
 '…'    => '...',                                               
 'î'     => 'i',                                                
 'Î'     => 'I',                                                
 'â'     => 'a',                                                
 'Â'     => 'A',
 '“'    => '"',
 '”'    => '"',
 '„'    => '"',                                                 
 '¬' => '',
 '‘’' => '"',
 '’’' => '"',
 '’' => '\'',
 '‘' => '\'',                                                   
 ## these two might deserve a <ul>                              
 '•' => '*',
 "\x95" => '*',
 "a\xA2" => 'a',
 "\xE2" => 'a',
 "\xEE" => 'i',                                                 
 "\xCE" => 'i',                                                 
 "\x84" => '"',
 "\x85" => '...',                                               
 '½' => '1/2',
 '«' => '"',
 '»' => '"',                                                    
);          

my %changes2 = (                                                   
 "\x93" => '"',
 "\x94" => '"',                                                 
);          
## sometime later...
 for ( keys(%changes) ) {
 $text =~ s/$_/$changes{$_}/gs;
 }
 for ( keys(%changes2) ) {
 $text =~ s/$_/$changes2{$_}/gs;
 }

Probabil ca gaseam cateva module care rezolvau treaba asta mai elegant, dar cum spuneam, I plead temporary insanity. Mai am cateva dude pe care n-am reusit sa le identific corect, dar deocamdata a functionat. Daca vreun webdeveloper citeste chestia asta, e rugat frumos (dar printre dinti) sa foloseasca utf-8 peste tot, de la baza de date la encodingul paginii. Kthx.

intalnirea RLUG aprilie 2010

A fost foarte misto, a venit mult mai multa lume dintre "usual suspects" decat pana acum (desi banuiesc ca mai mult din cauza prezentei lui dizzy decat din cauza noii locatii). Pare dragut la Bucharest Hubb acolo, a fost si cineva (Vlad, daca am retinut corect) de la SeedMoney care a tinut un mic pitch despre ce vor ei sa faca acolo, cand o sa ma gandesc la Next Big Internet Project o sa tin cont ;)

Anyway, prezentarea mea fulger a fost despre cum am reusit sa montez partitii de pe snapshoturi de imagini de disc. E tot in S5 (ma gandeam sa incerc latex beamer, dar n-a fost timp), o sa fac scamatoria cu Selenium de care am mai povestit si o sa produc si pdf-uri sa aiba Ovidiu ce pune pe Slideshare (probabil va trebui tunat css-ul sa incapa frumos pe 800x600). Daca intereseaza pe cineva subiectul, ask me si incerc sa fac un articol explicativ.

in other news, ieri am platit avansul pentru server, campania de strangere de fonduri s-a incheiat cu succes, asa ca in vreo saptamana-doua cand apare, o sa am treaba. Multumesc si pe aceasta cale celor care au contribuit cu bani sau cu "buzz". Stiti voi cine sunteti :D

campania “Donatii pt. server”

Am publicat adineauri asta si pe RLUG, dar zic si aici pt. mai multa vizibilitate (haha):

---8<-------------------------------------------------------
Subject: Campania "Donatii pentru server"
From: Petru Ratiu
To: Romanian Linux Users Group

Hello,

Dupa cum majoritatea dintre voi stiti deja, serverul actual care gazduieste listele de discutii si mirrorul ftp.ines.lug.ro abia mai respira. Asadar, am ajuns, dupa 6 ani in care actualul server si-a facut datoria, in situatia de a-l inlocui cu unul nou-nout pentru a ne putea continua fara probleme discutiile pe liste, uploadurile si downloadurile.

Avand in vedere ca am beneficiat cu totii de ajutor venit via listele de discutii ale RLUG si a mirrorurilor ftp.lug.ro, si pentru ca sigur v-ati intrebat cum sa ajutati si voi la rindul vostru pe ceilalti, avem azi, iata, un motiv concret sa aratam din nou ca suntem o comunitate serioasa (sic!).

Asadar, dupa lungi dezbateri, am ajuns la concluzia ca Prolinux, care se ocupa de aceasta campanie (prin rpetre, wolfy si cmatei) are nevoie pentru achizitionarea serverului comunitatii RLUG de circa 2600 euro, masina respectiva urmand a fi achizitionata (prin intermediul unui dealer care ne face serviciul de achizitie fara a percepe vreun comision) de la unul dintre importatorii de echipamente Supermicro (http://www.elko.ro -- care nu vind direct catre end useri ).
Componentele asupra carora am convenit sint urmatoarele:

- sasiu Supermicro 836TQ-R800B;
- placa de baza Supermicro X8ST3-F-B;
- procesor Intel E5504;
- memorie Kingston 2*2 GB, ECC;
- 9 discuri Western Digital WD15EARS.
(In vederea reducerii costurilor ne-am asumat riscul de a folosi discuri de clasa desktop, chiar daca sint mai putin fiabile decit cele de tip "enterprise".)

Propunerile de componente si discutiile premergatoare alegerii le puteti vedea la http://wiki.lug.ro/mediawiki/index.php/Hardware_Requirements si respectiv la http://wiki.lug.ro/mediawiki/index.php/Discu%C5%A3ie:Hardware_Requirements .

In acest moment situatia sumelor de care dispune Prolinux este urmatoarea:

Target aproximativ: 11000 RON ( 2200 EUR + TVA )
Sumele donate pana la aceasta ora: 800 RON, dupa cum urmeaza:
* 200 RON - anonim
* 500 RON - anonim
* 100 RON - anonim
Donatii promise, inca nevirate: 1500 EUR, dupa cum urmeaza:
* 1000 EUR - anonim
* 500 EUR - anonim

Nota: Intrucit unii donatori si-au exprimat dorinta de a ramine anonimi, i-am lasat asa si pe cei care nu si-au exprimat explicit dorinta de a fi mentionati.

Restul de bani pana la suma de 11000 RON speram sa il strangem cu ajutorul donatiilor voastre, a membrilor inscrisi pe listele RLUG, cel tirziu 3 saptamani de la data depunerii avansului, in contul:

Asociatia Prolinux
RO69 PIRB 4246 7240 0500 1000
Piraeus Bank Romania
Agentia Chibrit

De asemenea, Prolinux e eligibila pt. donarea a 2% din impozit (detalii: http://wiki.lug.ro/mediawiki/index.php/Doilasuta ) si accepta sponsorizari.

Tin sa mentionez ca restul banilor (in cazul in care va exista un rest) va ramane "la vedere" in contul asociatiei Prolinux. Mai mult, la cerere, oricine poate verifica situatia facturilor/chitantelor referitoare la aceasta achizitie.

Va multumesc anticipat pentru efort,

--
Ratiu Petru
Trezorier, Asociatia Prolinux

------------------------------------------------------->8---

So, daca va intereseaza in mod direct un ftp.lug.ro modern, cu spatiu pentru mai multe distributii si arhitecturi, stiti ce aveti de facut.

ubuntu si “flacara violet” – explicatii

Am citit adineauri un post de-al lui Mark Shuttleworth care explica ce au incercat sa obtina cu noua tema din Ubuntu, sau mai bine zis "identitate vizuala a Canonical+Ubuntu". Chiar daca eu personal nu ma prea omor dupa movul ala in special si dupa Canonical in general, e interesant de vazut ce lucruri au luat in calcul. Astept sa vad fontul la care se refera si cat de bine suporta Unicode, suna foarte bine ideea.