Sa ma fut in politete

Posted in Regula 0 on September 18th, 2013 by Mihnea

retard-baby2Cum pula mea s-a ajuns sa fie mai important sa fii politicos decit sa stii despre ce vorbesti?

Este o chestie pe care o tot vad pe forumuri, liste de discutii etc. Sa-i spunem sindromul Marius Bancila. Vine un prost – sa-i spunem Silviu Ardelean – si emite o timpenie. Ii arati ca-i prost si-l rogi sa nu mai posteze imbecilitati. Apare un moderator – sa-i spunem tot Marius Bancila, ca sa rimeze cu sindromul – si te avertizeaza sa nu-i mai spui lui Silviu Ardelean sa-si tina gura, ca nu-i frumos. CUM SLOBOZ BA? In loc sa-i spuna Silviului ca e inacceptabil sa vorbesti timpenii (sau sa-l baneze direct), Mariusul e preocupat de mentinerea atmosferei de voie buna si cooperare tovaraseasca. Ca si retardatii e oameni, si are si ei inteligenta lor emotionala, nu?

Da, stiu. Daca iti antagonizezi interlocutorul, comunicarea se duce pulii, asa ca daca vrei sa fii constructiv trebuie s-o iei cu frumosul. Problema cu aceasta regula de cacat este ca presupune existenta unui interlocutor. Eu nu vorbeam de cazurile in care cineva greseste pur si simplu si il corectezi, ci de situatiile in care e implicat un Silviu, unde e evident de la inceput ca n-ai cu cine sa discuti. Presupusul interlocutor e atit de prost incit nu numai ca nu poate, dar nici nu vrea sa inteleaga argumentele pe care le aduci. In mod normal, Mariusul ar trebui sa-i stearga aberatiile. Daca n-o face, ceilalti participanti la discutie au obligatia morala de a face misto de retardat, pentru a se asigura ca viitorii cititori ai thread-ului nu sint indusi in eroare. Eu asa vad lucrurile.

Dar sa lasam numele generice si sa trecem la un exemplu practic. Un domn de la Valve a propus ca VC++ sa dea warning-uri cind dai parametri aiurea la functii care accepta format string-uri, asa cum fac deja diverse alte compilatoare. VC++ da si el warning-uri d-astea, dar doar cind ii dai cu /analyze, ceea ce dureaza inacceptabil de mult IRL. Validarea asta nu e costisitoare (dupa cum ne dicteaza atit bunul simt, cit si faptul ca nu incetineste semnificativ compilarea acolo unde e implementata deja), deci ar putea fi mutata din analizorul static in compilator.

In acest moment se amesteca in discutie Silviul de serviciu, cu numele de scena UnitUniverse, care nu vrea ca compilatorul sa faca “special process” pentru printf, care e o functie ordinara. Fiind foarte prost, el este de parere ca problema reala sta in faptul ca printf foloseste “extractie binara” si “masti binare” pentru a extrage parametrii, deci compilatorul n-are ce face. Ca si Silviul real, este preocupat de noile cuceriri ale tehnicii in materie de generat code bloat si incetinit compilatorul, asa ca face si el o Propunere: sa inlocuim printf cu template-uri variadice (sigur, nu inainte de a inlocui enumurile cu vectori).

Imboldit iar de spiritul civic, am considerat ca-i datoria mea sa-i spun boului ca nu e vorba de printf, ci de un mecanism pentru marcat format string-urile ca sa le poata verifica compilatorul. Care mecanism exista deja in VC++ sub forma macro-ului _Printf_format_string_. Ce a inteles retardatul (care stapineste limba lui Shakespeares la fel de bine ca omologul sau din Valea Jiului):

Yes, providen switchers to enable the detecting is an considerable idea. But, as i written previously, the printf extracting tail arguments with binary cutters, I’m doubt if they could implement such kind of checking mechanism.

I-au zis doi oameni ca e facut. I-am zis si cum e facut si i-am dat si link la cum fac alte compilatoare. De aici, el a concluzionat ca nu se poate face din cauza “taietoarelor binare”. In pula mea.

I-am raspuns ca nu stiu ce-s alea binary cutters si ca-s convins ca nici el nu stie, dar ca indiferent de ce crede el, mecanismul exista deja si trebuie doar mutat din analizor in compilator. De asemenea i-am recomandat sa nu-si mai dea cu parerea in probleme pe care nu le stapineste. Nu i-am zis sa nu-si mai dea IN PULA MEA cu parerea. I-am zis fara mui si puli. Rezultatul a fost ca s-a autosesizat Mariusul local si mi-a sters comentariul.

Lasind la o parte faptul ca-i urez cancer militianului care a facut asta, doresc sa insist un pic asupra unui model de comportament (ca nu pot sa-i spun gindire) ce este des intilnit printre Silvii. Cum ajunge imbecilul sa deduca cu mintea lui ca nu se poate face, dupa ce i-am aratat cum e facut, si i-am dat si link-uri?

