Blog infoarena

Algoritmiada in cautare de sigla

Cosmin
Cosmin Negruseri
01 decembrie 2008

Anul acesta am decis sa facem putin rebrading si sa schimbam formatul concursului principal organizat de infoarena care pana acum s-a numit preOni. Noul nume ales este Algoritmiada. Mai avem putin timp pana la inceperea rundelor si nu avem inca o sigla. Ca si anul trecut facem apel la comunitate pentru a gasi o sigla misto.

 Comentarii (52)

Categorii:

Petr Mitrichev are Blog

Cosmin
Cosmin Negruseri
30 noiembrie 2008

Am vazut de ceva vreme ca Petr , clasat primul la sectia de algoritmica de pe topcoder, si-a facut blog la adresa petr-mitrichev.blogspot.com . El domina de cativa ani concursurile de pe topcoder si a fost de doua ori pe locul doi la etapa finala a concursului ACM ICPC.

Pe blog discuta probleme interesante si tehnici din concursuri, iar mai recent a inceput sa isi inregistreze competitiile. E foarte misto sa vezi cum lucreaza cel mai tare concurent la concursurile de programare, sa vezi ca mai are buguri din cand in cand, ca mai revine peste sectiuni de cod, ca nu scrie extraordinar de repede. Si este impresionant cat de repede se prinde de cate o problema sau ce repede se gandeste la teste pentru challange phase.

Lectura placuta!

 Comentarii (0)

Categorii:

Interviu Cristian George Strat (Evenimentul Zilei)

Cosmin
Cosmin Negruseri
27 noiembrie 2008

Continui cu interviul pe care l-a dat Cristian George Strat pentru Evenimentul Zilei cu ocazia aniversarii a 10 ani de la creerea companiei Google. Un post anterior contine interviul cu Mihai Stroe (unul dintre cei doi olimpici romani care au obtinut puctaj maxim la olimpiada internationala de informatica). Puteti gasi articolul publicat in ziar aici

1. Scurta prezentare.

Cristian George Strat, din Bârlad, este proaspat absolvent al Facultatii de matematica si Informatica, Universitatea Bucuresti. Cristian face in prezent al doilea stagiu la Google; primul a fost la sediul principal din Mountain View, California iar cel de acum in Zürich, Elvetia.

Cristian este Presedintele Asociatiei infoarena (http://infoarena.ro/) si co-fondator, impreuna cu fratele sau, la o companie romaneasca de consultanta software si networking.

2. In Romania, un job la Google este insotit aproape intotdeauna de un soi de admiratie ce nu are nevoie de argumente. Cat de greu este de fapt sa ajungi acolo?

La Google se trimit peste un milion de CV-uri anual. Poate parea ca sunt foarte exigenti insa cred ca cerintele lor sunt rezonabile pentru cineva cu adevarat pasionat de programare. Spre exemplu, cei care participa la olimpiade sau la alte concursuri de informatica nu au dificultati majore la interviurile de angajare. Insa nu e obligatoriu sa participi la concursuri; aceleasi cunostinte pot fi dobandite de un student constiincios si pe parcursul unei facultati de profil, dublata cu mult studiu individual.

3. Ce te motiveaza sa faci ceea ce faci?

In general consider ca e foarte distractiv sa programezi! :) In plus, la Google ai ocazia sa iti aduci contributia la proiecte care ajuta milioane de oameni din intreaga lume. Spre exemplu, poti imbunatati un produs astfel incat utilizatorul sa realizeze ce si-a propus cu cateva secunde mai repede; daca inmultesti cateva secunde cu numarul potential de utilizatori realizezi ca ai scutit omenirea de ani intregi de momente frustrante.
De asemenea ma motiveaza enorm echipa in care lucrez. Imagineaza-ti ca toti din jurul tau sunt activi, dedicati si entuziasti. E molipsitor; crezi ca poti sa fii altfel?

4. Este Google tinta ultima a oricarui programator? Se poate mai bine de atat?

Google e printre cele mai ravnite companii din lume, o dovada fiind si faptul ca s-a clasat pe primul loc in studiul Fortune "Cele mai bune 100 companii pentru care sa lucrezi". In ceea ce ma priveste, mi-e greu sa-mi imaginez o companie care sa-mi ofere oportunitati mai mari, un mediu de lucru mai antrenant si colegi mai valorosi decat imi ofera Google. Cu toate acestea insa nu cred ca toti programatorii tintesc sa ajunga aici. Am multi prieteni care lucreaza in Romania si sunt foarte multumiti si entuziasmati de ceea ce fac.

5. Stim chiar de la Google ca mediul de lucru este unul foarte relaxat. Nu cumva flexibilitatea asta inseamna o responsabilizare a angajatului?

La Google ai program flexibil, la nevoie poti sa lucrezi de acasa, poti sa iei pauze oricand, sa-ti aduci catelul la munca, sau sa-ti inviti prietenii in vizita. In pauze avem la dispozitie mese de biliard, tenis, fussball, jocuri video, putem servi o gustare intr-una din multele bucatarii amplasate in campus sau putem citi o carte in biblioteca.
Desi avem si libertate si tentatii sa irosim vremea, nimeni nu o face. Suntem tratati cu respect, incredere si ca atare ne responsabilizam singuri, nu avem nevoie de presiune "de sus".

6. Ce (mai) inseamna Romania pentru Cristian George Strat? Iti doresti sa te intorci?

Pentru mine, Romania inseamna o familie iubitoare, prieteni dragi, si amintiri.
Altfel, cred ca Romania ofera multe oportunitati antreprenorilor, in particular celor din industria software si online. Cred ca acum e momentul in care investitii si initiative inspirate pot avea un impact major si pot atrage castiguri pe masura.

Din alte puncte de vedere insa, cred ca noi romanii suntem groaznici. E trist sa traiesti intr-un oras murdar si poluat, sa-ti irosesti zilnic ore in trafic si la cozi sau sa te fereasca Sfantul sa ajungi prin spitale. Nu pot sa fiu "optimist", sa spun cu incredere ca o sa fie bine. Lucrurile evolueaza dezamagitor de incet si nu neaparat inspre mai bine. Insa divaghez...

Imi doresc si ma voi intoarce in tara, macar pentru cativa ani.

7. Daca maine s-ar infiinta un birou Google in Romania, ai veni sa lucrezi aici?

E o intrebare buna. Da, as veni o vreme. De asemenea, cred ca sunt foarte multi programatori talentati in Romania care doresc sa lucreze la Google insa nu sunt dispusi sau nu pot sa se mute in alta tara. Un birou Google in Romania ar fi minunat!

8. Ce sfaturi i-ai da unui tanar roman care vrea sa lucreze la Google?

