Stop. Hamming time.

Posted in Premiul n00bel on October 20th, 2011 by Mihnea

Mai stiti cind zicea Marius Bancila ca distanta Hamming este cea mai rapida metoda de a calcula distanta Hamming (sau ma rog, “Hammering” cum a botezat-o el initial)? Mai stiti cind ziceam eu ca timpeniile codexpertilor sint contagioase? Ei bine, iar am avut dreptate:

Inainte de asta domnul Richard [Hamming, n.r.] s-a jucat cu numaratul bitilor dintr-un string de bytes si, asa cum s-a mai discutat pe acest forum, a generat cea mai optima metoda in acest sens.

Acum crezul asta dublu-pleonastic este intiparit in mintea lui bu7ch3r, iar el ii va infecta la rindul lui pe altii. Deci copii, aveti grija sa va protejati cind intrati in codexpertia, ca altfel luati chestiuni ce nu trec nici cu Moldamin.

Putin mai devreme am primit de la colegul de redactie acest link in care se povesteste cum au dispersat comunistii o rascoala a minerilor stropindu-i cu cacat. N-ar fi frumos ca intr-o zi cacatul cu care aruncam noi inspre codexpertia sa disperseze minerii de acolo?

PS: bu7ch3r a mai avut citeva interventii ce m-au facut sa suspectez ca este un membru conspirat al Rezistentei angajat intr-o campanie de trollaj extrem de fin. Daca e asa, felicitari tovarase. Daca nu, nu.

Tags: , , , , , , ,

Mineguru

Posted in Codare cu premeditare, Premiul n00bel on October 18th, 2011 by Mihnea

Dupa cum remarcam intr-un comentariu anterior, minerul si-a luat putin din pila articolul ala copiat de pe codeguru si l-a pus pe codeguru. Citind el ce i-am zis despre functia imaginara snwprintf() si alte aberatii, a schimbat placa si n-a mai incercat sa fie cross-platform, ci a incercat sa fie cross-character set. Problema de pornire s-a schimbat peste noapte si a devenit:

The writing of this buffer was done using: vswprintf(). As we know, this function is unsafe and is not recommended.

Iar solutia ar fi:

