31. January 2012 · Write a comment · Categories: perl, tech · Tags: ,

use strict‘.

Are 2 aspecte:

1. Perl permite unui program crearea automata a variabilelor, in orice loc din program, fara a fi nevoie ca acestea sa fie declarate inainte. Aceasta facilitate foarte comoda pentru programator, este in acelasi timp o incredibila sursa de bug-uri intr-o aplicatie. Atunci cand folositi ‘use strict’ Perl va genera erori de fiecare data cand o variabila este folosita fara a fi declarata inainte.

Bad code:

       $i = int rand(100);

        print $i;

Good code:

       my $i;

        $i = int rand(100);
        print $i;

2. Pentru ca Perl ofera mai multe moduri in care se poate realiza ceva, deseori incearca sa determine din context ce anume a vrut programatorul sa faca. Cateodata reuseste, alteori nu.

Exemplu:

      $a = test_value;
       print "Value: ", $a, "\n";
       sub test_value { return "test passed"; }

In exemplul de mai sus, Perl va initializa variabila $a cu sirul de caractere test_value, nu cu rezultatul intors de functia test_value(), pentru ca:

  • test_value nu este marcat corespunzator ca fiind apel de metoda, folosind ()
  • la momentul interpretarii primei linii, Perl inca nu “stie” ca exista o metoda numita test_value();

Varianta corecta:

       use strict;
       sub test_value; #Se declara functia ce va fi definita mai tarziu
        my $a = test_value();
        print "Value: ", $a, "\n";
        sub test_value { return "test_passed"; }

Inspiratie: de aici.

30. January 2012 · 4 comments · Categories: perl, tech · Tags: ,

Incepand de astazi, o sa pun, in functie de timp, un serial de tips & tricks pentru perl in care am de gand sa povestesc lucruri utile, scurte si la obiect. Tutorialul este pentru persoane care au avut deja contact cu perl si l-au folosit macar pentru a scrie cateva scripturi. Azi, partea 1:

Bad:

 #!/usr/bin/perl

  print "Hello world";

Good:

 #!/usr/bin/perl

  use warnings;
  print "Hello world";

Implicit, interpretorul de perl pleaca de la premisa ca programatorul stie ce scrie/face si prin urmare ii ofera destul de multe libertati. ‘use warnings’ activeaza o serie de verificari ce au ca scop reducerea bug-urilor generate de folosirea incorecta a limbajului.

Exemplu:

 use warnings;

  $filename = "./logfile.txt";
  open (LOG, $fn);
  print LOG "Test\n";
  close LOGFILE;

Fara ‘use warnings’, codul de mai sus ar fi rulat de interpretorul de perl care nu ar semnala nici un fel de eroare, insa nu ar functiona deloc. Adaugand ‘use warnings’, perl ne semnaleaza:

  1. variabila $filename este initializata si nu mai este folosita;
  2. handler-ul LOGFILE este folosit doar o data, la apelul lui close;
  3. variabila $fn este folosita fara a fi initializata;
  4. functia print() incearca sa scrie intr-un fisier ce nu a fost deschis;

Intotdeauna folositi ‘use warnings’ !

Inspiratie de aici.

Nu stiu altii cum sunt insa mie imi place foarte mult ca lucrurile sa fie structurate bine. Sa fie cat se poate de atomice si sa coabiteze pasnic cu alti atomi intr-un echilibru cat mai aproape de perfectiune. In acelasi timp trebuie sa ofere un anumit grad de flexibilitate absolut necesar intr- o comunitate. Dupa parerea mea structura codului trebuie sa respecte unul din principiile de baza ale GNU/Linux: un program trebuie sa permit folosirea sa ca generator de input initial, tranzit sau output final. Cumva, asa am facut intotdeauna. Am spart o problema in bucati mai mici pe care le-am facut astfel incat sa poata fi folosite nu numai in cadrul aplicatiei pentru care au fost concepute cat si in alte aplicatii (ofc, acolo unde este posibil ;) .