Raspunsul e simplu si nesurprinzator: prostia. Silviul porneste cu o Opinie. Desi undeva adinc in fiinta lui licare ideea ca de fapt nu prea stie despre ce e vorba, odata ce-si formeaza si exprima Opinia, vocea interioara este sugrumata si Silviul se lanseaza cu toata forta intru sustinerea Opiniei. Nu conteaza daca ii dai argumente, link-uri sau bucati de cod pe care le-ar putea baga intr-un compilator ca sa verifice ca-i prost. Cind parcurge raspunsul tau, Silviul sare pur si simplu peste partile pe care nu le intelege. Nu le vede. Este un mecanism de aparare: faptul ca nu intelege ceva ar insemna ca e prost. El nu vrea sa fie prost, asa ca lucrurile pe care nu le pricepe trebuie sa fie irelevante. De la irelevant la inexistent este un pas foarte mic, pe care intelectul sau de batracian cu trisomie il face fara ezitare.

Pentru a vedea cum percepe un Silviu o discutie, iti poti sterge toate argumentele. Textul ramas pare o simpla Opinie. Aha! Silviul are si el o Opinie. De ce ar fi Opinia ta mai buna decit Opinia lui?

Revenind: e OK ca intr-o discutie despre compilatoare pe MSDN sa spui ca printf foloseste taietoare binare pentru extras argumente, dar nu e OK sa ii recomanzi unui bou sa nu vorbeasca despre lucruri pe care nu le intelege. Idiocracy.

PS: tag-urile pentru acest post s-au scris practic singure. Le-am luat direct de la ultimul post de pe blogul de atitudine al minerului.

PPS (adica post-post-scriptum, Ovidiu): in curind e ziua de nastere a minerului si i-am pregatit o surpriza.

EDIT: multumim Pintea:

yPuhX91

Tags: , , , , , , , , ,

Problemele infrastructurii locale

Posted in Regula 0 on July 19th, 2013 by Mihnea

Desi tot auzim ca romanii sint fruntasi la internet, publicatia noastra a raportat in trecut ca exista zone din unele orase mari ale tarii unde aprovizionarea cu internet se face greu sau chiar deloc. Un exemplu este strada Venus din Timisoara, mai ales la numarul 33. Aceste lacune ale infrastructurii cauzeaza grave probleme in activitatea agentilor economici, impiedicindu-i sa foloseasca motoare de cautare consacrate in procedura de validare a aptitudinilor candidatilor din cadrul procesului de recrutare, ceea ce in cazuri extreme poate duce chiar la angajarea lui Silviu Ardelean.

Cu toate astea, lucrurile se regleaza uneori de la sine, dupa cum ne invata celebrul mistic si autor de citate pentru Facebook Paolo Coelho. Ne face o deosebita placere sa va informam (cu o oarecare intirziere, ce-i drept) ca S.C. Firma Unde HR-ul Nu Are Acces La Google S.R.L. s-a prins in sfirsit ca Silviu nu este asa de avansat pe cum s-ar putea deduce din titlul postului pe care-l ocupa, asa ca minerul nostru preferat trudeste de vreo 3 luni intr-o noua multinationala emblematica: Visma.

Cititorii cu spirit civic se vor grabi sa se intrebe daca pe strada Coriolan Brediceanu, unde muncesc cei aproximativ 128 de programatori de la Visma Timisoara plus Silviu Ardelean, sunt aceleasi probleme de livrare a agentului internetic ca in zona strazii Venus (mai ales ca se intersecteaza cu strada Circumvalatiunii, si clar nu poti avea internet pe o strada care se cheama asa). De data asta insa, angajarea lui Silviu nu s-a produs din vina unor deficiente de infrastructura, ci ca urmare a unei cumetrii. La Visma lucreaza de ceva vreme ingerul pazitor al lui Silviu, Marius Bancila. Ii uram sa culeaga ce-a semanat.

examen_cnh

Bonus story.

 

Tags: , , , , , , , , ,

Amintiri din copilarie

Posted in Regula 0 on March 20th, 2012 by Mihnea

De cind minerul Silviu Ardelean a cazut din gratiile multinationalei emblematice si s-a vazut obligat sa-si ia tirnacop cu garbage collection, a lasat-o mai usor si cu “acting into a C++ Romanian programming community called CODEXPERT”. Desi ograda n-a dus lipsa de rataciti a caror retardare ar fi putut rezona cu prostia lui pentru a da nastere unei explozii de bucurie in sufletele cautatorilor de amuzament facil (de exemplu ala suparat pe assert), oportunitatile au venit si au trecut fara ca minerul sa faca vreo propunere. Totusi, nu e totul pierdut: ortacul are si twitter, unde mai scapa din cind in cind cite un link la chestii care-l umplu de mirare (pentru ca nu le intelege) sau un citat care l-a impresionat.

Ciripeala de azi continua o tema inceputa cu mult timp in urma prin celebrul “psychologists say“; o sa vi-l arat imediat si probabil il veti recunoaste, pentru ca este folosit de multi prosti pentru a-si justifica prostia. Ne putem doar inchipui extazul care l-a cuprins pe miner cind a vazut ca insusi marele Albert Einstein i-a lasat peste veacuri un mesaj de imbarbatare care confirma faptul ca nu-i nimic in neregula cu el si ca haterii n-au dreptate:

A person who never made a mistake never tried anything new.

