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

Deja vu

Posted in Codare cu premeditare, Premiul n00bel on January 28th, 2011 by Mihnea

Vazindu-se din nou trasi in poze pe site-ul nostru, expertii au dat fuga la butonul de edit si au incercat sa-si corecteze “micile scapari“. Din fericire insa, doar Marius a reusit. Repetind performanta din saga dimensiunii fisierelor, Silviu ne prezinta varianta imbunatatita a tehnologiei indexarii array-urilor:

const int rows = 10, cols = 12;
unsigned char* bmp1 = new unsigned char[cols * rows];

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

delete [] bmp1;
bmp1 = NULL;

Nu, Silviu-Marius. Nici asa nu e bine. Apreciem faptul ca ai inversat for-urile intre ele, ca sa nu para ca ai copiat de la Marius, dar tot n-ai reusit sa iei un numar dintr-un array. Hai sa vedem daca poti sa-ti depasesti recordul anterior de 4 corecturi.

Oricum, in urma acestui esec plenar, in comunitatea expertilor au inceput sa se puna intrebari. Vazind faptul ca personaje ca viorel2005 si mesajflaviu ii tot pun in dificultate cu probleme de clasa a 5-a, unii experti au inceput sa se intrebe daca nu cumva respectivii sintem noi. Mai tineti minte cind expertii erau convinsi ca jos8cal si cu mine sintem aceeasi persoana? In curind vor ajunge sa se banuiasca si intre ei.

Edit: 1 minut. Atit i-a trebuit minerului pentru a-si curata trecutul. La 1 minut dupa ce am postat “corectura”, si-a sters de tot codul. Urmele prostiei sale se pastreaza doar in reply-ul lui viorel2005 de pe pagina urmatoare, care a inglobat aberatia minerului in aberatia proprie, dar din pacate cind a dat el quote era varianta cu “coloum”, nu asta extinsa. Nu-i nimic Silviu, noi stim, si tu stii ca noi stim, la fel cum stii ca poza din articolul asta e o reprezentare destul de fidela a modului in care-ti petreci 3 sferturi din zi.

Tags: , , , , , ,

Aventuri 2D in Valea Jiului

Posted in 112, Premiul n00bel on January 27th, 2011 by Mihnea

Dupa cum ne-a obisnuit deja, minerul nu se lasa cu una, cu doua cind spune o timpenie. El continua sa loveasca problema iar si iar, pina aceasta recunoaste ca a ascuns droguri, armament, munitie si masini de scris automate la peneteu, caci cu totii stim ca perseverenta e mama mineritului. Dupa ce i-a explicat lui viorel2005 cum sa reduca numarul de apeluri catre o functie facind parametrii sai variabile globale, a atacat chestiunea de fond, si anume o tehnologie pe care el a descoperit-o cu multi ani in urma: cum sa tii o matrice 2D intr-un array 1D. Daca va amintiti, aceasta problema a mai framintat ograda expertilor, deci clar e o chestie importanta, care ar merita FAQ-ul sau. Oricum, Silviu explica cu cuvintele lui tehnologia in cauza:

Edit: imi cer scuze, din greseala scrisesem corect “column” in subtitrari.

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

Cum sa nu trimiti un parametru catre o functie

Posted in 112, Premiul n00bel on January 26th, 2011 by Mihnea

Intrebat cum se poate trimite un array 2D unei functii care vrea un array 1D, Silviu Ardelean propune urmatoarea solutie:

Viorel, daca tot vrei sa folosesti bmp1, de ce nu-l folosesti ca membru al unei clase sau membru global (daca nu lucrezi OOP)? Atunci in functia ta de afisare il apelezi direct fara a-l mai pasa la functie.

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

A treia corectura

Posted in Regula 0 on November 24th, 2010 by Mihnea

Gata. Third time’s a charm, and “staff”. “unsigned long” s-a facut “long long” in codul minerului. Tineti minte: asta a fost ideea lui de la inceput, doar a zis si-n comentariu (pe care l-a si editat, ca nu i-a placut cum zisese “unsigned”). In nici un caz n-a facut modificarile astea pentru ca i-am aratat noi ca e prost. De fapt, ce modificari? Asa a fost codul de la inceput.

