Unicode

Posted in Stand-up philosophy on September 19th, 2012 by Mihnea

De ce pula mea ai vrea sa poti scrie nume de fisiere in telugu? Ok, stramosii tai n-au fost in stare sa realizeze ca 20 si ceva de semne sint suficiente pentru a reprezenta pe foaie sunetele care le ies pe gura, dar s-au prins altii intre timp. Cum cacat sa insisti sa scrii cu viermisori si iatagane dupa ce ai vazut alfabetul latin? Si, mai rau, cum sa-ti vina ideea sa aduci haosul asta in software, in loc sa le faci un bine inapoiatilor si sa le spui ca daca vor tehnica de virf pentru vazut porn, trebuie sa se invete si cu tehnica de virf pentru scris si citit? الجهاد!

Faptul ca lumea civilizata i-a bagat in seama p-astia a fost prima greseala. A doua greseala a fost formarea unui Comitet responsabil cu recensamintul alfabetului si incartiruirea mazgaliturilor intr-un Standard International. Acest Comitet ar fi putut sa adune literele latine, chirilice, kana si eventual grecesti (cu perversiunile lor gen ăâöé etc.), sa le puna intr-o tabela si sa termine treaba (ignorind ostentativ ideogramele si jihadistii), dar nu asa functioneaza comitetele. Cind ti se confera puterea de a Gindi O Solutie, trebuie sa faci ceva complicat, ca sa le arati celorlalti ca esti destept. Orice prost poate sa puna citeva sute de caractere intr-o tabela, dar tu esti un erudit patrunzator si vezi imaginea de ansamblu, asa ca tabela ta va contine hieroglifele egiptene, caracterele ugaritice, cartile de joc, emoticoane, piesele de domino si mahjong etc. Si privind tu asa la cele un milion de semne adunate, simti ca tot nu-i destul si tot se vor gasi diversi sa conteste valoarea ta, valoarea ta, asa ca adaugi si scrijeliturile de pe discul din Phaistos (caracterele 0x101D0 – 0x101FF), care nu a fost descifrat inca. CINE-I CEL MAI ERUDIT ACUM?

Si nu te opresti aici. Nefiind prost si tinind cu tarie sa arati lumii asta, te apuci sa incurajezi creativitatea in exprimare prin intermediul semnelor diacritice. Desi ai bagat in tabela toate formele de A cu cerculet, accente, sedila, puncte si combinatii, faci caractere separate pentru toate aceste semne, ca sa poata omul sa scrie A cu trema fie ca Ä, fie ca A urmat de ¨.

Astfel s-a nascut Unicode, un standard menit sa ingreuneze pe cit posibil reprezentarea digitala a textului. Unicode se asigura ca orice operatiune de bun simt pe care ai vrea s-o faci pe un string devine imposibila. De exemplu, daca ai avut ghinionul sa inveti ca un string e o insiruire de caractere, imperialistul dornic de globalizare din tine va avea pretentia ca al 5-lea caracter dintr-un string sa fie la pozitia 5. In termeni stiintifici, vei dori ca accesul la caractere sa fie in timp O(1). Ei bine, Unicode se pisa pe pretentia ta din multiple directii.

In primul rind, cea mai folosita encodare pentru Unicode este UTF-8, care e un cod cu lungime variabila. Asta s-a intimplat din cauza ca, desi sint vreo 1.1 milioane de caractere in Unicode, oamenii normali folosesc cam 100 din ele, deci s-a simtit nevoia unei reprezentari compacte. Astfel, un caracter poate avea intre 1 si 4 bytes, deci textu’ e mic, dar ca sa ajungi la un caracter trebuie ori sa treci prin toate caracterele de dinainte, adica O(N), ori sa tii si sa actualizezi o tabela de index impreuna cu string-ul, care ar fi mai mare decit spatiul cistigat prin encodarea cu lungime variabila.

Minerii se vor grabi sa observe ca Microsoft au rezolvat demult problema asta prin intermediul string-urilor wide, unde un caracter e tinut pe 16 biti. Minerii sint prosti si nu realizeaza faptul ca 1.1 milioane de caractere nu incap in 16 biti. String-urile wide din Windows folosesc de fapt UTF-16, care este tot un cod cu lungime variabila si are aceleasi probleme ca UTF-8, plus ca ocupa de doua ori mai mult spatiu pentru textul de oameni normali, trebuie convertit la UTF-8 pentru a discuta cu restul lumii si e endian-dependent, asa ca inainte sa te exprimi pe limba lui trebuie sa semnalezi ce endianness preferi cu un cacat numit byte order mark.