Sigur, ne-am putea lega de faptul ca de la “a mistake” pina la colectia de imbecilitati consemnate de letopisetul nostru este o distanta pe care s-ar putea ca Al sa nu vrea s-o acopere cu remarca lui, sau ca nu poti pretinde ca programarea e “something new” si in acelasi timp sa scrii pe linkedin ca ai 10 ani de experienta. Nu are rost insa sa zabovim mult pe astfel de argumente, pentru ca voi le stiti deja, iar el nu le intelege (mai ales ca acum il are si pe Einstein de partea lui). In schimb, o sa fac ca-n Greuceanu, propunind sa ne duelam in citate. In coltul meu va sta John Holt cu o poveste din copilaria lui Silviu:

One day, in room period, I asked the children to write on paper certain words that I had showed them, and then write what these would look like if seen in a mirror. First I wrote CAT. Silviu wrote CAt. It didn’t trouble him that two letters were capitals and one lowercase – if he noticed it at all. He assumed that seen in a mirror the order of letters would be reversed, so he wrote TaC. The lowercase t became capital; the A became lower case. The next word was BIRD. He completely forgot what he had just done – about reversing the order of the letters. This time he assumed that the trick was to write each letter backwards, while keeping them in the original order. On his paper he had written BIrD. He reversed the B correctly, wrote the I, then looked at the lowercase r, which must have looked to him like an upside down L, decided, “I must turn this right side up,” and wrote L. Then he decided that the letters B and D should not be reversed, so his final answer was BILD.

Sper ca acum intelegeti cum ii vin ideile alea cu inlocuit enum-urile cu vectori. Mai departe ni se explica de ce reactioneaza cum reactioneaza cind ii spui ca a gresit:

This child must be right. He cannot bear to be wrong, or even to imagine that he might be wrong. When he is wrong, as he often is, the only thing to do is to forget it as quickly as possible. Naturally he will not tell himself that he is wrong, it is bad enough when others tell him. When he is told to do something, he does it quickly and fearfully, hands it to some higher authority, and awaits the magic word right or wrong. If the word is right, he does not have to think about that problem anymore; if the word is wrong, he does not want to, cannot bring himself to think about it.

Si acum despre raspunsurile aprobatoare si propunerile suplimentare din thread-urile in care s-a dat deja raspunsul corect:

This fear leads him to other strategies. He knows that in a recitation period the teacher’s attention is divided among twenty students. He also knows the teacher’s strategy of asking questions of students who seem confused, or not paying attention. He therefore feels safe waving his hand in the air, as if he were bursting to tell the answer, whether he really knows it or not. This is his safe way of telling me that he, at least, knows all about whatever is going on in class. When someone else answers correctly, he nods his head in emphatic agreement. Sometimes he even adds a comment, though his expression and tone of voice show that he feels this is risky. It is also interesting to note that he does not raise his hand unless there are at least half a dozen other hands up.

Atit.

 

 

Tags: , , , , , , ,

Arta Inaltarii Monitoarelor

Posted in Regula 0 on September 9th, 2011 by Mihnea

Astazi va supunem atentiei un instantaneu surprins in birourile Bitdefender Timisoara inainte de pasul cel mare facut in primavara de catre cel mai miner dintre paminteni. Observam cum primele doua volume din ópusul lui Knuth formeaza un fundament solid pentru demersul creator al lui Silviu. Monitorul s-ar prabusi pur si simplu sub greutatea atitudinilor si descoperirilor cioplite in el daca ar fi sprijinit pe un postament mai putin monumental. Volumul 3, ala despre sortare si cautare este probabil folosit pe post de tirnacop pad.

PS: ortacul si-a actualizat in sfirsit linkedin-ul. Aparent a facut level up de la expert la “Advanced Software Developer”, fiind acum parte dintr-o echipa de servicii profesionale care ofera suporti pentru echipa de servicii profesionale:

Member of Professional Services team, a team that offers outsourcing supports for Ricoh Infoprint Professional Services team.

 

Tags: , , , , , , , , ,

Mineru-si schimba jobul, dar naravul ba

Posted in Codare cu premeditare on July 18th, 2011 by Mihnea

Mi s-a facut observatie ca n-am analizat obiectiv codul minerului din articolul mentionat anterior. Cind i-am corectat lucrarea i-am dat direct doi pentru copiat, n-am gasit de cuviinta sa ma uit cu atentie la partea originala, ca oricum nu prea mai aveam de unde sa-i scad din nota. Gresit! Iar pierdeam una din ocaziile (deloc rare, ce-i drept) in care 4 linii de cod contin mai multe greseli decit litere.

Sa  privim, deci, ce solutie propune Silviu pentru spinoasa problema a buffer overflow-ului:

#ifdef _WIN32
   #define usprintf(x, ...) _snwprintf(x, _countof(x) - 1, ##__VA_ARGS__); x[_countof(x)-1] = 0
#else
   #define usprintf(x, ...) snwprintf(x, _countof(x) - 1, ##__VA_ARGS__); x[_countof(x)-1] = 0
#endif

