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

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

Inflexible special tool that could fail.

Posted in Codare cu premeditare, Premiul n00bel, Stand-up philosophy on January 16th, 2011 by jos8cal

Nu cred ca-l cunoasteti pe mesajflaviu. El este un impatimit al jocului “La Perete, La perete, Stop!”. Jocul asta este pentru el ce a fost birna pentru Nadia Comaneci, adica o rampa de lansare. Antrenamentele si meciurile oficiale se desfasoara pe codexpert.ro.

Regula jocului este simpla: mesajflaviu sta cu spatele la Programare si se uita printr-o gaura aflata in peretele cu care pare ca se stie intim. Lumea din gaura este o lume fascinanta pe care mesajflaviu o urmareste hipnotizat, dar ca orice lume fascinanta, pare o utopie.

In spatele sau, la o distanta considerabila, stau in ordinea stelelor si diplomelor, Raspundacii. Aliniati precum negustorii de la sosea care vind ceapa sau echipament rustic pentru imobile, ei ofera Raspunsuri.

Mesajflaviu se intoarce confuz din cind in cind si intreaba multimea de experti despre semnificatia a ceea ce vede prin gaura. Rolul si misiunea raspundacilor este de a inlatura ceata din ochii lui si de a-i conferi o siguranta in privire si in ziua de miine. Cind unuia dintre raspundaci i se pare ca a atins un moment cairotic, creierul da startul unei stari de bine, stare care nu poate duce decit la lucruri marete. FAQ-ul este produsul acestei stari cairotice. Odata conceput, el este aplicat pe gaura cu menirea clara de a corecta vederea celui ce priveste prin ea.

Tematica intrebarilor este Programarea in general si viata de programator in particular. Intrebari precum “Pot trimite un string prin WM_CHAR“, “Cum pot trimite un CString prin PostMessage” sau “Cum se stocheaza o variabila membru tip custom?“, au tinut cu sufletul la gura firme si birouri intregi de programatori, toti in asteptarea raspunsurilor. S-au facut pariuri si s-a dat in bobi. Cum lesne se poate intui, marele pariu era pentru momentul aparitiei starii cairotice la vreun raspundac, adica momentul unui FAQ.

Si iata ca momentul cairotic l-a lovit pe Silviu Ardelean. Again.

Se poate schimba numarul versiunii de program automat, pentru cazul cand programul isi face update?” zice mesajflaviu fara sa-si dezlipeasca ochiul de la gaura. Neintelegind intrebarea, dar totusi in posesia unui raspuns care contine cuvintele “versionare” si “program“, Silviu pune tirnacopul jos si ia atitudine PROPUNIND de la sine citire o solutie la intrebarea pusa in joc. Vazind ca MVP Ovidiu Cucu n-a inteles nimic, dar totusi a ramas profund fascinat de raspuns, Silviului i se aprinde lampasul. Pune mina pe tirnacop si il arunca in departare. Unde-si va gasi tirnacopul hodina, acolo va pune Silviu de un FAQ. Sau cu cuvintele sale:

“Subiectul cred ca se preteaza unui FAQ si cu permisunea d-voastra il voi supune curand spre aprobare.”

Din pacate si Microsoft si-a aruncat tirnacopul acum 6 ani in aceeasi directie si au pus-o si ei de acelasi FAQ. Bineinteles ca asta nu este un motiv sa nu faca si Silviu unul in care sa nu mentioneze sursa si sa PROPUNA dinsul un workaround la o problema de mult apusa:

“Manually editing of binary files version in the resource editor of Visual Studio IDE is not a viable solution.”

“We can use a special tool that does this thing for us. ”

“Unfortunately this approach is not the most flexible and could fail.”

“In order to avoid this issue and edit the version only in a single place I propose the following workaround:”

Deci sa nu folositi NICIODATA un “special tool” pentru ca nu e flexibil si oricum nu o sa mearga. S-a auzit acolo in spate, da? Am sters si eu rusinea mea de tool scris in python care face asta in 8 linii de cod. Sa-mi fie rusine pentru inflexibilitate tool-ului si pentru abordarea sortita esecului.

Bine, daca este sa fim corecti, noi stim ca Silviu se mai inspira de pe net pentru a-si gasi cuvintele, dar niciodata nu ofera sursa. Acum ceva timp s-a inspirat cu copy/paste pentru a gasi rima cuvenita intr-o oda adresata XML-ului.

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

EXTRONUA. Origins.

Posted in Codare cu premeditare, Slagare internationale, Stand-up philosophy on December 21st, 2010 by jos8cal

Cartea de care va spuneam in postul trecut este pe punctul de a avea un coautor la categoria ASP.NET. Spionii nostri la fata locului au imortalizat momentul:

 

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

Baby steps in .NET si VS2010

Posted in Codare cu premeditare, Stand-up philosophy on December 19th, 2010 by jos8cal

Long story short. O mina de oameni s-au gindit sa puna mina de la mina si sa scoata o carte despre viata de programator. Un compendiu analitic si o limba eminesciana au construit povestea a doi oameni ca noi: Popescu programator si Ion vizionar.

Cum noi stim ca o imagine face cit o mie de cuvinte, am zis sa transpunem povestea in imagini pentru o asimilare corespunzatoare.

 

 

Bonus: radioul.

Va urma…

 

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