Sigur, 1.1 milioane de caractere pot fi reprezentate pe 32 de biti. Se pare ca problemele noastre se rezolva daca folosim UTF-32 si acceptam ca 75% din text sa fie 0, ca memoria si discurile sint ieftine in zilele noastre. Ei bine, gratie diacriticelor separate (sau “combining marks” cum se numesc ele oficial) se rezolva o pula. Daca pentru codul tau “un caracter” inseamna “o litera” si nu “o litera sau un semn de cacat care face parte din litera anterioara”, tot trebuie sa parcurgi string-ul ca sa ajungi la o anumita pozitie si ca bonus trebuie sa si stii care sint semnele alea ca sa tii cont de ele cind numeri. Evident, celelalte reprezentari au si ele problema asta.

Sa facem un efort de imaginatie: un miner-arhitect este insarcinat sa toarne fundatia unui cod ce va folosi UTF-8. Sesizind problema indexarii, dinsul infaptuieste o functie numita CharacterAt() care parcurge string-ul in cautarea pozitiei date, tinind cont de lungime variabila, diactritice separate si alte mui. In urma sa trudeste minerul-programator ce este insarcinat sa caute slash-urile dintr-un string. Miinile lui negre iti vor intinde o floare asemanatoare cu codul ce urmeaza:

for(size_t i = 0; i < Length(str); ++i)
{
    if(CharacterAt(str, i) == '/')
    {
        // ceva
    }
}

Am incercat aici sa cuprind cit mai bine mentalitatea de miner, folosind size_t pentru variabila i, ca asa a auzit ca-i bine, dar chemind Length() la fiecare iteratie, deoarece minerii nu inteleg ce face de fapt functia aia. Oricum, chiar daca minerul muta apelul catre Length() in afara buclei, cautarea asta e tot O(N^2). Cam ca atoi-ul Minerului Suprem, mai tineti minte?

Apropo, Length() ala trebuie sa aplice aceleasi principii de convietuire globala ca CharacterAt() ca sa afle cite caractere sint de fapt in sir, nu merge sa cauti primul 0.

Exista diversi mintosi care sustin ca accesul aleatoriu la caractere este necesar foarte rar. De obicei cauti ceva printr-un string, deci oricum iei la rind toate caracterele, asa ca ai nevoie doar de niste facilitati de iteratie care sa stie de regulile pulii. Chiar daca le dam dreptate, ramine comparatia, un alt detaliu prin care Unicode da muie programatorilor din lumea intreaga.

Un om sanatos s-ar astepta sa poata compara doua string-uri byte cu byte: cind gasesti valori diferite la aceeasi pozitie, string-urile difera. Asta ar fi prea simplu, asa ca din nou diacriticele separate salveaza situatia. Ca sa compari doua string-uri trebuie intii sa le normalizezi, o operatiune cit se poate de simpla si naturala cu o descriere concisa, de doar 27 de pagini. Pentru a stimula si mai tare creativitatea, exista de fapt 4 moduri de normalizare, numite intuitiv D, C, KD si KC. Pe linga disclaimer-ul ala despre OOP ce insoteste codul Java din descriere, supun amuzamentului dumneavoastra si metoda recomandata de utilizare a implementarii din WINAPI: deoarece nu poti sti cit de mare o sa fie string-ul normalizat, chemi functia aia intr-o bucla pina cind o nimereste.

Dupa ce reusesti sa normalizezi string-ul ala trebuie sa incepi cu intrebarile filosofice: este sau nu string-ul ’10’ echivalent cu ‘Ⅹ’, ‘Δ’ sau ‘١٠’? Apropo, Ⅹ ala nu e X, este 0x2169, “Roman Numeral Ten” si in UTF-8 se scrie pe 3 bytes: 0xE2 0x85 0xA9. Ce ne faceam daca nu aveam in Unicode numerele romane de la 1 la 12? UNDE MAI ERA ERUDITIA NOASTRA?!