N-as putea sa dau sfaturi insa pot sa povestesc din experienta mea. Din cate am observat, Google pune accent pe cunostinte fundamentale precum algoritmi, structuri de date, arhitectura sistemelor, statistica, etc. si mai putin pe anumite tehnologii. Limbajele de programare, librariile, sistemele de operare samd. se schimba de la an la an, devin depasite, irelevante.
Trebuie sa studiezi informatica pe cont propriu. Nu e de ajuns sa asimilezi ce te invata la scoala sau in facultate. Avem in Romania site-uri foarte bune de pregatire la informatica - algoritmi si structuri de date - precum http://infoarena.ro/ si http://campion.edu.ro/. Acestea sunt adevarate comunitati de elevi, studenti si profesionisti pasionati de informatica, alaturi de care poti sa inveti mult mai repede.

In fine, as vrea sa mentionez ca procesul de angajare nu este perfect. Au fost refuzati si oameni foarte buni. Nu e o mare tragedie daca nu treci de interviuri; un om bune are multe optiuni.

9. Sunt convins ca foloseai motorul de cautare inainte sa intri in companie. Obiectiv vorbind, de ce e cel mai bun de pe piata?

Cred ca relevanta si calitatea rezultatelor sunt doua dintre cele mai importante aspecte ale unui motor de cautare. Google exceleaza la amandoua. In plus, este si rapid si simplu de folosit.

10. Cum crezi ca ar fi aratat lumea fara Google?

Google a contribuit foarte mult la dezvoltarea internetului. Spre exemplu, programele de advertising AdWords si AdSense au ajutat sute de mii de oameni si companii sa castige bani dezvoltand site-uri web de calitate. Aplicatiile Google - Gmail, Calendar, Docs, etc. - au redefinit limitele tehnologice si posibilitatile de interactiune ale acestui mediu. Valuri de inovatii au urmat in industrie. Va mai aduceti aminte casutele de email de 2MB, de 500 de ori mai mici decat ce oferea Gmail la lansare? Alte initiative Google cu impact potential major sunt de abia la inceput: Google Chrome promite sa imbunatateasca browser-ul web, aceasta componenta esentiala a experientei online; Google.org, angajamentul companiei de a investi 1% din profit si din timpul angajatilor catre actiuni filantropice si probleme globale.

Google a demonstrat ca este o companie cu practici etice si se bucura de increderea utilizatorilor sai. Nu stiu cum ar fi aratat lumea fara Google dar stiu ca lumea e "mai buna" datorita lor.

 Comentarii (6)

Categorii:

Outliers

Cosmin
Cosmin Negruseri
24 noiembrie 2008

Am auzit de Malcolm Gladwell uitandu-ma la TED talks si vazand talkul acestuia in care discuta cum a fost revolutionata industria alimentara folosind experimente si concepte din statistica. Mi-a placut mult talkul si am cautat mai multe despre el. Asa am gasit cartile Tipping Point si Blink, care sunt doua best selleruri scrise de Malcolm (va spuneam intr-un post anterior ca am citit Blink pe avion). Imi place stilul autorului. El descrie concepte stiintifice in termeni accesibili unor oameni de rand. In plus, isi sustine ipotezele prin exemple. E o modalitate foarte buna de a mentine interesul cititorului si de a comunica unele idei.

Altii urasc acest stil considerand cartile lui Malcolm ca fiind adresate unor oameni ce nu citesc carti in mod obisnuit si ca extrapoleaza prea mult avand cateva exemple particulare. Fiecare din noi avem un stil diferit de a acumula informatie. Putem ajunge instantaneu la posturi interesante pe bloguri, in ziare online sau agregatoare gen reddit sau digg. Devenim astfel din ce in ce mai obisnuiti cu satisfactie intelectuala imediata si ne este greu sa ne mentinem atentia pe o durata mai lunga, incat sa citim o carte intreaga. Ii respect abilitatea de a ma tine interesat pe tot parcursul cartii, chiar daca nu iau tot ce zice el de bun.

Recent a aparut Outliers, o noua carte sub semnatura lui Malcolm. Aceasta analizeaza destinele unor oameni ce reusesc in viata si incearca sa demonstreze ca o poveste de succes este o combinatie intre un efort sustinut si putin noroc, dar mai putin important este un talent inascut. O ipoteza a lui este ca iti trebuie cel putin 10000 de ore de lucru intr-un domeniu pentru a ajunge un expert. Gladwell exemplifica cum cei de origine asiatica sunt mai harnici decat restul americanilor pentru ca stramosii lor au lucrat pe campurile de orez. Astfel foarte multi dintre cercetatorii de top ai Statelor Unite sunt la ora actuala asiatici.

Unele idei ce apar in carte carte nu sunt noi. Le-am mai vazut in alte articole si chiar am scris un blog post Inteligenta, nativa sau educata in care discutam teme similare.

Cartea incepe sa aiba putin buzz si apar articole in presa despre ea. Puteti citi aici un extras mai lung din carte. Pe siteul autorului gasiti de asemenea mai multe fragmente interesante.

Outliers e foarte interesanta si v-o recomand cu caldura. De fapt va recomand tot ce a scris Malcolm. Puteti gasi pe youtube unele discursuri de ale lui iar pe net are mai multe texte interesante publicate.

 Comentarii (11)

Categorii:

Problema saptamanii - Cartofi

Cosmin
Cosmin Negruseri
21 noiembrie 2008

Sa se demonstreze ca, dandu-se doi cartofi, exista o curba inchisa in trei dimensiuni care se poate desena pe suprafetele ambilor cartofi.

Ca de obicei, puteti trimite solutii pe mail la adresa cosmin at gmail.com

Update Am gresit adresa la care trebuia sa trimiteti solutia e cosminn at gmail.com. Ma scuzati, daca ati trimis deja solutia mai trimiteti-o o data.

 Comentarii (0)

Categorii:

Problema saptamanii - Probabilitati (solutie)

Cosmin
Cosmin Negruseri
20 noiembrie 2008

Problema curenta a fost rezolvat de Ovidiu Gheorghioiu, Delia David, Andrei Olariu si de Radu Grigore.

Nu exista nici o modalitate prin care sa obtinem rezultate uniform aleatoare folosind un numar finit de aruncari pentru ca se poate intampla ca la orice aruncare a monedei sa obtinem cap la infinit si atunci nu avem cum sa obtinem rezultate diferite.

Solutiile lui Andrei:

1. Se arunca moneda de cate 2 ori. Daca pica pajura si apoi cap -> pajura, daca avem cap si apoi pajura -> cap, daca avem 2 rezultate egale, repetam ambele aruncari.