In momentul de fata, sentimentele mele fata de miner sint amestecate. Pe de-o parte, sint surprins si dezamagit ca dupa atitea mui pe care si le-a luat aici, inca mai scrie pe blog-ul ala. Incapatinarea lui este fenomenala, chiar si pentru un cretin ca el care crede ca poseda “inteligenta emotionala”. Ar putea macar sa verifice banalitatile pe care le posteaza, dar cred ca-i atit de incompetent ca nu-si da seama cum.

Pe de alta parte, sint satisfacut. Desi si-a editat toate timpeniile avind grija sa nu lase urme sau atribuind corecturile diversilor “Sorini” pe care i-a gasit prin preajma, el stie cine i-a zis, si eu stiu. Chiar si dupa ce gogoritele vor disparea din cache-ul lui Google, chiar si cind va pretinde pe blog-ul de atitudine ca noi mintim aici, chiar si cind va cenzura asiduu adresa acestui blog din screenshot-urile sale, chiar si dupa ce toata lumea va trece mai departe, noi doi – el si cu mine – vom sti cum a fost de fapt. Haterii au avut dreptate iar el a recunoscut asta fata de el si fata de noi scriind pina la urma codul dupa dictare. Toata “inteligenta emotionala” si pseudopsihologia din lume nu vor putea schimba adevarul asta pe care noi il impartasim, si asta e tot ce conteaza. Cind el va privi in ochii mei si eu voi scuipa intre ai lui, vom sti.

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

Prima corectura

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

Dupa cum preziceam in post-ul anterior, Silviu “Virgula” Ardelean si-a modificat pe furis codul la scurt timp dupa ce l-am vorbit de bine pe-aci. Din pacate pentru el, in loc sa-si intrebe prietenii cum se face de fapt (dupa cum i-am sugerat), el a incercat sa ne arate ca poate si singur, ajungind la urmatoarea varianta:

long GetFileSize(const TCHAR *szFilePath)
{
   long nSize = -1;

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

   return nSize;
}

Problema e ca nici asa nu e bine. Acum foloseste _wstat64() si pe 32 de biti, dar degeaba, ca pune rezultatul intr-un long, unde nu incape. A scapat de macro-ul ala penibil care arata ca dupa 8 ani de Visual Studio nu stie cum sa detecteze platforma, dar functia tot e limitata la 2 GB pe 32 de biti.

In timpul ce s-a scurs de la postarea originala, colegu’ jos8cal mi-a aratat ca de fapt dilema nu-i una noua, asa cum credeam eu. Lampasul lui Silviu a mai poposit si in urma cu un an pe spinoasa problema a dimensiunii fisierelor. Atunci avea inca blog cu ceas si sigla lu’ Steaua pe el, deci a avut nevoie de un alt canal prin care sa-si impartaseasca descoperirea cu restul expertilor in C++. Si cum nu-i loc mai bun pentru discutii intre experti decit insasi Comunitatea Expertilor C++, a pus-o de un FAQ la ei. Acum tot va ajunge la vorba mea, ca pentru a corecta post-ul ala fara sa scrie “edited by miner” va trebui sa apeleze la prietenii lui MVP-ei si fondatori de comunitati, cum l-am sfatuit sa faca de la inceput. Poate cu ocazia asta reuseste sa scrie si codul cum trebuie.

Tags: , , , , ,

Portretul expertului la 30 de ani

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

Dupa ce a excavat problemele incrementarii si interschimbarii variabilelor, Silviu “Virgula” Ardelean a tras o flegma strasnica in palma, a pus mina pe tirnacop si a lovit din nou in programare. Gaura ce s-a cascat cind virful uneltei a interactionat cu realitatea i-a aratat o lume cu totul noua, pe care n-o mai intilnise pina atunci in cariera sa: lumea fisierelor.