Deci muie Unicode, muie alfabet!

Tags: , , , , , , , , , , ,

Cadou

Posted in Regula 0 on September 21st, 2011 by Mihnea

Cu ocazia implinirii frumoasei virste de 31 de ani, noi cei din redactia Standup Programming ii uram lui Silviu Ardelean un calduros La Multi Ani! si ii oferim din putinul nostru un cadou ce speram sa exprime toata stima si consideratia pe care o purtam atit persoanei sale, cit si lucrarii pe care o infaptuieste printre noi.

Cum nu putem avea incredere in nici un serviciu de curierat sa trateze cu respectul cuvenit un asemenea artefact de pret, il rugam pe emblematicul miner sa vina personal sa-si ridice cadoul din Strada Vasile Lascar nr. 197, Sector 2, Bucuresti.

 

Tags: , , , , , , , , , , ,

Paricid

Posted in Premiul n00bel, Regula 0 on September 5th, 2011 by Mihnea

Cind s-a impleticit pentru prima oara pe usa staulului cu experti, minerul Silviu Ardelean avea casca in mina, lampasul stins si capul plecat. Inca nu se saturase sa-si tina atitudinea doar pentru el, nu se angajase la multinationala emblematica, nu fusese dat afara de la multinationala emblematica si nu-si pusese in semnatura dihotomii adinci. Multa vreme s-a multumit doar sa fie de acord cu post-urile altora si sa se gudure pe linga mai-marii locului. Flatati de faptul ca in sfirsit ii priveste si pe ei cineva de jos, mai-marii l-au luat sub obladuirea lor, l-au aparat de hateri, l-au ajutat cu “few cosmetics” – intr-un cuvint, l-au crescut. Si ce sa vezi: saminta de miner a prins puteri, si-a gasit o voce si acum se razvrateste impotriva expertilor folosind tocmai uneltele pe care ei l-au incurajat sa si le ascuta. Ce ironie!

Psychologists say ca era inevitabil ca relatia dintre militian si miner sa ajunga in acest punct: pina la urma minerul-fiu va dori s-o futa el pe programarea-mama si va incerca sa-l omoare pe militianului-tata pentru a inlatura concurenta. It’s science! A inceput subtil, cu cite o ridicare de glas pe alocuri, cite un comentariu aprobator-dar-nu-tocmai la un raspuns militienesc. Ortacul trebuia sa testeze intii terenul, nu putea sa dea buzna ca-n Piata Universitatii, caci se temea de pulanul pe care-l vazuse lovind nemilos in trecut.

Vazind ca pulanul sovaie, Silviu a trecut la atac, scolindu-l pe Ovidiu in problema STL-ulul:

– Clasele MFC sunt mai usor de folosit atunci cand se dezvolta variantele ANSI si UNICODE, zise Militianul.

– Te rog, detaliaza cu ce sunt mai usor de folosit, veni replica Minerului. Pana la urma, diferenta o faci din niste macro-uri pe care le poti aplica si sa faci distinctia std::string vs. std::wstring.

Militianul facu un pas in spate, dupa care continua:

– Alte functii STL “puternice” sunt rar folosite intr-o aplicatie MFC.

Minerul, simtind ca e sansa lui, se puse pe enumerat functiile pe care le foloseste zilnic cind optimizeaza cautarea i-urilor in std::map:

– Nu vad asta ca un argument si as venii cu cateva contra-exemple: for_each, find, count, search, copy, fill, merge si multe altele.

Pe la mijlocul discutiei pulanul devine semi-erect, asa ca Silviu se retrage temporar in diateza pasiv-agresiva:

Daca se doreste sa se poarte o discutie interesanta ar trebuii sa scoatem din ecuatie cuvintele subliniate si sa vorbim pro/contra celor doua librarii in contextul aplicatiilor Windows.

Obisnuit sa-i lase pe altii sa gindeasca in locul lui, a incercat chiar un link spectaculos de prost (chiar si pentru el), pe care Ovidiu l-a desfiintat prompt. Ca sa nu pice de prost, minerul a incercat sa rida si el de prostia link-ului pe care el l-a adus ca argument cu o gluma despre bac. Discutia a sucombat iar minerul a ramas cu pantalonii in vine si cu frica de castrare pulsindu-i dureros in virful tirnacopului.