2. Generam doua numere din multimea {0, 1} folosind metoda de la pct 1. Obtinem 00 -> mar, 01 -> para, 10 -> portocala, 11 -> repetam cele 2 generari.

Prima problema are mai mult de 50 de ani fiind rezolvata de unul dintre pionierii informaticii, John Von Neumann

A doua e interesanta in contextul generatoarelor de numere aleatoare. De exemplu in C++ unii folosim, pentru a genera numere aleatoare de la 0 la n - 1, instructiunile rand() % n. Acum dupa ce ati vazut problema 2 este clar ca unele rezultate sunt mai probabile ca altele.

In java sau Python generatoarele aleatoare sunt mai bune.

Varianta implementata in java:

public int nextInt(int n) {
     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);

     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
     return val;
 }

puteti citi aici explicatia codului.

O varianta care foloseste ceva mai multe dintre rezultatele aruncarilor pentru prima problema ar fi sa consideram si rezultatele de genul cap, cap, pajura, pajura ca 0 si pajura, pajura, cap, cap ca 1 si asa mai departe.

Ovidiu sugera urmatoarea generalizare pentru problema 2: Care e numarul mediu maxim de numere aleatoare intre 0 si k - 1 pe care le putem obtine dintr-un stream de biti uniform aleatori.

 Comentarii (2)

Categorii: potw

Senatorii si Deputatii lucreaza part time

Cosmin
Cosmin Negruseri
18 noiembrie 2008

Vivi recidiveaza. Dupa ce a facut o gramada de siteuri, printre care doizece.ro cel mai mare site de jocuri din Romania sau initiativa cu harta publicitatii acum are un nou proiect personal interesant la care lucreaza. Acesta este harta politicii din Romania in care a agregat date legate de prezenta si legile votate de senatori si deputati. Concluzia in mare e ca prezenta la vot e penibila si ca senatorii si deputatii lucreaza part time!

Puteti vedea datele stranse de el aici si posturi care analizeaza putin datele aici , aici , aici si aici . Ideea proiectului e misto si e o modalitate obiectiva de a prezenta niste date, fara a cobori la nivelul scandalurilor de presa.

In contextul in care in postul anterior vorbeam despre DEX online ce a inceput ca un proiect personal, avem inca un exemplu cu ce poate face un programator. Noi putem sa colectam date, sa le analizam si sa le prezentam in o forma in care pot fi intelese foarte usor. Ar fi misto sa apara multe initiative de genul asta, pornite poate chiar de la membrii infoarena.

 Comentarii (4)

Categorii:

DEX online sub capotă

Cosmin
Cosmin Negruseri
15 noiembrie 2008

Discutam de mai multă vreme cu Cătălin Frâncu despre proiecte personale şi despre Dex Online . Cu Cătălin am mai discutat pe blogul infoarena aici şi aici . Acum, la mai bine de un an dupa acele discuţii el a scris un articol foarte interesant despre traiectoria acestui proiect. Articolul este destul de lung, dar cred că e foarte interesant şi puteţi învăţa mult din el. De obicei înveţi din experienta proprie şi durează o perioada până treci prin destule proiecte incât să ai o privire de ansamblu. Articolul ăsta poate să vă scurteze acea perioadă. Aşa că luaţi o cană de cafea sau ceai şi vă urez lectură plăcută!

Scopul articolului

Acest articol prezintă diverse aspecte din existenţa de şapte ani a proiectului DEX online. Totuşi, articolul nu este în primul rând despre DEX online. Îl scriu la sugestia lui Cosmin Negruşeri pentru comunitatea infoarena.ro. Intenţia articolului este să disece, pentru foştii şi actualii olimpici la informatică, un exemplu de proiect din lumea reală, pentru a sublinia diferenţele între 1000 de progrămele de câte 100 de linii şi un program de 100.000 de linii, între programarea de unul singur şi lucrul în echipă, într-un proiect cu multe alte faţete decât cea informatică.

Textul pune în lumină particularităţi de natură tehnică, socială, etică şi financiară ale proiectului DEX online. Dintre acestea, voi insista pe latura etică şi socială a proiectului, pentru că de acolo au venit mai multe provocări şi realizări decât din domeniile tehnic şi financiar. Documentul se lansează adesea în judecăţi de natură morală, cu riscul de a plictisi. Sunt de părere că administratorul unui proiect cu oarecare utilitate practică nu poate rămâne amoral, ci trebuie să ia nişte decizii.

Nu recomand nimănui să facă lucrurile exact aşa cum le-am făcut noi. DEX online ar putea fi mai prezentabil. Sau ar putea oferi un corector ortografic pentru Word. Sau ar putea costa 5€/lună pentru accesul nelimitat la definiţii. Sau şi-ar putea răsplăti colaboratorii cu 10 centi pentru fiecare definiţie trimisă. Sau ar putea include un dicţionar urban. Acestea toate sunt hotărâri pe care le ia coordonatorul unui proiect în funcţie de timpul disponibil şi de scopurile echipei sale.

Auto organizarea proiectului

DEX online nu are manageri, nu are avocaţi, nu are contabili, nu are şedinţe, nu are ore fixe. Într-un cuvânt, DEX online nu are o ierarhie. DEX online are un website şi o listă de discuţii pentru voluntari, plus alte câteva unelte secundare (un sistem de gestiune a bug-urilor, un sistem de gestiune a emailurilor de la utilizatori, o pagină wiki practic nefolosită). Oamenii sunt cei mai productivi atunci când le oferi o listă de lucruri pe care le pot face în folosul proiectului şi îi laşi să facă ce le place cel mai mult. Ca urmare, avem unele definiţii care stau necorectate de luni de zile, deşi între timp am corectat mii de alte definiţii. Mie, ca programator, îmi revine sarcina de a crea o interfaţă în care voluntarii să poată lucra eficient. De aceea, îmi petrec mai mult timp lucrând la pagina moderatorului (invizibilă publicului larg) decât la paginile publice.

Este surprinzător ce oameni de calitate poţi aduna dacă menţii o listă de email activă timp de 7 ani. Ei rezolvă multe din problemele care pe mine mă depăşesc. De fapt, am încetat să mă mai consider „conducătorul” proiectului după primele 6 luni; prefer titlul istoric de „fondator” sau pe cel de „coordonator”. De exemplu, primim zilnic emailuri cu întrebări de natură lingvistică la care eu nu aş şti să răspund. Sau ne-am izbit de fineţuri legale. Sau a trebuit să creez o schemă MySQL pentru nişte date pe care nu le înţelegeam la nivel conceptual. Din fericire, pe lista noastră de discuţii există lingvişti, avocaţi şi programatori care ne-au scos întotdeauna din impas. Cu timpul, separarea funcţiilor s-a produs de la sine. De exemplu, sistemul de email are o coadă de mesaje destinate mie, cu cerinţe la care numai eu pot răspunde. La restul mesajelor aproape nu mă mai uit, pentru că alţi voluntari şi-au însuşit această parte a sistemului şi se ocupă impecabil de ea.