Ce ne izbeste din prima e o mare surpriza: Silviu stie ca _snprintf() din VC++ nu pune 0 la sfirsitul buffer-ului daca n-are loc! Nu v-ati fi asteptat, nu? Valea Jiului, always surprising! Ei bine, nu va grabiti cu laudele. Eu nu cred minerul a dezvoltat aceasta solutie cu de la sine putere.

In primul rind, problema pe care incearca el s-o rezolve nu exista. Pentru wide char ai swprintf(), care ia si capacitatea buffer-ului, exista pe toate compilatoarele din era noastra si pune si 0 la sfirsit tot timpul. VC++ are mici dubii legate de prototipul ei in C, dar nu si in C++, deci abatajul nu ar fi afectat. Orice om normal ar fi folosit functia aia si gata. In schimb, Capitanul Copypaste a vazut pe undeva pe net sau in proiectul la care lucreaza urmatorul fragment care “rezolva” problema lipsei varului snprintf() din VC++:

#ifdef _WIN32
   #define cevaprintf(x, ...) _snprintf(x, sizeof(x) - 1, ##__VA_ARGS__); x[sizeof(x)-1] = 0
#else
   #define cevaprintf(x, ...) snprintf(x, sizeof(x) - 1, ##__VA_ARGS__); x[sizeof(x)-1] = 0
#endif

Nici ala care a facut chestia asta nu e foarte breaz, dar n-ar fi prima data cind minerul se inspira de la un alt bou. Oricum, ce e important e ca Silviu a luat codul asta, a pus “w” acolo ca sa fie Unicode si a schimbat sizeof() cu _countof() ca i-am zis noi mai demult de chestia asta. Doar ca:

  • snwprintf() nu prea exista (cica ar fi prin Borland, daca intereseaza pe cineva asemenea relicve). Ca si data trecuta cind a scris cod “cross-platform”, ortacul nu s-a ostenit sa vada daca ce a debitat in a doua ramura a #ifdef-ului chiar se compileaza.
  • _countof() nu exista decit in VC++. Da, se poate copia printr-un header si folosi si-n alte compilatoare, dar minerul nu stie asta.
  • nu asa se fac macro-uri compuse din mai multe instructiuni. Astept cu interes sa scrie un coleg de-al lui if(cacat) usprintf(ceva); else usprintf(altceva); si sa se intrebe de ce nu se compileaza.
  • snprintf() pune singur 0 la sfirsit tot timpul, nu-i nevoie de lucru manual. Ipoteticul snwprintf(), numit in realitate swprintf(), face si el acelasi lucru. Dar ma rog, cum am stabilit deja, daca stii de swprintf() nu mai faci deloc cacaturile astea.
  • daca ar fi sa fim pedantici, ne-am lega de faptul ca # trebuie sa fie tot timpul pe prima coloana, nu ai voie sa pui tab-uri in fata lui. Din nefericire compilatoarele sint indulgente in problema asta.
  • nu vad de ce ai vrea sa chemi tu sizeof() sau _countof() pentru utilizatorul macro-ului. Poate ca sa te asiguri ca respectivul utilizator nu poate folosi ce-ai facut daca are un pointer chior, chiar daca stie capacitatea array-ului la care pointeaza.
  • nu vad de ce ai face chestia asta ca macro, in loc sa faci o functie ordinara, care ar merge si cind nu folosesti ultimul racnet de compilator cu suport pentru macro-uri variadice, n-ar avea probleme fara acolade etc.; evident, asta presupunind ca n-ar exista deja functia aia.

Misto e ca de data asta Silviu nu poate baga scuza aia imbecila cu “e cod didactic, nu trebuie sa mearga”. Conform spuselor lui, asta e cod pe care l-a scris in aplicatia pe care o distruge pe bani la Saguaro. Muie Silviu!

PS: Bonus story.

 

Tags: , , , , , , ,

Cele doua fete ale tirnacopului

Posted in Regula 0 on July 16th, 2011 by Mihnea

As vrea sa facem un exercitiu de imaginatie: inchipuiti-va Liceul de Informatica din Hunedoara intr-o dimineata de vara tirzie, la sfirsitul lui August 1999. E vacanta si liceul ar trebui sa fie pustiu, dar azi nu e, pentru ca a inceput a doua sesiune de bacalaureat. Alegeti o materie la intimplare – sa spunem informatica (merge si romana). Intrati cu ochiul mintii intr-una din salile de clasa si umpleti-va plaminii cu atmosfera de examen: susoteli, fituici, profesori care scriu rezolvarile pe tabla, elevi care se duc la celelalte sali sa vada daca acolo “s-a rezolvat subiectul 2”. Un singur om sta aplecat asupra foii sale, concentrat, superior, sclipitor, dar vizibil deranjat de forfota din jurul sau. Toti incearca sa copieze de la el, iar lui ii este din ce in ce mai greu sa ignore aceste agresiuni. Acest om este Silviu Ardelean.

Silviu se jura ca asa a fost. Saptamina trecuta a fost Sarbatoarea Bacalaureatului in Calendarul Datatorilor Cu Parerea si nu putea sa lipseasca tocmai el de la festivitati, asa ca a tinut sa-si proclame admiratia fata de camerele lui Funeriu si “adevarul, normalitatea, lucrurile frumoase, realitatea” pe care acestea le-au adus in viata romanilor. Noi am avea totusi niste obiectii…