Teoria suna ca mai sus. Majoritatea celor ce programeaza (la orice nivel si in orice limbaj) cunosc principiile. Le cunosc adica au cunostinta ca ele exista, insa nu le aplica decat mult prea putin. Insa, atunci cand codul sursa este evaluat si sunt descoperite probleme, cel mai des sunt invocate lipsa timpului sau presiunile din partea superiorilor. Amuzant (si trist in acelasi timp) este ca evitarea principiilor sanatoase in scrierea aplicatiilor, impreuna cu resursele mai mari necesare, duce in cele din urma la costuri mai mari asociate cu mententanta si dezvoltarea ulterioara.

In urma cu cativa ani (vreo 3, daca nu ma inseala memoria), am vazut intr-o prezentare din cadrul proiectului GEANT (un proiect european foarte mare in care sunt implicate cam toate NREN-urile din Europa) un principiu foarte interesant: “principiul pisicii moarte”; care este legat de pasarea responsabilitatii la “ceilalti”. Principiul pisicii moarte spune “nu sunt eu de vina, ceilalti sunt pentru ca …”. Ei bine, acest principiu este una din problemele majore la proiectele mari, mai ales la cele comerciale. Iar in scrierea aplicatiilor este foarte usor de folosit acest principiu pentru ca problemele sunt descoperite foarte tarziu, in cazul in care sunt descoperite, iar investigatiile sunt destul de greu de realizat. Problemele generate sunt foarte multe si variaza de la bug-uri ciudate la probleme de securitate majore iar in unele cazuri duc chiar la bug-uri majore ce nu pot fi corectate si care pot afecta core-ul unei aplicatii.

Din pacate factorii autohtoni ce ar trebui sa fie promotorii principiilor sanatoase de coding evita sa se implice in mod real in promovarea si explicarea importantei acestora si se multumesc doar sa le mentioneze pe alocuri, bifand in agenda yet another … thing.

28. January 2012 · Write a comment · Categories: howto, tech · Tags: ,

Am mai aflat ceva azi (ma rog, ieri). Daca ai un bind9 pe undeva, in care tii niste zone, si e musai ca pentru fiecare din zonele de acolo sa afli niste statistici de genul: cate query-uri au fost pe domeniul x.ro sau cate transferuri de zona s-au facut, tot ce ai de facut este sa-i spui lui bind: zone-statistics yes; Si gata :) rndc stats si bind va face un dump pe disc  (pe Debian/Ubuntu statisticile vor fi varsate in /var/cache/bind/named.stats; numele se poate schimba din config) cu toate statisticile pe zone. Urmatorul apel al rndc stats va adauga informatiile noi la fisierul deja existent. Normal, activarea acestei optiuni utilizeaza cativa MB suplimentari de memorie, dar ce nu facem noi pentru un scop nobil ?

 

27. January 2012 · 2 comments · Categories: ganduri, tech · Tags:

Eu folosesc statii de lucru cu Linux, MacOSX si Windows, unde Linux este in diverse combinatii si arome :) Pe toate statiile (mai putin pe cele cu MacOSX unde functioneaza impecabil), noua tema implicita de la Google (gmail si reader) se misca infiorator de lent. Interesant e ca pe toate platformele folosesc aceeasi versiune a aceuiasi browser. Oare de ce se intampla asta ?

 

Ma intreb de ce oare majoritatea aplicatiilor care au suport pentru corector gramatical activeaza implicit fara sa ma intrebe nimic ? Ce este cel mai trist este ca desi se lauda ca stiu aia si ailalta, de fapt nu au suport pentru romana, ceea ce le face inutile daca aplicatia este folosita in romania, nu ? Si mai trist este ca desi majoritatea oamenilor specifica in timpul instalarii, Romania, EEST aplicatiile nu prea tin seama de aceste informatii. Si cand te gandesti ca ar fi atat de simplu sa:

if ($country ! in $supported_grammar_countries) {
    disable_spelling();
}

sau, varianta eleganta:

if ($country ! in $supported_grammar_countries) {
    ask_user_about_spelling();
}