DEX online nu a avut niciodată ambiţii pe termen lung sau OKR-uri (obiective şi rezultate cheie). Sună un pic paradoxal, dar poţi avea nişte idei generale despre ce ar trebui făcut, fără să faci din asta o obligaţie. Poţi să te aştepţi să atingi obiectivul X la momenul T fără să promiţi că vei îndeplini obiectivul Y, care depinde de X, la momentul T + 1. De exemplu, am început prin a culege definiţii din DEX. Bazându-ne pe progresul zilnic, am estimat că va dura cam 5 ani să culegem tot DEX-ul (până la urmă a durat doar 3). Dar nu ne-am gândit la modul serios cu ce ne vom ocupa timpul după aceea sau ce vom face cu baza de date odată ce va fi completă. Nu mi-a plăcut niciodată acest gen de presiune, am preferat să nu le-o induc voluntarilor, şi nu se poate spune că am bătut pasul pe loc din cauza asta. Nici unui voluntar nu i s-a părut inacceptabil că am muncit trei ani pentru a culege un dicţionar, nici nu ne-am trezit în vreo dimineaţă sâcâiţi de gândul că trebuie să mai introducem 50 de definiţii şi poate n-avem chef.

Un aspect care poate dezamăgi, dar aşa s-a întâmplat, a fost începutul întâmplător al proiectului. Nu am stat zile în şir să mă gândesc „la ce-aş putea eu munci care să aibă un impact seminificativ pe internetul românesc?”. Abia după ce lucrasem la el vreun an am conştientizat că DEX online ar putea ajunge un site de referinţă. Ideea proiectului mi-a venit în 2001, când eram student în Boston şi foloseam zilnic dicţionare explicative englezeşti online pentru a-mi scrie temele. Pe de altă parte, duceam lipsa unui dicţionar explicativ românesc. Odată am avut o dispută cu un prieten asupra pluralului lui „cratiţă”: el susţinea că este „cratiţe”, iar eu „crătiţi”. Răspunsul, care i-a dat dreptate, a trebuit să aştepte câteva luni până am mers în vacanţă în România. De acolo am venit înapoi cu un DEX, dar m-am gândit că ar fi frumos să existe o variantă pe internet, de pe urma căreia să profite toată lumea, nu doar eu. Dar, având în vedere că după 6 luni de existenţă DEX online cuprindea vreo 50 de definiţii, din care vreo 45 introduse de mine, nu l-am luat foarte în serios. Ulterior, Federaţia Română de Scrabble (F.R.Sc.) a descoperit site-ul şi a început să contribuie masiv cu definiţii. Probabil acolo a fost punctul critic al proiectului şi, privind înapoi, mi se pare că s-a întâmplat un lucru nemaipomenit de improbabil ca 10 oameni să-şi pună încrederea într-un proiect cvasianonim, care ar fi putut merge prost din nenumărate motive. Concluzia acestui paragraf este că inspiraţia vine de unde nu te aştepţi.

Finanţe

DEX online nu vehiculează nici un fel de sume băneşti. Am evitat ca proiectul să aducă orice fel de venituri, din motive multiple.

  1. Banii aduc discordie. Singurul caz în care poate aş accepta să caut profit de pe urma siteului ar fi dacă toţi colaboratorii proiectului ne-am umple de bani, ceea ce o judecată la rece arată că nu e cazul. Veniturile ar fi imposibil de repartizat echitabil, deoarece natura muncii depusă de fiecare voluntar este diferită şi deci greu de cuantificat. Unii răspund la emailuri, alţii introduc sau corectează definiţii, alţii scriu cod, alţii lucrează la generarea flexiunilor.
  2. Veniturile vin din reclamă, iar reclama strică un site. Îl strică mai mult (dacă este o reclamă cu „daţi click pe maimuţă”) sau mai puţin (dacă este Google AdSense), dar îl strică, pentru că prin natura ei reclama are scopul de a distrage utilizatorul de la conţinutul paginii.
  3. O altă sursă de venituri ar fi limitarea accesului gratuit şi introducerea de costuri pentru accesul complet la baza de date, care nu intră în discuţie, deoarece nu se potriveşte filozofiei noastre.
  4. Veniturile trebuie contorizate, raportate la Fisc, impozitate, ceea ce duce la nevoia înregistrării unei firme, la angajarea unui contabil şi alte probleme cu care preferăm să nu ne dăm bătăi de cap.
  5. Odată ce un serviciu generează venituri, apare automat nevoia de mai multe venituri în flux continuu pentru a acoperi nişte cheltuieli periodice (tot ceea ce înseamnă cheltuielile unei firme). Ori, DEX online a ajuns acolo unde este tocmai pentru că nu l-am împins în nici un fel de la spate şi nu l-am tratat ca pe un serviciu, ceva de care trebuie să te ocupi în fiecare zi la oră fixă.

DEX online nu are nici cheltuieli seminificative. Am obţinut tot ce ne-a trebuit de la oameni şi firme care au apreciat calitatea proiectului: găzduirea, unele dintre dicţionare, fonduri pentru cumpărarea unui software de OCR. Cea mai mare donaţie însă este timpul liber al fiecăruia dintre participanţi.

Free as in freedom

În prezent, baza de date şi codul DEX online sunt disponibile sub licenţa GPL, dar am trecut prin diferite stadii până a ajunge aici.

Până în 2004, când DEX online conţinea cam 30.000 de definiţii, nici nu ne-am pus problema unei licenţe, mai ales că încă nu ştiam cu ce ochi priveşte Academia Română proiectul DEX online. Intenţia mea era în continuare să aştept până la reglementarea situaţiei cu Academia şi, eventual, DEX online să intre sub tutela acestui for.

Totuşi, în timp ce Academia nu manifesta nici un interes pentru DEX online, restul internetului românesc începuse să ne remarce. Apăruseră multe concepţii greşite şi critici la adresa DEX online, iar noi, ocupaţi cu introducerea datelor, neglijasem să ne expunem clar principiile într-un document. În paralel, interesul pentru baza de date era în creştere şi fusesem de mai multe ori vizitaţi de crawlere web a căror intenţie părea să fie să transfere toate definiţiile (comportamentul era evident diferit de al unui motor de căutare general). De asemenea, se punea problema dacă definiţiile preluate din DEX reprezintă un furt intelectual sau nu.