O luna mai tirziu, Silviu a intrat iar peste Ovidiu in CDormitor cind stimabilul MFCist il lumina pe mesajflaviu in problema inchiderii si deschiderii ferestrelor. Ovidiu a incercat sa-i explice ca nu-i frumos sa se bage in treburile care se petrec in intimitate intre doi adulti. Minerul i-a tras-o insa previzibil, spunindu-i ca de fapt nu a vrut sa zica ce a crezut Ovidiu ca a zis. Militianul, ajuns la capatul rabdarilor, a decis ca-i timpul pentru o corectie:

Uite ce e, Silviu! Nu-mi place cand cineva “o intoarce ca la Ploiesti”.
Am mai mult respect pentru un “OK, sorry, am gresit (eu sau tastatura)” atunci cand cineva scoate un “porumbel”. I se poate intampla oricui, inclusiv mie.

Un singur lucru nu pricep: de ce s-a redenumit manevra clasica din “few cosmetics” in “intoarcere ca la Ploiesti”?

Cock-blocked pentru a doua oara, cind mama-programare era cracita si disponibila la doar citiva centimetri in fata lui? Nu inca, caci minerul mai are citeva trucuri in tolba sa, ca n-a dospit degeaba la loc caldut 4 ani sub protectia codexpertilor fruntasi. Stim cu totii ca in general se ajunge si-n cazul lui, dar de data asta se pare ca s-a ajuns deja:

PS. Ovidiu, e departe de mine gandul unui flame, dar cand spui “Nu, Silviu, nu neaparat” referitor la ce am citat ulterior cred ca te refereai la persoana mea iar mie astfel de lucruri imi sunt clare – deci nu am ce sa intorc. M-am jucat si eu cu CMultiDocTemplate.

Sa fie clar – lui ii este! Link-ul duce la celebrul “articol” despre serializarea in MDI in care minerul ne arata ca n-a inteles nimic din MDI, serializare, MFC etc. Deja m-am pierdut in straturile de ironie ale intregii situatii asa ca ma duc sa-mi iau niste popcorn si sa astept cu infrigurare episodul urmator al telenovelei.

 

Tags: , , , , , , , , , , , ,

Scoala ardeleana de aritmetica

Posted in 112, Premiul n00bel on April 12th, 2011 by Mihnea

Viata e grea in Valea Jiului. Intre o descindere in abataj si o incursiune horticola la Bucuresti nu-ti ramine mult timp pentru dezvoltare personala. Daca vrei sa-ti cultivi o pasiune, cum ar fi pescuitul, trebuie sa renunti la unele chestii mai putin importante, cum ar fi scoala primara. Tragedia devine evidenta abia cind destinul te forteaza sa dai pestele din mina pe programarea de pe gard si cei din jurul tau descopera ca ai lipsit cind s-a predat impartirea cu rest sau formarea pluralului.

In post-ul despre atoi-ul ortacului va ziceam, printre altele, despre pasiunea lui Silviu Ardelean pentru modulo. Un cititor vigilent a remarcat insa ca nu era prima data cind fostul viitor pescar rescria regulile aritmeticii. Intr-un thread de pe vremea cind Gardianul Ovidiu nu gasise inca un pretext pentru a denunta unilateral dialogul dintre mine si experti povesteam cum aplica Peter principiile programarii defensive:

int& operator[](unsigned int index)
{
    index = index % count();
    return m_elements[index];
}

Ce a inteles minerul din asta:

Totusi… ma intreb daca el a facut vreodata debug pe acest cod. Sincer, ma cam indoiesc, pentru ca atunci, ar fi constatat ca tot timpul elementul ar fi fost valoarea returnata de count() [datorita faptului ca index era mai mic decat aceasta valoare] si in mod normal, ultimul index al lui m_elements ar fi fost count() – 1. Pracic, se accesa un index inexistent ( valoarea returnata de count() ). Sau?

Deci in 2009, pe cind era expert de 8 ani in C++ ([1]), Silviu credea ca restul impartirii lui 4 la 9 este 9. In lumina acestor fapte, ne intrebam ce a vrut de fapt sa faca cu % 10 ala in implementarea lui de atoi(). Sau la implinirea a 10 ani de experienta a descoperit cum functioneaza de fapt modulo si s-a decis sa-l foloseasca si unde nu face nimic, sau a vrut ca atoi-ul lui sa creada ca toate cifrele sint 10. Sau?