La doar patru zile dupa ce l-a batut incurajator pe spate pe Funeriu, Silviu a decis ca a sosit timpul pentru a pune inca o data umarul la progresul programarologiei, asa ca a publicat un tratat despre functia _chkstk(). Articolul incepe in felul urmator:

A process starts with a fixed stack space. The top of a stack is pointed to by the ESP register (Extended Stack Pointer) and this is a decrementing pointer.

E ceva dubios aici, nu? Exprimarea curata, informatiile corecte, mentionarea cuvintului “registru” – toate acestea ii dau cititorului fidel un sentiment de alienare si-l fac sa verifice textul din address bar. Am intrat cumva din greseala pe o alta pagina? Nu, adresa e corecta, deci citim mai departe:

This is in contrast with the heap that can theoretically grow to a limit of 4 GB.

This is in contrast with“? Pe bune, dupa “electric power manufacture base on water“, “I’m acting into a C++ Romanian programming community” si “it depends on your’s algorithmic intellection, cleverness“? Ajuns aici am simtit nevoia sa-l intreb pe Google ce parere are despre alfabetizarea subita a lui Silviu, iar el mi-a raspuns fara sa pregete cu acest link de la codeguru. Pai ce facem Silviu? Iar copiem? Iar ne inspiram? Ce-ar fi sa punem niste camere d-alea de supraveghere si la calculatorul tau, pentru ca “rigoarea inpusă în această sesiune de examene să fie un nou început”? (“Inpusa”, mai gunoiule?)

Sigur, articolul nu e copy/paste in intregime. Putem determina unde incep contributiile originale ale minerului urmarind momentele in care fata gramaticii se intuneca brusc:

If you have an infinite recursion then you will gate same stack overflow error

I have started the study of _chkstk() function in the moment when I got few bugs with crashes with some similarly details.

I stopped to some trace function calls and I studied deeply.

Observam ca lucrarea minerului se incheie cu o lista de referinte, din care lipseste insa tocmai thread-ul de pe codeguru din care s-a inspirat. Deci:

Incheiem cu cuvintele directoarei liceului unde zice Silviu ca au copiat altii dupa el (si nu ne putem abtine sa ne intrebam cit de prosti erau aia):

Un mare filosof spunea că numai prin educaţie se poate asigura dominaţia minţii peste întuneric. Educaţia de care au avut parte atâtea generaţii care au trecut pragul acestei şcoli a însemnat colaborare, comunicare şi dialog, a asigurat elevilor libertatea să se întrebe şi să ne întrebe.

Sau, mai direct, cum cintau rapsozii aventurile lui Silviu in Piata Universitatii:

Minerul isi construieste singur cerul.
Minerul din mici lampase lucitoare isi face luna, stele, soare la fel ca si un vrajitor.
Minerul c-o mana poate s-atinga cerul
Si poate-n noapte-ntotdeauna s-aprinda stelele si luna.

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

Campionatul national de tirnacop viteza

Posted in Codare cu premeditare, Premiul n00bel on May 11th, 2011 by jos8cal

Azi in Codexpertia a avut loc Campionatul National de Tirnacop Viteza. Bineinteles nu a lipsit de la eveniment multiplul medaliat la sol, Silviu Ardelean HD nominalizat acum la sectiunea “Eu propun”.

Cum nu de mult timp a devenit somer in JAVA, el a tinut sa explice motivele pentru care tirnacopul l-a ales pe el si nu invers. Medaliat la sectiunea Un Certain Retard pentru inovatia adusa metodei aflarii numarului de bytes dintr-un fisier, premiat la sectiunea Facepalm D’or cu simularea functiei atoi() in timp patrat, Silviu a deschis prelegerea cu problema numararii bitilor 1 dintr-un numar.

Cu Silviu in mina, tirnacopul s-a pus pe treaba. Dupa o lovitura bine aplicata lui Google s-a si intrezarit raspunsul la problema minerului in link-ul 2 (ca primul link l-a luat Marius Bancila care a si apucat sa ia cuvintul inaintea lui la dezbatere, futu-i). Asa ca a copiat repede codul prin metoda clasica a schimbarii numelor de variabile si si-a deschis prelegerea cu clasicul “Eu plagiezEu propun

Eu propun o varianta mai clasica.

int counter(int nr)
{
   int i = 0;  

   while (0 != nr)
   {
    i += (nr & 1);
    nr >>= 1;
   }  

  return i;
}

Desi este o metoda clasica, ea nu e functionala si tinem sa precizam ca operatorul >> a fost inventat intr-o perioada neo-nazista, de unde probabil si tenta mai nationalista de a opera cu numere pozitive.

Ceva amuzant s-a intimplat in pauza prelegerii. Cineva a pus o intrebare care l-a facut pe Silviu sa priveasca in jur, pentru a gasi pe cineva pe care sa-l aprobe. Intrebarea a fost asta:

Intrebarea este cum apelez functia sum fara sa modific clasa A.

class A
{
   private:
      A(){};
      ~A(){};