La capatul a 9 ani de succese si progres continuu, Silviu a fost nevoit pentru prima data sa afle dimensiunea unui fisier. Un perfectionist ca el are datoria morala de a utiliza numai solutii optime, dar sa nu credeti ca atunci cind le descopera, le tine doar pentru el. Nu. Silviu este in primul rind un Invatator, o persoana care nu s-ar da inapoi de la nimic pentru a se asigura ca si ceilalti programatori care au nevoie sa incrementeze variabile sau sa afle cit de mari sint fisierele stiu cum se face asta optim. Si cine stie, poate intr-o zi, daca scrie suficiente articole d-astea de indrumare, va primi si el o diploma d-aia de Invatator Microsoft cum au prietenii lui (link-ul duce la Wikipedia deoarece momentan pagina oficiala a Invatatorilor nu merge, probabil intr-un gest de solidaritate cu Ronua, care fiind site-ul unora care fac site-uri, merge cam 2 zile pe saptamina).

Pilda de azi poarta titlul File size fast detection si a fost inscrisa in ceaslovul tehnic al marelui formator de programatori. In textul sau se vorbeste despre multitudinea de optiuni prin care un programator putin naiv (naiv pentru lumea in care traim), asa cum a fost si Silviu odata, ar putea sa-i puna calculatorului intrebari despre “una din cele mai importante proprietati” ale unui fisier: dimensiunea sa. Inarmat cu legendara sa inteligenta, Silviu isi croieste drum prin acest adevarat hatis de functii, si ajunge la urmatorul cod:

long GetFileSize(const TCHAR *szFilePath)
{
   long nSize = -1;

#ifdef WIN32
   struct _stat buf;
   nSize  =  (_wstat( szFilePath, &buf ) == 0) ?
      buf.st_size : -1;
   if (S_ISDIR(buf.st_mode)) nSize = -1;
#else
   struct __stat64 buf;
   nSize  = (_wstat64( szFilePath, &buf ) == 0) ?
      buf.st_size : -1;
   if (S_ISDIR(buf.st_mode)) nSize = -1;
#endif

   return nSize;
}

Haideti sa incercam sa deslusim impreuna vorbele duhovnicului-ortac, ca si cum am fi la un codecamp. In primul rind, el ne spune ca:

there are a lot of API that allows finding this property, but major needs additional file operations: open file, find file size and close file.

Asa ceva nu-i acceptabil. Daca maiorul are nevoie sa deschida fisierul, minerul va cauta o alternativa. Si tot cautind el, a dat peste _wstat(), care nu are aceleasi nevoi ca perversul maior, deci e “fast”. Dat fiind gradul avansat de analfabetism pe care-l manifesta indrumatorul nostru, e greu de spus la ce s-a referit exact cind a spus “fast”. Probabil se gindea la timpul de executie, un subiect drag inimii lui, caz in care ma declar profund dezamagit de faptul ca tocmai el, un cititor autoproclamat al surselor STL-ului (in care e expert de 9 ani, sa fie clar), n-a citit sursele CRT-ului, acest Vechi Testament al programarii. Ca si in adevaratul Vechi Testament, unde Doamne-Doamne bea in fiecare dimineata laptic plus dupa care isi scoate evreii la un meci de ultra-violenta cu restul Creatiei, CRT-ul ne dezvaluie ororile lui _wstat(), care isi petrece o buna bucata din zi extragind si procesind date care n-au nici o legatura cu dimensiunea fisierului. Fast indeed.

Sigur, dupa cum ne-am invatat deja, Silviu nu greseste niciodata, motiv pentru care ii este si foarte usor sa-si recunoasca greselile cind e cazul. Riposta lui la defaimarea din paragraful anterior va fi ca prin “fast” vroia sa spuna “putin de scris”, deci e “fast” de dezvoltat aceasta functie de o importanta capitala, pe care trebuie s-o dezvolti de sute de ori pe zi cind ai 9 ani de experienta in C++. O solutie care sa foloseasca FindFirstFile() ar incetini dramatic viteza cu care Silviu zboara prin cod la multinationale, pentru ca ar avea o intreaga linie in plus pentru inchisul handle-ului.