Putin mai incolo in thread, insusi Gardianul Ovidiu incearca sa domoleasca zelul cu care minerul explica principiile de convietuire armonioasa cu sizeof (operatorul care returneaza lungimea array-urilor dinamice, daca tineti minte). Ovidiu intinde urmatoarea nada:

size_t v = 0;
while(v < sizeof(v++))
{
    printf("%u", v);
}

Silviu, cu pedala mintii la podea, raspunde:

Fara a rula, iti zic sigur ca va crapa la printf(), chiar daca pasezi “%d” sau “%d”. printf()-ul are limitele sale, ptr. tipuri simple (int, float, char, etc).
Pune std::cout in loc de printf() si nu mai crapa. Chiar afiseaza ok valorile lui v.

Mare atentie, Silviu, ca si pamintul are limitele sale, ca si printf(), si s-ar putea ca intr-o zi sa se surpe pur si simplu sub tine.

In incheierea paginii aflam ce l-a determinat pe Silviu sa schimbe undita cu calculatorul personal:

Daca as lucra intr-un domeniu embeded unde trebuie sa ma supun unor legi mai stricte, atunci las si de la mine. Din fericire doar mi-a mirosit cu ce se mananca si e putin porbabil sa activez vreo data intr-un astfel de domeniu. Acum 2 ani o firma vroia sa ma atraga pe o pozitie de team leader exact pe ceva “embeded” si le-am multumit frumos. Prefer creeativitatea si complexitatea specifica aplicatiilor ptr. PC.

Eu sper ca de fapt aia vroiau sa-l atraga pe Silviu intr-un beci la marginea orasului unde sa-i arate tot felul de pozitii si obiecte emdeduibile in cur. Altfel vreau sa-i cunosc, in primul rind ca sa nu-mi iau vreodata cuptor cu microunde programat de ei si in al doilea rind ca sa le ofer gratuit un abonament gold la RSS-ul site-ului nostru.

Silviu, mopul e la tine. Speram sa nu te dezminti nici de data asta si sa stergi macar “mica scapare” cu operatorul %. Adevaratul test de creativitate va fi insa la aia cu siguranta craparii, ca pe-acolo nu prea vad cum ai putea spala rusinea fara ajutorul mentorului tau (“few cosmetics”, sau?). Sper ca vei opta pentru o explicatie tehnica, cu cuvintele tale, a modului in care functioneaza functiile variadice si mintea minerului. Asta m-ar bucura cu adevarat.

Fig. 1: Silviu propune, codexpertii dau cu mopu'

 

PS: Avind in vedere ca am ris deja de multiple ori de faptul ca multinationala emblematica nu te-a mai dorit asa de tare cum o doreai tu pe ea, poti sa-ti actualizezi linkedin-ul ala, ca nu mai ai ce secret sa tii. In plus, ne-au zis noii tai colegi ca se intreaba daca ti-e rusine cu alegerea facuta, de nu vrei sa o impartasesti public, tu care in rest esti un om asa de deschis.

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

A patra corectura

Posted in Codare cu premeditare, Premiul n00bel, Regula 0, Stand-up philosophy on November 27th, 2010 by Mihnea

Truda afunda continua in galeria sapata de Silviu Ardelean. Cu ajutorul cititorilor nostri a reusit sa-si corecteze si “micile scapari” legate de character set, a aflat de FindFirstFile() si chiar a incercat sa trateze path-urile care contin wildcard-uri, lucru care nu prea i-a iesit. In momentul de fata, codul pentru cazul in care nu vrei sa folosesti WinAPI este:

long long GetFileSizeFast(const TCHAR *szFilePath)
{
    if (!szFilePath || !szFilePath[0] ||
        !PathFileExists(szFilePath))
        return -1;

    long long nSize = -1;
    struct __stat64 buf;
    nSize  = (_tstat64( szFilePath, &buf ) == 0) ?
        buf.st_size : -1;
    if (S_ISDIR(buf.st_mode)) nSize = -1;

    return nSize;
}