În acest context, am petrecut câteva zile schimbând emailuri cu ceilalţi membri ai proiectului şi, în final, am pus licenţa GFDL (GNU Free Documentation Licence) pe baza de date. Ulterior, am înlocuit GFDL cu GPL (General Public License), care se aplică la fel de bine scopurilor noastre şi evită nişte neajunsuri ale GFDL (în privinţa traducerilor şi a incompatibilităţii cu unele distribuţii de Linux). Licenţierea bazei de date a rezolvat multe probleme de natură etică, dar şi tehnică:

  • Am demonstrat că scopul primar al DEX online este să-i ajute pe vorbitorii de limbă română, nu să obţină profit material.
  • Am preîntâmpinat crearea unei pieţe negre pentru baza de date. Este imposibil să împiedici copierea unei definiţii odată ce o afişezi pe ecran.
  • Am permis programatorilor să folosească baza noastră de date pentru diverse aplicaţii interesante, ei având garanţia că nu putem să ne răzgândim mâine şi să le spunem „accesul la baza de date nu mai este liber” (în acest sens, licenţa GPL protejează mai degrabă documentul decât pe autorul său).
  • Deşi relaţia noastră cu Academia Română are încă un semn de întrebare, cel puţin am eliminat orice alte părţi din această dispută.
  • Din punct de vedere etic, am oferit în mod liber rodul unui proiect care, la rândul lui, s-a folosit din plin de resurse libere şi gratuite (nu doar software, dar şi munca voluntarilor, găzduirea, lista modelelor de flexiune, dicţionarele de la firma Siveco sau -- de ce nu -- educaţia mea, pentru care n-am cheltuit niciodată vreun ban).

Proiecte externe bazate pe DEX online

Ca dovadă că decizia de a redistribui liber baza de date a fost bună, iată ce unelte externe folosesc baza de date a DEX online (numai cele despre care am aflat noi):

  • Clienţi pentru consultarea offline a bazei de definiţii (vezi secţiunea de unelte)
  • Dicţionar pentru telefoanele mobile: http://www.jarcraft.com/page.php?9
  • Corector ortografic pentru OpenOffice, Firefox şi Thunderbird: http://www.archeus.ro/lingvistica/CorectorOrtografic
  • Dicţionar de rime: http://stefann22.lx.ro/
  • Client de Google Talk: http://www.archeus.ro/lingvistica/CautareGTalk
  • Spânzurătoarea: http://www.roportal.ro/jocuri/joaca-online/54.htm

Momente semnificative

Nefiind împovărat de griji financiare sau de obiective pe termen lung, DEX online a avut o existenţă destul de liniştită. Din acest punct de vedere, mă bucur că DEX online a rămas în stadiul de proiect făcut în timpul liber. Au existat totuşi câteva momente când viitorul proiectului a fost foarte nesigur sau, dimpotrivă, când proiectul a avansat în salturi foarte mari.

În primul rând, după cum am arătat, începutul a fost greoi. Mulţi factori făceau proiectul să arate cam neviabil. Cuprindea cu totul cam 50 de definiţii. Nu era disponibil tot timpul, deoarece era găzduit pe calculatorul meu din cămin, pe care îl mai şi rebootam uneori în Windows ca să mă joc câte ceva. Iar aspectul grafic era de-a dreptul îngrozitor: în primii 2 ani, DEX oline nu a folosit nici un fel de CSS, pentru că nu ştiam ce este acela. Mai exact, când am început proiectul DEX online, ştiam doar în mare ce este aceea o „pagină dinamică”: un program care e de presupus să producă ieşire HTML, care este servită clientului. Restul (HTML, formulare HTML, MySQL, Perl / PHP) le-am învăţat din mers. DEX online avea un fundal violet, fonturi negre şi tabele cu chenare groase. În diverse browsere, diverse caractere Unicode apăreau mai mari, mai mici, mai groase decât caracterele ASCII sau erau înlocuite de pătrăţele. Probabil că dacă aş vedea astăzi o iniţiativă asemănătoare, aş cataloga-o drept neserioasă. Este admirabil că primii noştri voluntari au reuşit să vadă dincolo de prezentare şi să se axeze pe conţinut.

De un alt impas ne-am izbit în 2004, când am reuşit să luăm legătura cu editura care a publicat DEX ediţiile 1996 şi 1998 (motivul pentru care nu le-am scris mai devreme a fost că aveau un website făcut complet în Flash, neindexat, la vremea aceea, de nici un motor de căutare; nu aveau nici legături către site, deci nu i-am putut găsi). Prima reacţie a editurii când le-am prezentat proiectul a fost „trebuie să închideţi siteul acum, altfel veţi suporta consecinţele legale”. Ca urmare, prima măsură pe care am luat-o a fost să aplicăm licenţa GFDL pe date, pentru ca în cazul în care ar fi trebuit să închidem siteul, datele să aibă o şansă să se răspândească. Ulterior, am ajuns la concluzia că ediţiile 1996 şi 1998 ale DEX sunt 99% identice cu ediţiile 1984 şi chiar 1975, care, fiind publicate în perioada comunistă, nu conţineau nici un fel de informaţii de copyright. Editura nu şi-a dat nici până astăzi acordul expres pentru DEX online, dar nici nu ne-a mai pus beţe în roate şi îi suntem recunoscători pentru aceasta.

În septembrie 2004, DEX online a sărit brusc de la 65.000 de definţii la vreo 240,000. Firma Siveco, care deţine drepturile de copiere asupra mai multor dicţionare (de sinonime, de antonime etc.) ne-a acordat permisiunea de a le republica sub licenţa GFDL. Câştigul a fost substanţial, dar ne-a dat şi foarte mult de lucru în lunile următoare. Am muncit mult la scripturile care au importat aceste definiţii, dar chiar şi aşa datele au fost importate cu destule erori, care au trebuit depistate şi corectate manual. Paradoxal, mulţi dintre oamenii cu pregătire lingvistică din jurul DEX online consideră aceste dicţionare ca fiind slabe calitativ (nu neapărat prin definiţii incorecte, cât prin definiţii inconsistente, neînchiderea tranzitivă a setului de sinonime şi alte motive). Totuşi, la acel moment erau cele mai bune date pe care le aveam la dispoziţie. E drept că pentru 1% din căutări rezultatele sunt nemulţumitoare, dar eu consider că acesta este un procentaj foarte bun.