Totusi, partea cu adevarat savuroasa din codul asta nu e cit de “fast” sau “nefast” e apelul la _wstat(), ci #ifdef-ul ala cu WIN32. Uitati-va bine la el, caci cu greu se poate gasi un exemplu mai concis al incompetentei minerului. In primul rind, e vorba de incompetenta la nivel practic: Silviu habar n-are ca macro-ul ala e definit implicit prin setarile proiectului si in configuratiile de 64 de biti, deci partea a doua n-o sa se compileze niciodata (eventual doar pe platforme diferite de Windows, care din pacate n-au _wstat64() deloc). El se va apara spunind ca “n-are un compilator in cap”, cum a mai facut-o. Intr-adevar, este un efort supraomenesc ca inainte sa postezi niste gunoi pe internet, sa incerci sa-l compilezi ca sa vezi daca merge, sau sa te uiti in MSDN la cum se diferentiaza build-urile de 64 de biti de alea de 32.

Si mai misto decit necunoasterea acestor lucruri practice de catre un expert cu 9 ani de multinationalism in spate este logica gresita care a stat la baza testului aluia cu #ifdef. In capul minerului, functia _wstat64() este inseparabila de un OS pe 64 de biti. Daca ai OS pe 32 de biti, dimensiunea fisierelor se tine pe 32 de biti. Daca e pe 64, se tine pe 64. Este imposibil, inuman si imoral sa ai un fisier mai mare de 2 GB pe un OS de 32 de biti (macar daca returna un tip unsigned, sa aiba limita la 4 GB, dar nu s-a putut). Un asemenea fisier i-ar provoca lehamite lui Silviu si l-ar determina sa scrie un post despre el pe blog-ul de atitudine, sub tag-ul “demagogie“.

Minerul e abonat la blog-ul nostru si timpul sau de reactie este de ordinul minutelor. Deindata ce va citi ce-am scris aici, expertul isi va folosi cunostintele acumulate cu sirg in aia 9 ani pentru a intreba in stinga si-n dreapta cum sa corecteze timpenia pe care a scris-o. Dupa ce va repara codul de pe blog (uitind sa mentioneze cine i-a pus iar vagonetul deraiat inapoi pe sina, cum a mai facut), va corecta si in softul la care lucreaza pentru Bitdefender, unde probabil ca tocmai a scris abominatia aia. Imediat dupa aia o sa dam mail la Bitdefender sa le cerem bani pentru training-ul pe care il facem de citeva luni bune cu programatorul lor “senior”, expert in C++, STL, CRT si Visual Studio si – speram cu totii – viitor MVP.

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

Omul nu este o insula

Posted in Codare cu premeditare, Premiul n00bel on October 28th, 2010 by jos8cal

Agrafa are dreptate. Omul are nevoie de dragoste, de intelegere si de iubire pentru a putea face ceva cu viata lui, pentru a lasa ceva in urma lui. Pentru ca a face ceva in viata e bine, iar a nu face e rau.

Acum vreo 20 de ani vizionare precum Melinda French sau Karen Fries (un fel de Aurora Liiceanu si Alice Nastase) au decis sa lupte impotriva singuratatii in secolul vitezei. Dinsele au inteles ca a sta 12 ore in fata calculatorului este efemer daca nu iti apare din cind in cind o agrafa pe ecran care sa-ti bage maxime si sa-ti asculte opintelile. Dar cum natura umana impinge la dezmat si abuz, oamenii au voit mai mult de la agrafa. Asa ca s-a infiintat Agentia de Asistenti responsabili cu asistarea deciziilor din viata ta. Agrafa, Vrajitorul Merlin, spiritul din sticla, Peedy papagalul, delfinul Kairu si ciinele care iti aduce fisiere cind dai Find File.