Sigur, ne-am putea intreba de unde frica asta de WinAPI, avind in vedere ca _tstat64() e o functie care exista doar pe Windows, deci oricum poti sa te bazezi ca ai WinAPI la dispozitie. De asemenea, ne-am putea intreba cum eviti folosirea lui WinAPI, cit timp chemi PathFileExists(), o functie WinAPI. Cei mai circotasi ar putea comenta chiar despre inutilitatea apelului la PathFileExists(), avind in vedere ca functia _tstat64() trateaza singura caile cu wildcard-uri prin ele. Eu va spun doar atit: “mici scapari”.

In cazul in care nu tinem sa scriem cod portabil cu functii care exista doar pe Windows, miinile negre ne intind si o varianta cu WinAPI:

long long GetFileSizeFastest(const TCHAR* szFilePath)
{
    if (!szFilePath || !szFilePath[0] ||
        !PathFileExists(szFilePath))
        return -1;

    WIN32_FIND_DATA sFileData;
    HANDLE hFind = FindFirstFile(szFilePath, &sFileData);
    if (hFind == INVALID_HANDLE_VALUE)
        return -1;

    FindClose(hFind);

    return  (sFileData.nFileSizeHigh * (MAXDWORD+1LL)) +
        sFileData.nFileSizeLow;
}

Din nou clevetitorii ar putea sa se intrebe cum e functia asta “Fastest”, daca ea interogheaza filesystemu’ de 2 ori despre fisier. In cei 9 ani care l-au facut expert in C++, Silviu n-a invatat inca sa compare string-uri; vorba aia, abia a aflat despre fisiere, sa avem un pic de rabdare cu el. Inca o data: “mici scapari”.

Intr-unul din comentariile pe care probabil le va sterge in curind, minerul a marturisit ca lucreaza la o aplicatie care valideaza numele de fisiere folosind expresii regulate. Stie ca se poate si fara, dar nu e “profesional”. Chestia asta suna intr-un asemenea hal, incit ma tem ca ar putea sa fie o tentativa de sarcasm din partea lui, poate chiar prima in cei 30 de ani de cind e expert in Atitudine. Daca e pe bune, e doar o noua “mica scapare”, nimic grav.

Problema e ca se cam aduna “micile scapari” si ca numarul lor creste dupa fiecare corectura, in loc sa scada. Cam de cite “mici scapari” o fi avind nevoie pentru a realiza ca de fapt are de-a face cu o “mare scapare” in ceea ce priveste programarea?

Retorica aceasta este flasca, evident. Puroiul are o intreaga pleiada de justificari pentru faptul ca de 9 ani si 4 zile nu reuseste sa scrie o functie care sa afle dimensiunea unui fisier. In primul rind, in mintea lui (pardon, a unui “prieten”) e acceptabil sa publici cod care nu se compileaza, pentru ca ala care-l ia trebuie sa mai munceasca si el, futu-l in gura de oportunist. Cu alte cuvinte, cind unu’ e asa de incepator incit cauta pe net cum se afla dimensiunea unui fisier, in mod cert este calificat sa recunoasca cazurile limita care pot aparea si sa le trateze singur (sau sa stie cum sta treaba cu WIN32). Silviu i-a aratat ce era mai important, si anume numele unei functii. Mai departe se descurca incepatorul ala, desi Silviu nu s-a descurcat, cu toti cei 9 ani de dat la tirnacop cu care se lauda. Cred ca asta insemna “and staff” ala de dupa pleonasmul cu “CRT run-time library”.

Un suflet mare a incercat sa-i explice ca lumea are tendinta sa te creada prost daca publici prostii, aratind chiar cu degetul in directia lui Bullschildt, dar Silviu nu e un om care sa faca legaturi (desi ocazional il mai paleste cite un moment Poirot). Putem doar specula motivul pentru care Silviu n-a sters acel comentariu eretic si speram ca-i implicat un anumit tip de morcov, dar oricum, a explicat pe blog-ul de atitudine de ce are el dreptul sa faca pe Domnul Trandafir:

În cariera mea am întâlnit mulţi oameni talentaţi, foarte buni profesionişti, dar la toţi am văzut slăbiciuni tehnice. Cu siguranţă şi Mihnea are, la fel cum am şi eu.