Un eveniment interesant s-a petrecut în noiembrie 2006, când a apărut primul dicţionar urban pentru limba română (http://123urban.ro). Băieţii de la 123urban au o misiune foarte coerent definită: de a continua consemnarea limbii române de acolo de unde a lăsat-o Academia. Efortul lor este unul necesar: cel de a documenta termenii din nişa argotică. Apariţia lor ne-a făcut şi pe noi să ne întrebăm care ne sunt, de fapt scopurile şi cât de departe suntem dispuşi să mergem pentru a ne îmbogăţi baza de cuvinte definite. O variantă de colaborare, din punctul nostru de vedere, ar fi fost să includem baza lor de date ca pe o „sursă” separată (cot la cot cu DEX, DOOM şi celelalte). Până la urmă, colaborarea nu s-a materializat şi nu am mai urmărit-o de atunci. Noi nu am fost siguri că moderarea lor şi sistemul lor de votare funcţionează bine. Dacă o persoană propune o sintagmă, dar nimeni nu o coroborează printr-un vot pozitiv, DEX online trebuie să accepte acea sintagmă sau nu? În plus, baza de date a 123urban nu este disponibilă sub o licenţă compatibilă cu GPL, ceea îngreunează colaborarea din punct de vedere tehnic şi principial.

Evoluţia generatorului de flexiuni

În prezent, DEX online oferă flexiunile majorităţii cuvintelor limbii române. Dar procesul prin care am ajuns la acest stadiu este un exemplu tipic de colaborare într-un proiect deschis. Încep cu un mini-glosar pentru lămurirea termenilor tehnici:

  • lexem: unitate lexicală; suport minim al semnificaţiei; pentru toate scopurile practice, este cam totuna cu „cuvânt”.
  • formă flexionară: formă modificată a unui cuvânt pentru a exprima un raport gramatical (număr, gen, timp etc.). De exemplu, copilul este o formă flexionară a lexemului copil.
  • paradigmă: totalitatea formelor flexionare ale unui cuvânt.
  • model de flexiune: paradigmă comună tuturor lexemelor care se flexionează la fel (de exemplu, a lucra, a forma şi a cresta au toate acelaşi model de flexiune). Este practic o clasă de echivalenţă.

În 2006 am început să ne gândim serios să adăugăm flexiuni la cuvintele din DEX online. Cel mai complex aspect este reprezentarea diferitelor transformări pe care le suferă un cuvânt. Flexionarea în limba română se face, în general, prin adăugarea unor sufixe, dar aceste sufixe pot fi foarte variate. Ca exemplu, pluralul substantivelor feminine poate fi format cu -e (case), cu -i (inimi), cu -uri (ierburi), cu -ele (acadele), cu -ale (macarale) etc. În plus, Limba română abundă în fenomene morfologice care transformă un sunet într-altul la aplicarea unei flexiuni. Exemple de transformări comune sunt t → ţ (bărbat → bărbaţi) sau o → oa (uşor → uşoară). Unele flexiuni suferă mai multe transformări (sămânţă → seminţe). În plus, dorim să stocăm şi informaţii despre accentul fiecărui lexem şi cum se mută el în timpul flexionării (a împrumutá → eu împrumút), ceea ce duce la o varietate exponenţială de modele de flexiune.

Prima versiune a generatorului de flexiuni, pe care am implementat-o fără să mă consult cu nimeni (şi rău am făcut), indica în forma de bază a cuvântului fenomenele morfologice care apar la flexionare. De exemplu, pentru bărbat stocam forma de bază bărbaT, unde T indică transformarea t →ţ. Pentru băiat stocam forma de bază băiAT pentru a indica transformările a → e şi t → ţ (băieţi). Această informaţie referitoare la fiecare cuvânt trebuia cuplată cu nişte meta-cunoştinţe referitoare la partea de vorbire. De exemplu, transformarea t → ţ nu se aplică decât la pluralul substantivelor (forma de singular articulat este tot bărbatul, nu bărbaţul).

Implementarea acestui sistem a fost relativ uşoară, dar concepţia a fost greşită. Cineva ar fi trebuit să treacă prin toate cuvintele limbii române şi să indice aceste fenomene morfologice. Volumul de muncă ar fi fost mic comparabil cu tastarea unui dicţionar întreg, dar ar fi fost oricum considerabil. Argumentul care a demolat complet această implementare a fost că ea nu putea reprezenta toate modelele de flexiune. În primul rând, numărul de fenomene morfologice depăşeşte cu mult numărul de litere şi simboluri Unicode convenabile pentru notaţie, iar în al doilea rând, flexionarea bazată pe sufixe este inerent ambiguă. De exemplu, roditor şi chior au acelaşi sufix -or, dar se flexionează diferit ( roditoare, respectiv chioară).

De-abia în acest moment am început să caut alte soluţii. Astfel am aflat că lista de forme flexionare exista deja de zeci de ani. Alf Lombard (1902-1996), un lingvist suedez, a prins drag de limba română şi i-a studiat gramatica în amănunt. După care a creat nişte aşa-numite „modele de flexiune”. Adică a împărţit cuvintele limbii române în clase de echivalenţă cu flexionare identică, atâtea câte a putut identifica. Pentru fiecare clasă, a ales un cuvânt-exponent căruia i-a înşirat explicit paradigma. Prin studierea transformărilor exponentului, se poate deduce paradigma altui cuvânt cu acelaşi model de flexiune. De exemplu, ceapă şi damigeană au acelaşi model de flexionare. Ceapă este exponent şi pluralul lui, definit explicit, este cepe. Observăm transformările ea → e şi ă → e. Prin analogie, pluralul lui damigeană este damigene. În final, s-a dovedit că limba română are cam 800 de modele de flexiune (circa 280 pentru verbe, 320 pentru substantive, 120 pentru adjective şi altele). Aceste modele au fost publicate în Dictionnaire morphologique de la langue roumaine, apărut în 1981.

De aici datele au fost preluate de F.R.Sc. Ei aveau nevoie de lista flexiunilor pentru a stabili dacă un cuvânt depus în timpul jocului de scrabble este corect. Au adus deci lista de modele de flexiune la zi, conform cu ultimele norme ortografice, şi au etichetat toate cuvintele nou intrate în limbă cu modelul corespunzător. Această listă exista în format digital, dar era menţinută manual, într-un fişier Word. Pentru concursurile de scrabble, arbitrul dispunea de două cărţulii tipărite: una cu cuvintele acceptate, etichetate cu modelul de flexiune, şi una cu modelele de flexiune desfăşurate explicit.

DEX online a preluat listele de la F.R.Sc., beneficiind aşadar, complet gratuit, de rodul unei munci de zeci de ani. Ulterior, am continuat să etichetăm multe alte lexeme pe care F.R.Sc nu le tratase, deoarece din cele 130,000 de lexeme din DEX online, numai jumătate provin din DEX, restul provenind din alte dicţionare de specific (în special de neologisme şi de arhaisme).

În prezent, lista de flexiuni are foarte multe aplicaţii utile:

  • Pe baza ei am generat un corector ortografic.
  • Ea permite căutarea „full-text”, care altfel nu ar putea funcţiona prea bine. În absenţa listei de flexiuni, am putea căuta „carte” prin tot textul definiţiilor, dar căutarea nu ar înapoia definiţiile care conţin textul „cărţi” sau „cărţilor”.
  • Ea ne permite să răspundem la un click pe orice cuvânt dintr-o definiţie, trimiţând la definiţia acelui cuvânt. Din nou, fără această listă nu am şti ce să facem când utilizatorul ar da click pe cuvântul „cărţi”, pentru că nu am şti care este forma de bază a cuvântului.

Pentru a ne revanşa faţă de F.R.Sc., am decis să creăm un subsistem al DEX online (numit intern Flex online) în care F.R.Sc. să poată gestiona, mai bine decât într-un fişier Word, lista de cuvinte acceptate. De exemplu, dacă se dovedeşte că două lexeme nu se flexionează chiar identic, sistemul permite spargerea unui model de flexiune în două, modificarea clonei şi reasignarea lexemelor într-unul din cele două modele. Când F.R.Sc. emite o versiune nouă a listei de cuvinte (la fiecare câţiva ani), sistemul Flex online le permite să compare cele două versiuni, ceea ce ajută la eliminarea erorilor.

Ce am învăţat din asta

Când cineva vă oferă ajutorul, faceţi-vă luntre şi puntre ca să-i creaţi condiţii de muncă. Colaboratorii nu cresc pe toate drumurile şi trebuie preţuiţi. Dacă cineva vrea să scrie cod pentru proiect, daţi-i acces la repository şi asiguraţi-vă că vă poate trimite patch-uri. Dacă vrea să raporteze bug-uri, asiguraţi-vă că aveţi un sistem gen Bugzilla. Dacă se oferă să vă creeze un skin sau o interfaţă grafică mai bună, asiguraţi-vă că există o separare bună între extragerea datelor şi prezentarea lor (respectiv, folosiţi un template engine). Dacă vă pune la dispoziţie date, luaţi-le. O bună parte din programarea pentru DEX online am petrecut-o scriind scripturi care să importe diverse documente. A fost plicticos, dar a meritat.

Briciul lui Occam este o regulă foarte bună pentru a delimita munca manuală de scripting. Dacă durează X ore să prelucraţi manual nişte date şi Y ore să scrieţi un script care să le proceseze automat, scriptul merită scris doar dacă X > Y. De nenumărate ori am depistat nişte erori sistematice în definiţiile din DEX, dar le-am corectat manual, una câte una.

Programarea este frumoasă, dar reimplementarea a ceva ce există şi funcţionează, doar pentru că nu v-aţi informat şi nu aţi întrebat pe nimeni, este o risipă de talent.

20% din oameni fac 80% din muncă. Fiecare ţine cont cum vrea de acest fapt. La DEX online am încercat să le creez condiţii şi celorlalţi 80% dintre voluntari, dar recunosc că nu am reuşit întotdeauna. De exemplu, mulţi dintre voluntari, deşi au dorit să ne ajute, nu au învăţat niciodată cum să formateze corect definiţiile (avem un mini-set de notaţii pentru bold, italic, exponenţi ş.a.m.d.). Practic trebuia să trecem prin toată definiţia, să-i adăugăm diacritice şi să o formatăm, ceea ce dura cam la fel de mult ca şi rescrierea ei de la zero. De la un punct încolo am renunţat să îi mai trimit la documentaţie -- le respingeam pur şi simplu definiţiile trimise.

În marea lor majoritate, oamenii sunt buni şi vor să ajute; foarte puţini sunt cei care încearcă să facă rău sistemului. Problema este că oamenii răi sunt mai perseverenţi, iar efectele pot fi foarte grave („dacă amesteci o linguriţă de bălegar într-un butoi de vin, obţii un butoi de bălegar”). Trebuie deci să fiţi pregătiţi să vă petreceţi o bună parte din timp scriind cod care nu creează conţinut util, ci previne vandalismul. Este supărător, dar cu timpul vă veţi obişnui. De exemplu, nici un programator nu se supără că trebuie să implementeze autentificarea cu parole, deşi acel cod este destinat numai să-i blocheze pe cei 1% dintre utilizatori care s-ar gândi să se lege în contul altcuiva.

Oricât de intuitiv de folosit este proiectul vostru, marea majoritate a utilizatorilor nu vor şti să-l folosească sau îi vor folosi numai un subset mic de funcţii. De exemplu, puţină lume dă click pe legătura către conjugări / declinări care apare după rezultatele căutării în DEX online. Trebuie să fiţi pregătiţi să răspundeţi la multe, multe întrebări. Este bine să aveţi un sistem semiautomat de gestionare a emailurilor, unde să puteţi crea şabloane, pentru că multe din întrebări vor necesita răspunsuri identice. DEX online foloseşte OTRS, dar există multe alte soluţii.

Faceţi-vă cât mai dispensabili. Cu cât proiectul este mai descentralizat, cu atât va evolua mai uşor. Să nu ajungeţi niciodată la stadiul în care nu vă puteţi lua o vacanţă că se duce totul de râpă. În general, dacă alţi membri ai proiectului au mai multă energie ca voi, aveţi datoria morală să configuraţi sistemul astfel încât să nu-i ţineţi în loc. La DEX online, unica componentă de care mă ocup singur este scrierea codului. Corectarea definiţiilor şi a lexemelor şi răspunsul la emailuri merg foarte bine (sau chiar mai bine) în lipsa mea.

Un proiect util nu este neapărat dificil din punct de vedere tehnic. DEX online este exemplul perfect în acest sens. Sunt puţine locuri în cod unde am avut nevoie să implementez un algoritm „deştept”. Poate un exemplu ar fi diff-ul între două versiuni ale unei definiţii, pe care până la urmă nici nu îl folosim la nimic în practică. Un alt lucru la care ne-am gândit destul de mult înainte de a-l implementa este schema bazei de date care stochează modelele de flexiune. În rest însă, DEX online excelează prin răbdare, prin volumul de date adunate şi prin calitatea voluntarilor implicaţi, dar mai puţin prin algoritmii şi structurile de date folosite.

Concluzia este că sunt oameni care vorbesc şi sunt oameni care fac. DEX online nu a fost creat în cel mai eficient mod posibil (am tastat de mână o mulţime de definiţii); nu excelează la nivel tehnic (baza de date conţine, în esenţă, nişte cuvinte asociate cu nişte definiţii şi cu nişte forme flexionare); a fost adesea luat în râs şi criticat, mai ales în primii 3 ani de existenţă; are şi acum suficiente greşeli de tipar; şi, fiind vorba de un instrument lingvistic, nu va fi niciodată complet. Dar, în ritmul nostru şi cu neajunsurile noastre, o mână de oameni cu multă răbdare am reuşit să producem un document remarcabil.

 Comentarii (10)

Categorii:

Problema saptamanii - Probabilitati

Cosmin
Cosmin Negruseri
11 noiembrie 2008

De data asta va dau doua probleme interesante de probabilitati, sunt relativ clasice, deci nu va suparati daca le-ati mai vazut inainte. Va amintesc ca imi puteti trimite solutii la cosminn at gmail.com.

1. Se da o moneda ce nu e ideala, adica nu cade cap sau pajura cu probabilitatea 0.5 ci cu o probabilitate p respectiv 1-p. Nu stim cat e valoarea lui p. Exita o metoda de a genera valori 0 sau 1 cu probabilitati egale?

2. Presupunem ca am gasit o modalitate de a obtine valori 0 sau 1 cu probabilitati egale. Exista acum o modalitate de a alege cu aceiasi probabilitate unul dintre fructele mar, para sau portocala, folosind metoda de generare a numerelor 0 sau 1?

 Comentarii (0)

Categorii: potw

De ce Python?

Cosmin
Cosmin Negruseri
07 noiembrie 2008

Am tot auzit lucruri bune despre limbajul de programare Python si unde lucrez are o sustinere destul de mare. Am devenit din ce in ce mai curios si la inceputul verii am scris cateva programele ca sa imi incerc puterile.

Pentru ca inveti un limbaj nu prin a citi o gramada de carti ci prin lucra in el, am cautat o modalitate de a scrie cateva programe simple. Am intrat pe projecteuler.net . Acesta e un site cu in jur de 200 de probleme si fiecare problema are ca raspuns un numar. Poti incerca sa gasesti rezultatul folosind creionul si hartia sau sa codezi un program in orice limbaj. Dupa ce ai rezolvat o problema ai acces la threadul de pe forum unde discuta cei ce au rezolvat problema. Acolo sunt multi oameni care isi posteaza rezolvarile cat mai concise sau cat mai eficiente si astfel vezi mai multe solutii diferite de a ta si inveti smecherii de limbaj sau algoritmi mai buni.

Dupa cateva luni imi place limbajul foarte mult. Chestia cea mai misto e ca am ajuns sa ma simt productiv foarte repede in el. E un limbaj interpretat asa ca nu trebuie sa astepti dupa compilare. Pe langa asta are o consola in care poti sa incerci sa vezi ce fac diverse bucati de cod. Lucru foarte util cand nu stii limbajul. De asemenea este destul de intuitiv. S-a intamplat de mai multe ori sa nu fiu sigur de cum se fac unele lucruri, sa le incerc si sa mearga.

Alt avantaj este acela ca limbajul e dynamically si strongly typed. Asta inseamna ca nu o sa iti mai bati capul ca in C++ cu erori interminabile de compilare si mai inseamna ca limbajul suporta programarea cu generice. Astfel putem avea programe de genul:

>>> def suma(a, b):
...   return a + b
>>> suma(1, 2)
3
>>> suma('mere', 'pere')
'merepere'

Imi place ca indentarea codului face parte din limbaj, aceasta restrictie ajuta mult la lizibilitatea programelor pentru ca impune un stil de codat similar pentru toata lumea. Iar lizibilitatea unui cod este foarte importanta, pentru ca petrecem mult mai mult timp citind cod decat scriind cod nou.

De asemenea limbajul incearca sa ajute programatorul cat mai mult, izoland detalii care nu sunt importante. De exemplu la operatiile pe intregi avem implementate numere mari si nu mai trebuie sa avem grija sa nu facem overflow.

Este un limbaj succint. Spre deosebire de java, pentru a face ceva nu trebuie sa scrii foarte mult.

Are foarte multe librarii, unele dintre ele intrate deja in limbajul de baza. Ca exemple as aminti NumPy,o librarie de calcule numerice, care contine printre altele metode din algebra liniara sau generatoare de numere aleatoare, sqlite care se ocupa cu operatii pe o baza de date si PIL o librarie de prelucrare a imaginilor.

In Python se poate folosi si paradigma programarii functionale. El are elemente ca map(), reduce(), filter(), si operatorul lambda.
Metoda map(functie, secventa) ne intoarce o lista care sunt rezultatele aplicarii functiei peste elementele unei secvente. Operatorul reduce(functie, lista) ne intoarce rezultatul aplicarii cumulate a functiei peste elementele secventei. Putem scrie cod de genul:

>>> # un sir de intregi din unul de stringuri
>>> map(int, ["1", "2", "3"])
[1, 2, 3]
>>>  # suma elementelor din un sir
>>> reduce(lambda x,y: x + y, [1, 2, 3])
6
>>>  # filtram elementele impare
>>> filter(lambda x: x % 2 == 0, [1, 2, 3])
[2]

Faptul ca limbajul nu este unul pur functional, face invatarea ideilor din programarea functionala mai usoara.

Mai imi plac si list comprehensions care sunt doar zahar sintactic, dar le folosesc destul de des. Ele sunt o modalitate naturala si succinta de a crea liste. Va dau mai jos cateva exemple:
>>>  # patratele numerelor de la 1 la 4
>>> [x**2 for x in range(1, 5)]
[1, 4, 9, 16]
>>> # pentru doi vectori a si b
>>> a, b = [1, 2, 3, 4], [1,4,8,16]
>>> # toate sumele intre un element din a si unul din b
>>> [x + y for x in a for y in b]
[2, 5, 9, 17, 3, 6, 10, 18, 4, 7, 11, 19, 5, 8, 12, 20]

Si imi mai plac tuplurile pentru ca de multe ori ai nevoie de cate un tip de date rapid. De exemplu un punct 3 dimensional il putem obtine ca punct = (-1, 0, 11).

Ca minusuri, unul mare este eficienta. Astfel cand scriam solutii pentru probleme de la google code jam, unele erau de 50 pana la 100 de ori mai incete ca varianta implementata in java sau C++. Dar cred ca productivitatea programatorului este mult mai importanta ca eficienta codului, iar Python lucreaza bine cu limbajul C si bucatile ineficiente pot fi reimplementate in C.

Sper ca, daca nu ati lucrat deja in Python, v-am trezit putin apetitul. Daca aveti deja experienta cu Python ce caracteristici v-au placut? Cei care nu sunt convinsi inca pot citi aici cum se poate face un spell corrector in 21 de linii de Python.

 Comentarii (48)

Categorii:
Vezi pagina: 12345... 192021222324 2526272829... 3738394041 (407 rezultate)