Dar deh, e mai simplu sa pui indieni sa scrie ceea ce un contabil gandeste decat sa te gandesti la ceea ce ar fi util pentru utilizatori.

13. January 2012 · Write a comment · Categories: hobby · Tags:

Ceaiul din $subj, este unul din cele mai aromate ceaiuri care le-am savurat in ultima vreme. Pe eticheta lui scrie asa: ceai verde, bucati de scortisoara, izma, nucsoara, ghimbir, cuisoare, piper. Si mai scrie ca e recomandat la raceala si ca e bine sa-i puneti si niste miere. Eu n-am fost racit dar ceaiul cu siguranta a fost bun. O sa mai iau ;)

Intr-una din zile, am instalat pe undeva un server pe care am pus OpenSuSE 12.1 . Care OpenSuSE 12.1 vine cu systemd pe post de sysv init replacement. Departe de mine nerecunoasterea calitatilor lui systemd, pentru ca are un feature list destul de mare si care face sens. Unul din features era SysV & LSB compatibility. Ei bine, se pare ca scriptul custom de pornit firewall-ul folosit anterior, pe un suse 11.2, nu mai mergea neam pe 12.1 . Desi era recunoscut de catre systemd si era marcat sa porneasca la pornire, ceva nu-i convenea. Ofc, nu zicea ce :) Cum in lumea moderna e musai sa ai firewall am purces voiniceste la creat un systemd compatible, care sa faca 2 lucruri:

  1. iptables-restore /etc/sysconfig/iptables (la start)
  2. iptables -F (la stop, presupunand ca default policy e ACCEPT)

A iesit asta (/etc/systemd/system/iptables.service):

[Unit]
Description=Custom iptables script
ConditionPathExists=/etc/sysconfig/iptables

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/usr/sbin/iptables-restore /etc/sysconfig/iptables
ExecStop=/usr/sbin/iptables -F

[Install]
WantedBy=multi-user.target

Acum ce sa zic .. imi place :) E mai scurt si mai la obiect decat scriptul vechi (care tot de mine era facut btw) si eu zic ca e mult mai usor de inteles.

11. January 2012 · Write a comment · Categories: ganduri, tech · Tags:

Zilele trecute povesteam despre RIPE si whois. Si hai sa spun personajelor carora le vorbeam sa intre pe site-ul de la ripe. Din greseala, in loc de ripe.net le-am zis ripe.org . Ia ghiciti ce-i pe ripe.org :-S Mda, nici eu nu stiam. Oare cei de la RIPE stiu ?

10. January 2012 · Write a comment · Categories: social · Tags:

Urmatoarele 2 citate sunt de pe site-urile a doua institutii de stat din Romania:

  1. Prin fax se pot modifica adresa de email sau numele detinatorului dreptului de folosinta pentru DOMENII ACTIVE in baza de date whois. Oricare alte modificari sunt posibile numai on-line.
  2. Începând cu data de 1 octombrie 2008, formularul de notificare se transmite on-line. În mod excepţional, în cazul în care anumiţi operatori nu dispun de mijloacele tehnice necesare transmiterii formularului de notificare electronic, acesta se poat e completa on-line la sediul autorităţii de supraveghere sau se va transmite, în format de hârtie, prin poştă. În această situaţie, notificarea va fi însoţită de o adresă prin care operatorul justifică imposibilitatea transmiterii formularului de notificare în sistem on-line.

Primul e de pe site-ul ROTLD iar al doilea de pe site-ul Autoritatii Nationale de Supraveghere a Prelucrarii Datelor cu Caracter Personal . Daca in cazul RoTLD e oarecum normala inclinarea spre online, cazul ANSPDCP nu poate decat sa ma bucure. Astept cu nerabdare ca oamenii de Neanthertal sa termine de studiat focul si sa se apuce de studiat roata, pentru ca peste 2000 de ani sa putem vedea si pe site-ul lor anunturi ca cele doua de mai sus.

Switch to our mobile site