#if defined(UNICODE) || defined(_UNICODE)  
#define usprintf(x, ...) \
   _snwprintf(x, _countof(x)-1, ##__VA_ARGS__); \
   x[_countof(x)-1] = 0
#else
#define usprintf(x, ...) \
   _snprintf(x, _countof(x)-1, ##__VA_ARGS__); \
   x[_countof(x)-1] = 0
#endif

Lasind la o parte faptul ca n-a inteles cind i-am zis ca macro-urile cu mai multe statement-uri nu se scriu asa, trebuie sa ne intrebam totusi urmatoarele:

  • de ce e vswprintf() “unsafe”, si de ce e _snwprintf() mai “safe”?
  • cum inlocuiesti un apel la vswprintf(), care doreste un va_list, cu macro-ul ala imbecil?

Si daca trebuie sa ne intrebam, ne-am intrebat. Ortacul a facut greseala fatala de a posta pe un site unde nu poate sterge comentariile incomide. Veni si raspunsul:

Sorry, I’m not talking about vswprintf() versus _snwprintf(). I just decided to use one of these.

Ok, n-a inteles intrebarea, deoarece era pusa in limba lui Shakespeares si se referea la articolul lui, pe care doar l-a scris, nu l-a si citit. Am incercat o reformulare, pe care a inteles-o si a raspuns cu un copy/paste din MSDN urmat de propria concluzie:

“Using vsprintf, here is no way to limit the number of characters written, which means that code using this function is susceptible to buffer overruns. Use _vsnprintf instead, or call _vscprintf to determine how large a buffer is needed. Also, ensure that format is not a user-defined string. For more information, see Avoiding Buffer Overruns.” Same story with vswprintf().
http://msdn.microsoft.com/en-us/library/28d5ce15(v=VS.80).aspx

Priviti-l, stimati concetateni, in toata splendoarea lui. Acest cercopitec e atit de sigur pe el incit imi da condescendent si un link la MSDN pe care el nu l-a citit. I-am indicat gratios faptul ca o pula “same story”, asa ca a editat articolul, a pus swprintf() in loc de vswprintf() si a declarat:

The functions used in the macro (_snwprintf/_snprintf()) are not proper to replace functions like vswprintf() – this function has different count of mandatory parameters and uses a list of arguments parameter. Sorry, in article I mean swprintf() witch is unsafe. Thanks for observation.

Aha, doar ca nici vrajitoarea swprintf() nu e “unsafe”, dupa cum i-am explicat deja, dar a uitat; si dupa cum scrie in link-ul la care ma trimitea pe mine, pe care tot nu l-a citit. Silviu nu are nevoie de documentatie sau de realitate, el are 11 ani de experienta.

Va tin la curent pe masura ce-si editeaza articolul si-si fabrica noi justificari, ca in vremurile bune. Sper ca se va incheia triumfal cu Bancila sau Cucu (care sint moderatori pe site-ul ala de tutorialisti indieni) operind “small cosmetics” asupra comentariilor mele.

 

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

Subapreciatul loc doi

Posted in Premiul n00bel, Regula 0 on May 12th, 2011 by Mihnea

Desi francezii s-au straduit in repetate rinduri (Agincourt, Maginot etc.) sa ne invete ca important e sa participi, nu sa cistigi, lumea sluta in care traim tine minte doar invingatorii si-i trece in uitare pe ocupantii locului doi. N-as vrea ca site-ul nostru sa fie partas la acest trend dezonorant. In Campionatul National de Tirnacop Viteza a existat si o medalie de argint si e de datoria noastra sa recunoastem si sa laudam efortul celorlalti participanti.

Sa fie clar: nimeni nu poate concura cu Silviu Ardelean. Finetea cu care roteste el tirnacopul din poignet nu are egal. Singurul om ce-l pune uneori in dificultate este viorel2005, dar doar in probele libere, caci stilul dadaistico-involuntar nu este apreciat de jurii in probele impuse, ca cele de azi. Totusi, in umbra (si in urma) marelui miner trudesc alti citiva codexperti si este nedrept sa le ignoram zbuciumul.

Dupa cum spunea colegu’ in articolul anterior, Silviu a ratat startul in cursa de 100 de metri Google. A recuperat pe parcurs, dar Marius Bancila a avut o prestatie buna, ce i-a asigurat medalia de argint:

Vad ca azi e ziua intrebarilor de interviu. Din ce am citit, se pare ca cea mai buna metoda e Hammering weight (sau popcount).

Link-ul dat de seful clasei duce la articolul din wikipedia despre Hamming weight. Hamming, hammer, tirnacop… in viltoarea competitiei e usor sa faci confuzii. E la fel de usor de inteles ca atunci cind te grabesti sa bagi in somaj butonul “I’m feeling lucky”, n-ai timp sa si citesti ce scrie in link-urile pe care le repeti. La Marius, Hamming weight, adica numarul de biti setati dintr-un sir binar, este cea mai buna metoda de a numara bitii setati dintr-un sir binar. Acest rationament este confirmat peste tot in lumea inconjuratoare. De exemplu, adunarea este cea mai buna metoda de a aduna numere.

Felicitari Marius!

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

Haters gonna hate

Posted in Premiul n00bel, Regula 0 on March 19th, 2011 by Mihnea

 

 

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

Antisilviul

Posted in Regula 0, Stand-up philosophy on February 1st, 2011 by Mihnea

Incepem ziua cu o veste buna: Marius Bancila si-a corectat gogorita cu fisierele de care ziceam ieri. Inca o fapta buna in numele dreptatii, inca un cap al hidrei retezat. Go Captain Standupprogramming!

Intre timp in subteran, Silviu “Zhàozhōu” Ardelean, cu tirnacopul intr-o mina si mu (無) in cealalta, continua sa dez-intrebe intrebarile calugarului retardat viorel2005:

Invatacelul Viorel: Problema este acum cum modific valoarea unui const int in Visual C++ 2010?

Maiastrul Silviu: Ce intelegi tu prin const int?

Galeria ar fi ramas tacuta si intrebarile ne-dez-intrebate de nu s-ar fi gasit un Dl. Problema sa rascoleasca praful ce abia se asternuse pe florile de mina. Trezit din somn, unul din experti l-a admonestat prompt de sub invelisul protector al contului de administrator (ca tot le place lor sa spuna ca nu se ascund dupa nick-uri):

Ce-i aia “LLE”?
Inainte de a posta citeste te rog “Inainte de a posta“!

Lasind la o parte faptul ca Gardianul Ovidiu si-a mascat doar numele, nu si stilul inconfundabil in aceasta comunicare, haideti sa citim Inainte de a posta inainte de a posta, ca sa nu ne aposteze pe viitor Ovi daca vrem sa postam un post. Pe linga banalitatile uzuale regasite in regulile oricarui forum, Marius Bancila a adus cu el de pe muntele Sinai si urmatoarea gema:

Atunci cand doriti sa raspundeti la o intrebare, asigurati-va ca:

  • raspunsul este in acord cu intrebarea formulata; evitati raspunsurile sau mesajele in afara subiectului;
  • raspunsul aduce ceva nou celor anterioare; evitati sa raspundeti cu aceleasi informatii care au fost deja oferite;
  • sunteti familiar cu subiectul discutat; nu oferiti raspunsuri bazate pe pareri sau impresii; daca nu sunteti sigur de ceva, specificati acest lucru;
  • sunteti cat se poate de clar cu informatiile furnizate; evitati crearea unor seri de intrebari si raspunsuri care sa aiba ca scop clarificarea unui raspuns anterior dat.

Mie mi se pare amuzant cum punctul 3 descalifica aproximativ 99% din experti din cursa pentru postul de Raspundac in orice subiect legat de programare, dar amuzamentul nu se opreste aici. Si mai tare e cum au reusit sa creioneze atit de exact Antisilviul: omul care stie despre ce vorbeste, nu copiaza raspunsurile anterioare si explica clar solutia. Cu toate astea, nu stiu cum se face ca Regula Antisilviului (Regula -1, daca ar fi sa pastram ordinea cronologica) nu este aplicata, insa Regula Silviului (“Nu faceti misto de prosti”, a.k.a. Regula 0) este invocata iar si iar.

PS (adica “post scriptum”, Ovidiu): mesajflaviu a vrut sa intre si el in rindul expertilor postind FAQ-ul Cum pot face download/upload de fisiere in MFC. Din pacate n-am fost pe faza si expertii l-au sters inainte sa apucam sa ne delectam cu el. Daca va grabiti puteti vedea inca urmele sale pe prima pagina a comunitatii expertilor, jos la “Ultimele FAQ-uri”. Nu ne indoim de faptul ca stergerea a fost justificata, dar ne intrebam cit de grandioasa era aberatia, de s-au prins pina si expertii ca trebuie retezata de la radacina. Inchipuiti-va ceva si mai prost decit ce a stat aici timp de un an pina ne-am sesizat noi, sau mai idiot decit asta.

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

Ma-nvirt in cerc, nu te gasesc

Posted in Codare cu premeditare, Regula 0, Stand-up philosophy on January 31st, 2011 by Mihnea

Cind unul dintre experti intra in contact cu o aberatie, aceasta se propaga in staulul lor mai ceva ca herpesul in puscarie, ajungind in timp record sa-si infiga adinc tentaculele in etosul autoproclamatei comunitati de programatori C++. Dupa aia, aberatia foloseste site-ul lor drept un vector infectios pentru a corupe mintile ratacitilor care, orbecaind prin bezna inceputurilor, esueaza printre Raspundaci. Tratamentul nu-i usor, caci chiar daca-l determini pe unul din experti sa-si corecteze pe furis aberatia, un altul ii va lua locul si o va scoate la iveala pe blog, intr-un FAQ sau intr-un alt astfel de vas Petri.

Bunaoara, nici n-am terminat bine instructia cu minerul in problema dimensiunii fisierelor, ca si apare Marius Bancila cu un articol despre cum sa deschizi un dropdown in configuration manager in Visual Studio. In indispensabilul articol ni se enumera si unele din avantajele compilarii pentru 64 de biti:

Printre avantaje se numara accesul la mai multa memorie, accesul la fisiere mai mari de 4GB, sau accesul la functii specifice sistemului pe 64-biti.

Deci da. Inca un expert care crede ca din 32 de biti n-ai cum sa citesti fisiere mai mari de 4 GB.

Si ca tot am ajuns la spinosul subiect al dublarii numarului de biti, Gardianul Ovidiu are si el un sfat pentru noi:

O problema am avut-o si am pierdut ceva timp din cauza ei, in momentul in care am vrut sa fac build din linie de comanda (devenv.exe… ).
Recomandare: pune cele doua configuratii (pt Win23 si x64) in solutii (sln-uri) diferite.

Din pacate dinsul n-a vrut sa ofere detalii suplimentare despre problema pe care o intimpinase, desi minerul s-a aratat interesat. Noi presupunem ca scria numele configuratiei in command line fara sa puna “|win32″ sau “|x64″ in coada, asa ca devenv incalca iar Regula 0 si-i compila tot timpul configuratia de 32 de biti. Daca cititorii nostri au alte presupuneri creative, le asteptam in comentarii.

Cum codexpert a ramas in urma comunitatilor-surori din AXTI si nu si-a facut inca televiziune online, ne-am decis sa-i ajutam noi, asa ca pe linga RONUA TV, de azi exista si CODEXPERT TV. In continuare va prezentam filmul artistic Raspundacii, care dramatizeaza zbuciumul interior al expertului in incercarea acestuia de a scapa din ghearele aberatiei:

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

Ani de liceu

Posted in Premiul n00bel, Stand-up philosophy on January 27th, 2011 by jos8cal

In orice clasa exista cite un elev care invata si restul care copiaza de la dinsul. Stupoarea maxima apare cind dupa corectare primesc toti nota 2, deoarece cel de la care s-a copiat a prins o zi proasta si a raspuns pe linga. Caz concret pe bancile scolii ardenele:

Marius Bancila despre accesarea unui array 2D:

unsigned char* bmp1;
bmp1=new unsigned char[rows * cols];
for(int i=0;i<rows;i++)
   for(int j=0;j<cols;j++)
      bmp1[i * rows + cols] = i+j;

Silviu Ardelean confirmindu-si clasa de copiac notoriu:

Viorel, urmeza sfatul lui Marius de-a folosi array-ul uni-dimensional pentru stocarea imaginii. Cu astfel de buffere se lucreaza in procesarea de imagini.

Anyway… renunta la abordarea cu array-ul 2D si rezolva-ti problema cu un banal array 1D via bmp1[i*row + coloum] = i+j;

Stati jos, 2.

Tags: , , , , , , ,

A doua corectura (la sugestia lui Sorin)

Posted in 112, Codare cu premeditare, Premiul n00bel on November 24th, 2010 by Mihnea

Nici n-am dat bine submit la post-ul anterior, ca Silviu a luat iar atitudine. De data asta a pus “unsigned long” in loc de “long”, dar nu pentru ca ar bijbii in jurul solutiei dupa ce citeste aici, ci pentru ca:

According to Sorin’s observation I changed the long type to unsigned long.

Putin mai devreme, inainte de a vedea post-ul meu, Silviu ii raspunsese direct lui Sorin in felul urmator:

Absolutely. Nobody stops you to replace long with long long or unsigned long long.

Absolutely. Nimeni nu te oprea, dar o faceai degeaba, ca folosea _wstat(), care-ti returneaza dimensiunea pe 32 de biti. Dupa aia poti sa inlocuiesti tu ce vrei, ca e prea tirziu. Acum ar merge inlocuit, dar cineva totusi l-a oprit pe miner si nici dupa a doua corectura nu se descurca cu fisiere mai mari de 4 GB. Poate din a treia ii iese?

Probabil tot in urma “observatiei lui Sorin”, minerul a sters #ifdef-ul rusinos si din FAQ-ul la care tocmai dadusem link. Noroc ca o vreme de acum incolo pagina aia va fi in cache la Google cu aberatia originala. Probabil dupa ce va expira cache-ul, Silviu va pretinde ca a fost asa dintotdeauna (observati ca nu scrie “last edited”, deci MVP Ovidiu Cucu sau MVP Marius Bancila i-au dat o mina de ajutor cu editarea). Nu uitati: el isi recunoaste greselile.

PS: totusi, trebuie sa recunosc ca nu m-as fi gindit ca o functie care returneaza dimensiunea unui fisier poate genera atita amuzament. Inca o dovada ca tot ce-ti trebuie pentru ca sa te poti distra e o problema banala si un miner prost.

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

Programul FUL. Balada epica in versuri.

Posted in Codare cu premeditare, Premiul n00bel, Stand-up philosophy on September 13th, 2010 by jos8cal

Probabil cu totii am fost traumatizati cindva pe parcursul vietii. Eu stiu un caz concret cu un hunedorean. Provocarea de a se fi nascut in Hunedoara s-a materializat intr-un blog in care el explica la pertu despre Basescu, demagogie, lehamite, incredibil, prost gust, atitudine, lipsa respect, teape, realitate si tristete. Incordarea maxima dintre el si realitate se poate vedea chiar din titlul blogului unde forta si maturitatea gindirii l-au proiectat sa traiasca prin Romania nu in Romania.

Intr-un alt registru traumatic se afla Fulga Marian. Acest personaj epic* s-a hotarit sa faca un program cu care sa rezolve probleme la orice nivel imaginabil sau inimaginabil, dupa caz. Cu aceasta mutare doreste rezolvarea ecuatiei Utilizator-Programator-Limbaj de programare-Produs prin eliminarea definitiva a programatorului. Rezultatul final va fi: Utilizatorul de FUL-Propriul produs. Practic el doreste sa faca un program cu care toate lumea va putea face orice si asta fara interventia vreunui programator pe viitor.

Dar sa-i dam cuvintul:

Nici simplu nici usor nici imposibil FUL nu este numai o idee elitist intelectuala. FUL este o realitate palpabila concreta materializata intr-un material cu toate cele 80 de notiuni operante ale sale, multe dintre ele de o simplitate totala si de o accesibilitate uluitoare chiar si pentru copii.

Si ca tot veni vorba de fail (ca sa nu zicem FUL):

In alti termeni FUL este un MEDIU DE CONFIGURARE ( ca sa nu zicem de programare) care da posibilitatea utilizatorului sa CONFIGUREZE (ca sa nu zicem programeze) propriul program FOLOSIND O SINGURA MACHETA UNIVERSALA DE CONFUGURARE (ca sa nu zicem de programare)

Sufletul sau tinde dupa libertatea pustnicului hitru care s-a decis sa invinga prin a sta cu spatele si a minca de pe jos:

Totul se face citind si scriind, ce scriem aia apare, ce scriem aia ramine. Decizia , conceptia, realizarea ne apartine si o materializam exact cum o gindim noi insine cu propria noastra minte – nu a altcuiva- Nu mai depindem de de nimeni .

Iata si motivele pentru care FUL trebuie sa existe:

  • FUL – Programarea accesibila oricui ( cu ceva minte )
  • FUL – Programezi de cind inveti sa citesti si sa scrii
  • FUL – Circa 80 de notiuni CONCRETE (fata de sute ABSTRACTE din limbajele de programare).
  • FUL – Rezolva probleme la orice nivel imaginabil
  • FUL – Exista matematic si logic reprezentat grafic explicit pe 4 pagini scrise.

si motivele pentru care programatorii nu trebuie sa priveasca cu ochi hunedoreni demersul sau demiurgic:

  • FUL – Nu exista ca soft si trebuie facut de programator
  • FUL – Elimina programatorul.
  • FUL – Adus la perfectiune si ajuns la utilizatori scoate de pe piata prin suficienta propriul producator.
  • FUL – Va fi realizat

(*)

Am folosit cuvintul epic cu scopul de a demonstra ca programul FUL face parte dintr-o trauma a copilariei mele si anume opera epica in versuri cu rima alba. Pentru demonstratie am sa folosesc metoda analogiei cu o alta opera epica in versuri si de sorginte anonima: Toma Alimos. Ca si cadru de sustinere pentru demersul meu ma voi folosi de o deja existenta demostratie. De asemenea voi imprumuta limba si obiceiurile demonstrandului, deoarece dupa cum veti vedea, poseda o tulburatoare capacitate de a templetiza epicul ca specie literara. Asadar sa trecem la copy/paste din demonstratie:

Programul “FULL” este o creatie epica in versuri, o balada populara pentru ca prezinta momente importante din viata unui personaj inzestrat cu calitati deosebite, elementele reale impletindu-se cu cele fabuloase. Titlul programului reprezinta numele personajului principal (FUL de la Fulga Marian).

Poetul anonim evoca haiducia ca forma a luptei sociale, alegand episoade semnificative din viata unui programator (MFCist in cazul nostru).

In expozitiune, se prezinta locul actiunii, un forum de programare si limbajele cu care va fi executat macelul: “.NET(C#, VB.Net…)”, si personajele baladei: Programatorul (Ovidiu Cucu ca si bidder in josul paginii)  si Fulga Marian Manea.

Prin descrierea din cadrul expozitiunii se realizeaza o sinteza a peisajului IT romanesc: ideologia naiva de tip Scoala Ardeleana, aberatii a la SuperDarie si 30 de minute de tortura cu Ovidiu Cucu. In acest cadru natural, specific romanesc, Ovidiu Cucu zaboveste impreuna cu codul sau. Se odihneste si se ospateaza. El este singuratic, ducandu-si viata in singuratatea biroului, si de aceea, nici armele, nici codul nu pot suplini tovarasia omului. Gandurile si sentimentele lui se indreapta asupra codului cu care se simte infratit: “inchinari-oi codului, int-ilor si float-ilor…“. Ovidiu, personificat fiind, simte apropierea primejdiei, se infioara, , codul necheza, iar armele ies din teci. Incordarea creste cand apare Fulga Marian zis si Manea. Naratiunea este intrerupta aici de descrierea insusirilor fizice ale celor doi, descriere care prezinta in antiteza portretul lor fizic.

In intriga, dialogul dezvaluie motivele supararii lui Fulga Manea: faptul ca i-a inselat asteptarile, i-a tulburat gindurile, depinde de el, si pretinde “codul vama”.

Ovidiu Cucu, demn si cu simtul raspunderii va da seama pentru faptele sale, dar il roaga sa nu fie acesta un motiv de dusmanie intre ei.

In desfasurarea actiunii, sunt urmarite cu ajutorul naratiunii si al descrierii, atitudinile si reactiile opuse ale celor doua persoane si apoi injunghierea miseleasca a lui Ovidiu Cucu, programatorul.

Poetul anonim povesteste cum Ovidiu, cu inima deschisa, intinde boierului codul si banul, indemnandu-l sa se cinsteasca, sa lepede mania, si sa-I vorbeasca ca unui frate. Viclean si las, Fulga Manea i-a cu mana stanga codul, iar cu dreapta il injunghie miseleste, apoi fuge ca un las. Prin repetitia verbului “a fugi” si prin versul “Nu mai depindem de de nimeni” poetul anonim isi exprima dispretul pentru lipsa de demnitate a lui Fulga Manea.

Ovidiu nu-si pierde cumpatul intr-un moment atat de greu pentru el, si nu se lasa invins de durere. Astfel, il atentioneaza pe Fulga Manea ca trebuie sa raspunda pentru fapta sa, apoi isi aduna ultimele puteri si pune un bid de 29 de milioane de lei.

Incepand cu acest episod, balada capata un caracter dramatic si fantastic. De domeniul fabulosului este si felul in care programatorul isi strange mijlocelul cu braul si vorbeste codului cu caldura, ca unui frate. El ii cere sa ii fie de ajutor in acest ceas de cumpana cum I-a fost si in tinerete, sa-l poata pedepsi pe Fulga Manea pentru lasitatea lui. Un alt element fantastic este personificarea codului, care ii asculta dorinta si zboara ca vantul, ajungand dusmanul intr-o clipa: “lasa mouse-ul, sai pe mine, \ si de IDE te tine, \ ca s-arat la batranete, \ ce-am platit la tinerete!”

Printr-un pasaj narativ, poetul anonim surprinde incordarea maxima dintre a conflictului dintre cei doi, cand Programatorul Cucu isi rapune vrajmasul cerindu-i o suma imensa pentru realizarea programului. Acest moment constituie punctul culminant al baladei. Verbul “trimite-mi” sugereaza repeziciunea cu care Ovidiu Cucu l-a pedepsit pe dusman.

Deznodamantul baladei este pe masura faptelor deosebite narate in desfasurarea actiunii baladei. Continuand naratiunea, autoul prezinta fiorii mortii care-l cuprind pe Ovidiu Cucu: “foicica micsunea, \ vreme multa nu trecea \ si pe Cucu-l ajungea \ MFC-ul, moartea grea”.

Monologul lui Cucu exprima dragostea si recunostinta pentru codul care l-a ajutat: “d-alelei , codutule, \ d-alelei dragutule, \ ce-am gandit \ am izbandit, \ vremea MVP-a sosit”.

Eroul ii incredinteaza codului ultimele sale dorinte printr-un adevarat testament spiritual: el ii cere codului sa fie ingropat in mijlocul proiectului, si sa-I puna la cap floare de bujor iar la picioare busuioc, considerand ca acestea sunt un element de legatura intre el si iubitul lui MFC. Desprinde de-aici, ca si din intreaga balada, sentimentul comuniunii depline a omului cu natura sa de epic. El doreste sa fie inmormantat in mijlocul codului, ca sa se simta aproape de fiintele drage: codul si expertii, si spune acela ce-i va pune fraiele codului va continua lupta impotriva nedreptatii, pe care a dus-o si el pe codexpert.ro.

Natura participa la trasaturile sufletesti ale lui Ovidiu Cucu: incearca sa-i aline suferinta, si-l plange atunci cand trece in lumea umbrelor: “codul se cutremura, \ STL se cletina

Credincios stapanului, codul ii sapa groapa in mijlocul projectului in care el a trait bucuria vietii, ii asterne fanisor in mormant, ii sadeste floati, apoi pleaca in codru la noul sau stapan, “fratior de vitejie, tovaras de MFCie”. Durerea sfasietoare a codului la pierderea stapanului, se deduce din folosirea verbelor la imperfect: coda, se exprima, rezolva quiz-uri…

Prin expresivitatea orala, realizata printr-o multitudine de interjectii, substantive in vocativ, formulele de adresare a personajelor baladei populare FUL, demonstreaza ca literatura, in general literatura populara constituie o forma superioara , forma artistica a comunicarii.

QED (Pentru Marius Bancila: inseamna quod erat demonstrandum).

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

Sa nu-ti faci array cioplit

Posted in Codare cu premeditare on August 5th, 2010 by Mihnea

Deci imi scapa ceva, deci. Deci a facut colegu’ bascalie de Silviu “Traffic Sign Recognition” Ardelean, da’ se pare ca de fapt Silviu chiar avea dreptate propovaduind lumii tehnologia pe care tocmai o inventase. Deci sa va explic.

MVP Marius Bancila, care parea cel mai breaz dintre codexperti, a pus pe blogul dinsului o aplicatie pentru torturat oamenii cu dicromatism. Implementarea acestei aplicatii presupunea manipularea unui array bidimensional. Privind in sursele puse la dispozitie cu generozitate, observam urmatoarea abominatie:

int** m_pCells;
void Create()
{
   m_pCells = new int*[m_nSize];
   for(int i = 0; i< m_nSize; ++i)
      m_pCells[i] = new int[m_nSize];
}

Acu’ vreo doua zile imi zicea un prieten de un program scris de fizicieni care aproape si-a dublat footprintu’ cind a fost mutat pe 64 de biti din cauza ca autorii aveau genul asta de relatie contra naturii cu array-urile de pointeri. Azi vad ca problema nu e rezervata exclusiv refugiatilor din Fortran si juniorilor care aloca vertecsi cu new float[3], ci isi intinde tentaculele pina la virfurile comunitatilor de experti in C++ (auto-proclamate, ce-i drept). Acum nu ca in cazul de fata ar conta overhead-ul sau muile murmurate in barba de procesor la vederea festivalului de pointer chasing, da’ chiar imi scapa de ce ai scrie atita cod in plus, ca la sfirsit sa mearga si prost.

Avind in vedere ca tehnologia aia de tinut array-uri multidimensionale in vectori nu este atit de cunoscuta pe cit credeam, zic ca merita un loc in panoplia evidentului, adica sa fie transformata intr-un “design pattern” d-ala. Sa stea acolo la loc de cinste cu variabila globala, instructiunea switch si alte astfel de geme indispensabile inginerilor de pe tot globu’ de pamint. Ce zici bre Silviule, te bagi sa-i dai un nume in engleza?

Si daca tot am ajuns la subiectul patterns si best practices, sa observam si aceasta tehnica de programare defensiva:

CBrush* CColorMap::GetBrush(int key) const
{
   if(key < 0 || key > (int)m_brushes.size())
      throw std::exception("Invalid color key", key);

   return m_brushes[key];
}

Pe linga abila inlocuire a lui assert() cu throw, codul de mai sus demonstreaza si abila utilizare a unui constructor non-standard pentru std::exception care nu face tocmai ce se asteapta Marius sa faca. Din nefericire autorul nu s-a sinchisit sa stea si la primire, deci problema nu apuca sa se si manifeste, iar codul e chiar mai eficient in varianta asta obfuscata. Se pare ca pina la urma puroiul ala de Coelho avea dreptate.

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