   public:
      int sum(int a, int b){return a + b;}
};

Primul care s-a aventurat a propus un:

#define private public

moment in care Silviu a simtit cum se scutura de certitudinile vietii. Nedorind sa creada ca aceste doua cuvinte, public si privat, nu sint de fapt magico-atomice asa cum a invatat el la Hidrocentrala pe vremea cind era pasionat de apa si peste, el a pus compilatorul capra si i-a virit acest #define pe git, sa vada daca si inghite, nu doar provoaca.

Ca dupa orice finalizare, oboseala incepe sa-si spuna cuvintul si uitind ca a lasat in cod acel #define, el ne propune rezolvarea:

O varianta mai curata dar nu imaculata:

class B : public A
{
public:
   B() {}
   ~B() {}

   int sumX(int a1, int b1) {
      return sum(a1,b1);
      }
};

int main()
{
   B z;
   z.sumX(2,3);
}

Deci daca vrei sa apelezi o metoda dintr-o clasa care nu poate fi instantiata, poti “propune” compilatorului sa-i dai o clasa derivata care sa apeleze metoda clasei de baza. Poate cineva de acolo din cartile pe care le citeste Silviu ne poate ajuta cu un

#pragma eupropun

in fata manevrelor de acest gen.

Mai mult decit atit, Silviu a declarat oficial ca a fost pacalit cind a propus rezolvarea sa, deoarece Zlatomir s-a grabit sa raspunda primul si a introdus subversiv in discutie acel #define private public obligindu-l efectiv sa-l aduca cu copy/paste in codul sau. Daca nu exista acest Butterfly Effect, codul lui Silviu era bun. De fapt stai, nu codul initial linie cu linie, ci codul pe care Silviu nu l-a scris dar l-a Gindit si din pacate un mirsav i-a ghicit gindul si i-a sugerat la noi pe site EXACT la ce s-a gindit el initial, dar nu a scris. Intelegeti voi.

PS. Multumim corespondentului Felics aflat in Codexpertia pe durata CNTV.

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: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

In cautarea minerului

Posted in Regula 0 on April 6th, 2011 by Mihnea

Presupun ca ati vazut ca e la moda sa arati search string-urile cu care ajung diversi rataciti la tine pe blog. Gratie unor surse din interiorul ograzii cu experti, noi sintem si de data asta cu un pas in fata tendintelor: nu va vom arata ce cauta aia care vin la noi, ci cuvintele cheie la care raspunde blogul lui Silviu Virgula Ardelean:

 

algorithmic intellection
algoritm editare posturi
alianta impotriva enumurilor
alternative capete tirnacop
angajari secretare
animal de companie ovidiu cucu
aplaudac
ardelenii au talent
asa nu
ascunderea urmelor
asta seara ridem cu silviu
automaton
balade mineri
baterii lampas
batman si enumurile
bilete peluza programarii
birou traduceri engleza
biserici unde se leapada enumul
bitdefender disponibilizari
blog tehnica mineritului
cel mai miner dintre ardeleni
ce maninca minerii
ce urmeaza pe standup programming
ce vraji a mai facut minerul
cine-i mic si da din mina si-are patru la romana
clasament prostie
clasici in viata
clasicism in programare
CNH
coco singe instalatie
codexpert consiliu
codexpert mascota
codexpert tv episodul 2
comunist
corectaci
cu cati de i se scriu cuvintele
cum blochez haterii
cum instalez folie fumurie la tirnacop
cum invat sa fiu analfabet
cum ma lepad de enum
cum sa ai o opinie despre orice
cum sa atragi vizitatori din africa de sud
cum sa te prefaci ca stii programare
cum scapi de hateri
cum se joaca programarea pe pedepse
cum sterg poze picasa
cuvintul lui dumnezeu
dating opportunities romania india
definitie analfabetism
demagogie
despre ce e vorba standup programming
dictionar limba shakespeares
droguri munitie PNL
echivalent bula programatori
editor posturi profesionist
editura tutorialistica
efect Dunning-Kruger exemple
enumerarea ardeleana
enumul din capernaum
este pacat sa folosesti enumuri in postul pastelui
e voie sa vopsesti oua cu enum
exemple analfabeti
exemple incompetenta
exemple prostie
exemple retard avansat
expert
expert C++
expert emerit
expert STL
filme porno maximus_x
film porno programatori
firewall impotriva enumurilor
flori de mina
frustari
fustari
fustrari
ghid utilizare virgula
glume cu programatori
greseli de ortografie
hateri ma-nconjor
how stupid are romanian programmers
how to delete wordpress comments
how to edit posts
how to optimize file size
how to speak english
how to treat EEG flatline
impartasania vindeca enumul
indian dating site
inlocuire enum
instructions how to make best algorithms
international programming stars
introducere in retardare
iubitul larisei
laocoon blogosfera
lepadarea de enum
limba lui shakespeares
lucruri de evitat in programare
lumea mea
marian pop clona silviu
marius bancila nu are prieteni prosti
maximus_x supererou
metode pentru cresterea sentimentului de autoimportanta
miner
miner am fost miner sint inca
mineriada
mineriada de la pagina 5
mineriada online
miner prost
miner standup
miner taliban
minerul si marea
moarte masinilor de scris automate
mos craciun si prietenii lui
motive emigrare
motive sinucidere
mr proper wordpress
muie steaua
mvp candidates
nascut miner
netezire creier pro sau contra
noi nu ne ascundem dupa toruri
nu mersi
oameni care cred ca nu au fata de prost
oameni cu iq sub 80
oamenii mai si gresesc
oameni pe care nu ii pacalesti usor
omul cu compilator in cap
ovidiu cucu
pacatul enumerarii
paranoia
parfum cu miros de miner
parfum de galerie
pilda lui onan despre enum
piticul porno la timisoara
postac
poze cu enum
preacuviosul vector si pacatosul enum
prefer prostii pe forumuri
preziceri programare
programarea pe ghicite
programa scoala ardeleana
programator dupa ureche
programator enumuri
programatori care citesc infractoarea
programator idealist
programatori protejati unesco
programator miron cosma
programator naiv pentru lumea in care traieste
programator retardat
programe care reactioneaza la cuvinte cheie
program vaccinare sarcasm
prost
prostanac
raspundaci
rastignirea enumului
recital silviu ardelean
reeducare c++
reguli destructor virtual
retardare
retardare avantaje si dezavantaje
retardare online
retrospectiva mineriada
revista cosmpolitan
romanian brides
romanian mining industry
romanian optimization
romani celebri
romanii au talent
rugaciune enum
sfaturi contra enumului
sf gheorghe in lupta cu enumul
siemens lampase
sihastrie
silva ardelean
silviu ardelean 0 friends
silviu ardelean cautare map
silviu ardelean cv
silviu ardelean gramatica
silviu ardelean manual informatica
silviu ardelean mina
silviu ardelean pescar ratat
silviu ardelean puscarie
silviu ardelean standup programming
silviu ardelean viata si opera
silviu duce tava
silviul semantic
silviu muie steaua
sint comunist si miner
sint un retardat comunist
sisteme propulsie vagonet
site testare sarcasm
site validare tutoriale
someriada
south africa programmer dating
standup programming
steaua fara nume
studiu imunitate ironie
superprogramator
tarnacop
tendinte in retardare 2011
teorie enumuri
there is no i in team
tipuri clasice
tirnacop viteza
tuning tirnacop
tutorial editare posturi
umor programatori
un miner avea o casa
unskilled and unaware of it examples
vagonet lane departure warning
vedeta standup programming
viata dupa bitdefender
viitorul programarii
wikileaks codexpert