Cu timpul insa agentii au fost inlocuiti de chiar Om. Facebook, Twitter, mIRC sau Forumuri sint toate Agentii cu Asistenti in care Omul mascat in Agrafa ofera suport Omului mascat in Om. Inevitabil Microsoft a fost fortat sa puna pe libera Agentia de Asistenti odata cu Windows 7. RIP Agrafa.

Un astfel de Om Mascat in Agrafa (OMA) este, dupa cum probabil ati intuit deja, si Silviu Ardelean. Datul este simplu. Un om intreaba ceva pe un forum. OMA Silviu isi face aparitia zimbind dintr-o poza distanta sub care stau enumerate 4 stele, simbolul calitatii. Dupa cum stiti discutia cu o Agrafa nu se termina niciodata. Te tot intreaba chestii, tu tot dai Next ca nu esti multumit si dupa citeva pagini de Next o inchizi nervos si ii dai Disable din Options. Asa e si cu OMA Silviu. Doar ca forumurile in care dinsul s-a aciuat nu au suport pentru disabled on sight pe userul lui.

Asa, deci omul ala pune o intrebare total retardata si baga urmatoarea eroare de compilare pe codul asta:

error C2440: ‘=’ : cannot convert from ‘int’ to ‘enum DrawShape’

Si vine raspunsul OMA Silviu:

Nu am timp sa fac un proiect si sa-ti testez codul, dar tin sa cred ca obtii eroarea la linia CDrawTool::c_drawShape = m_nToolTemp;

Wow. Avind o singura linie de cod in care se face o atribuire Agrafa a reusit sa se prinda DIN PRIMA fara compilator pe care linie este eroarea. Si ca orice Agrafa nu-si uita menirea: sa ofere solutii:

In rezolvarea problemei, eu as renunta la acest tip enumerare si as folosi tipuri clasice, un vector, structura, etc.

Recomandare luata parca dintr-un tablou de Botticelli. Cu o singura tusa OMA Silviu a reusit sa redea culoare unui thread monocromatic.  El foloseste structuri in loc de enum-uri. Deci asta era secretul lui.

Scoala Ardeleana este adepta clasicismului. Si vocea parca ii este grava si apasata de bruma anilor in care si-a sedimentat cunostintele:

E o eroare clasica… nu poti atribui runtime noi valori unei variabile enumerare.

Dupa ce Marius Bancila a indraznit sa arate ca se poate si a oferit o solutie practica pe codul ala si anume un cicat de cast la int, au sarit Agrafele ca arse, una ca nu se poate, alta ca nu e etic. Deci da: Options->Preferences->OMA Silviu Agent->Disabled.

Intr-un alt thread un alt maximal se intreaba cum sa implementeze o metoda c_str() pe o clasa String, metoda care te duce cu gindul la c_str() din std::string. In ciuda faptului ca are 8 ani de cind se joaca MFC pe nivel expert, OMA Silviu nu stie despre CString ca-si schimba parul in functie de ce caracter set ai setat la proiect. Recunoaste intr-un final ca e prost si habar n-are ce vorbeste si baga urmatoarea maxima:

My bad, se compileaza, dar de fapt nu face ce se asteapta omul sa faca (adica sa copiezi un sir de caractere, chiar daca aloci memorie ptr asta)

Din nou, in cei 9 ani de STL pe nivel expert el crede ca lumea cind vede un c_str() se asteapta sa se intimple o copiere de memorie. Si ca si suport practic pentru retardarea asta ne ofera un sample de gindire Ardeleana, care inca nu m-am prins ce trebuie sa evidentieze in afara de mintea lui bolnava:

Dupa 2 pagini de discutii intre Agrafe despre cum sa faci un return _ptr, Silviu si-a schimbat pozitia si a oferit implementarea lui c_str():

char* c_str() const { return str.c_str(); }

N-a reusit sa-l faca const din prima (desi el citeste sursele STL inca de pe vremea iteratorilor), dar noroc cu varul Cucu care s-a facut ca vede un “typing error” acolo in loc de “retard error”.

Tags: , , , , , , , , ,