Trebuie sa recunosc ca asta m-a enervat un pic. Acest Pitic Porno al forumurilor romanesti de programare, care nu stie sa caute intr-un map sau sa afle dimensiunea unui fisier, poate vedea “slabiciuni tehnice” la altii, pisa-l-as in inima. Mai mult, lacunele mele le scuza pe ale lui, chiar daca ale lui sint in subiecte care i s-ar parea banale unui elev de liceu, iar pe ale mele poate doar sa le conjectureze in baza filosofiei “nimeni nu-i perfect”. Desi i-am mai explicat de vreo doua ori, el continua sa ignore faptul ca eu nu scriu tutoriale, deci nu conteaza cit de incompetent sint. Cind scrii ceva, nu te raportezi la ceilalti gaozari care scriu timpenii pe codeguru sau pe blogurile lor “tehnice”, bai pula. Te raportezi la rezultate, ca programarea e o stiinta exacta, nu e expresionism abstract. Daca postezi cacaturi care nu merg si pe care nici tu nu le intelegi, puti demonstrabil a prost si faptul ca mai sint si altii ca tine nu e o scuza.

Tot in ultima lui luare de pozitie, ortacul revine la o tema mai veche, cea a Adversarului Colectiv. In urma cu ceva vreme el era convins ca jos8cal si cu mine sintem aceeasi persoana pentru ca ne luam de timpeniile lui, desi acum neaga ca ar fi zis asa ceva. Acum ma face pe mine raspunzator de faptul ca cineva a pus niste cod gresit intr-un comentariu la el pe blog. Aparent eu trebuia sa ma iau si de ala, dar n-am facut-o pentru ca si eu gresesc, sau ceva; n-am inteles, logica subterana imi scapa uneori. Minerul n-a priceput inca faptul ca tintele predilecte ale acestui blog sint oamenii care persista in prostie chiar si dupa ce li se spune ca ar fi mai bine sa stea in banca lor si sa se rezume la pus intrebari, iar el primeste atit de multa atentie pentru ca e cel mai penal reprezentat al acestei subspecii.

In finalul justificarii si-asa destul de dezlinate, Silviu recurge la o manevra des intilnita la imbecilii ramasi fara argumente: expresia “m-am plictisit”. Laolalta cu acuza “f(r)ustratule”, sau eventual dupa ce aceasta se dovedeste ineficienta, aruncarea lui “m-am plictisit” intr-o discutie se face in speranta ca il vei inchide pe interlocutor cind realitatea iti e potrivnica, dar vrei totusi sa cazi in picioare. Pentru a completa starea de spirit in care era el cind facea apel la respect (din pacate a sters apelul intre timp), ma vad fortat sa reiau un pasaj liric citat de colegu’ jos8cal intr-un post mai vechi despre felul in care societatea si Internetul il dezamagesc zilnic pe Silviu:

Când plini de praf cu paşi trudiţi,
Ieşim din mina obosiţi,
Ne doare ca-n lumina sa
Pământul ţine-o lume rea.

Deoarece un bou nu poate supravietui niciodata singur, Ovidiu “MVP” Cucu a tinut sa-si arate in mod subtil solidaritatea cu cauza mineriadei. Cititorii nostri fideli sigur n-au nimic mai bun de facut decit sa tina minte cum speculam acum citeva post-uri ca Ovidiu este cel care-l ajuta pe Silviu sa-si spele trecutul fara sa lase urme. Atasatul politic pe linga uzina Codexpert a decis sa-si dea jos masca, semnind citet ultima editare a periplului codexpertic al lui Silviu prin lumea fisierelor. Motivul trecut de MVP in condica este “Few cosmetics“. Asta e noul eufemism aprobat in Sedinta Extraordinara de catre AXTI pentru “facut sa mearga dupa un an”. Cosmetica e ce le va trebui lor daca Mos Craciun imi aduce anul asta aruncatorul ala de flacari de care-i tot zic.

PS: avem doua pagini noi la care se poate ajunge din coltu’ rusinii, adica din dreapta-sus: Idei in Monolog, cu citate din viata si opera personalitatilor din programarea romaneasca, si Intreaba-l pe Capitanul Kirk unde invitatul nostru semi-permanent Iacob Tiberu ia interviuri acelorasi personalitati.

Tags: , , , , , , , , , , , , , , , ,