Coco poate confirma autenticitatea informatiilor.

Update: Coco a confirmat informatiile in post-ul ala in care tot incearca sa ne dea replica, crezind cumva ca asta ne pune pe noi intr-o lumina proasta. De asemenea a sters comentariile incomide de la respectivul post, ca vorba aia, exista sansa sa le vada noii colegi si sa rida suplimentar de el. Stai linistit Silviu, noii colegi vor ajunge la tine pe blog ca tot restul lumii, dind click pe un link de la noi, asa ca incercarile tale de a cosmetiza trecutul nu fac decit sa amuze publicul care stie deja ce scursura esti.

 

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

O noua propunere

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

Zarva mare in comunitatea expertilor, caci 0ptr iar e pus pe sotii. Dupa ce s-a lamurit cu Regula 0 a codului portabil, a revenit cu o intrebare parca special facuta pentru a-l activa pe Silviu Virgula Ardelean: cum ati implementa atoi()?

Intrebarea asta e pentru miner ca un laser pointer pentru o pisica: irezistibila. Silviu traieste pentru momentele astea, cind cineva pune o intrebare banala si el crede ca stie raspunsul, pentru ca ii permit sa-si afirme si sa-si confirme statutul de connaisseur. Cu serotonina refulind prin nas si urechi, el a atins duios tastatura si a scris cuvintele ce-i sint atit de dragi: Eu propun urmatoarea implementare.

Propunerea nu dezamageste. Prin truda afunda, ortacul scoate din abataj o noua floare de mina desavirsita, un memento al zbuciumului ce-i cuprinde fiinta de fiecare data cind se vede pus in fata unei masini de scris automate. Dat fiind ca el n-are un compilator in cap, o sa fac eu pe compilatorul si voi incerca sa descifrez linie cu linie ce se petrece in mintea greu incercata a unui miner cu 9 ani de experienta in C++.

bool isNegative = (*pChar == '-') ? true : false;

Ostilitatile incep in forta. Silviu nu are incredere in compilatoare si alte “tool-uri automate”, asa ca foloseste operatorul ? pentru a converti true la true si false la false. Asta e doar pasul 1 din planul lui. Cind va implini 10 ani de experienta in C++, isi va autoimpune sa transeze definitiv problema bool-ului prin urmatoarele tipuri de constructii:

bool a = true ? true : false;
bool b = false ? true : false;
if( ((true == a ? true : false) || (false == b ? true : false)) ? true : false)
    a = b ? true : false;

Urmeaza o prima trecere prin string, cu scopul de a verifica daca instructiunile de branch ale procesorului functioneaza corect sub stres:

while (*pChar != '\0')
{
   if ((isNegative && length == 1 && (*pChar != '-') && (*pChar < '0' || *pChar > '9')) ||
      (length > 0 && (*pChar < '0' || *pChar > '9')))
         break;

   length++;
      pChar += sizeof(char);
}

If-ul asta e reprezentativ pentru miner. In opinia lui, “loop-ul ala e un ‘strlen()’ mai special”. Da, special ca aia care baga cubul in gaura rotunda. Pe Silviu nu l-a dus capul sa incrementeze pointerul ala nenorocit daca string-ul incepe cu minus, dar el e puternic, asa ca a impins cit a putut de tare cubul si pina la urma a intrat in gaura. De asemenea, observam citeva reguli de stil bine conturate: ultima linie din bucla se indenteaza suplimentar, si se pun paranteze doar in jurul expresiilor care implica operatorul !=. length == 1 nu are nevoie de paranteze, dar *pChar != ‘-‘ are.

E important de observat si cum aduna Silviu sizeof(char) la pointer. Minerul a facut asta crezind ca e “best practice” sa fii explicit, ca nu stii cind treci la Unicode si trebuie sa aduni sizeof(wchar_t). Da, el habar n-are ce-i ala pointer arithmetic si chiar crede ca daca pChar era pointer la wchar_t, acolo trebuia sa adune mai mult de 1.

Ajungem, insa, la partea cu adevarat epica din cod, pe care o reproduc integral:

while (length > 0)
{
  decimal = 1;
  if (isNegative)
  {
     if (!isFirst)
     {
        length--;
        if (0 == length)
           break;
     }

     isFirst = true;
  }

  for (int i = 1; i < length; i++)
     decimal *= 10;

  ret_val +=   decimal * (int(*(pChar - length) - '0') % 10);
  length--;
}

Stiti cind ziceam ca ifdef-ul ala cu WIN32 e chintesenta incompetentei lui Silviu? Ei bine, bucla asta nu e la fel de concisa, dar tot e un imn al prostiei de o frumusete rar intilnita. Te astepti de la Silviu sa nu fie in stare sa faca atoi() intr-o singura trecere prin string, dar nici in cele mai umede vise nu speram sa ne ofere un asemenea festin al retardarii. Intii si intii, observam revenirea unui design pattern intilnit si in prima bucla: si asta verifica la fiecare iteratie daca a inceput. Ortacul nu e in stare sa scoata muia aia cu semnul in afara buclei, asa ca tot verifica daca bucla lui face ce fac buclele, si anume daca a reusit sa treaca la a doua iteratie.

Partea misto incepe insa dupa confirmarea abilitatii procesorului de a incrementa numere. Minerul a reusit sa faca atoi() in timp patratic. Dupa cum a mai demonstrat, el e un om simplu, deci prin definitie nu se preocupa de complexitate, dar ma surprinde iar in mod nespus de placut calculind exponentul ala in fiecare ciclu. Incercati sa va imaginati cum ar trebui sa decurga procesul deductiv prin care ajungi sa faci asa ceva. Eu n-am reusit. Voi va dati seama ca asta asa programeaza zilnic, la job? Si ca cineva ii da bani pentru ca sa scrie cod d-asta?

Ca sa incheie apoteotic, intii si-ntii mai arunca o sfidare in ochii compilatorului punind un cast explicit la int, spunindu-i parca “uite ba, iar fac eu treaba ta pentru tine”, dupa care baga un mod ca un chef care pune delicat cireasa in virful celui mai frumos tort pe care l-a facut pina acum. Pai de ce sa beneficieze doar partea booleana de verificari cu operatoru’ intrebare, si aia aritmetica nu? Ortacii programeaza defensiv, ca nu stii cind 9 se face brusc mai mare ca 10 si trebuie sa iei atitudine. De acum incolo, codul lui Silviu va fi de 3 ori mai sigur si mai conform cu standardele MISRA (despre care minerul a auzit linga automatul de cafea cind lucra la xerox la Siemens), caci aritmetica se va face in felul urmator:

pChar += sizeof(char) % 2;
int bytes = mb * (1024 % 1025);
int bits = bytes * (8 % 10);
int doi = 2 % 3;
int unu = 1 % doi;
for(int i = 0; i < size % (size + 1); ++i)

Ortacul si-a pregatit deja apararea: “nu are nimeni pretentia variantei perfecte”. Sa inceapa corecturile, deci.

LE: minerul a si dat prima replica: si-a editat al doilea post din thread si a scris ca patrujdoi sint eu, intr-o noua iesire de Poirot. Simt ca toata munca de reeducare pe care am dus-o aici tocmai s-a dus pe pula. A ajuns din nou sa creada ca eu sint jos8cal, 0ptr, patrujdoi si toti ceilalti care i-au aratat vreodata ca-i prost. Silviu se simte ca-n Matrix, el singur incojurat de o armata de eu. Pentru a doua oara intr-o singura zi s-a inundat de serotonina cind a putut face niste corecturi in codul lui patrujdoi, crezind ca ma corecteaza pe mine. Va dati seama ca a avut orgasm crezind ca m-a prins in sfirsit cu o greseala.

 

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