A patra corectura

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

12 Responses to “A patra corectura”

  1. brigata cu dex-u-n dinti Says:

    corecteaza “inca odata: mici scapari” cu “inca o data: mici scapari”. e vorba de o enumerare (o data, de doua ori) si se scrie despartiti. :P

  2. Mihnea Says:

    Am corectat, mersi. Sper ca acum isi va putea justifica minerul toate dezacordurile, i-urile lipsa si virgulele intre subiect si predicat prin aceasta greseala a mea.

  3. brigata cu dex-u-n dinti Says:

    oricum nu se prindea, ca lui nu ii plac enumerarile. :-)

  4. jos8cal Says:

    :)

  5. Zahir Says:

    You bad pipl listen to me: you bad pipl leev Silviu alon. He good man, you bad man. He teach pipl how to program, you say ugly thing of him.
    I poor student in Bangladesh. My English not good, I can’t read MSDN. My English bad, only good for Silviu blog.
    Bangladesh poor, pipl has slow Computer, I need Fast File Size! Slow File Size no good.
    I need learn find File size fast, not much code. His code better, no open file, nu close handle. Yunow, Me lazy.

  6. DarkByte Says:

    Ba baieti, ce naiba ? N-a mai facut omu’ (a se citi “THE Man”) nimic demn de a fi mentionat ?

    Ma plictisesc asteptand … :D

  7. Bezna Says:

    http://bezna-zorilor.com/wordpress/?p=521

  8. Mihnea Says:

    Iata ca Silviu are o omoloaga in lumea filosofiei de budoar. WordPress a bagat comentariul de deasupra la spam, dar eu l-am adus inapoi ca sa se poata scalda tot omul in Bezna Zorilor, aceasta metafora cu iz de huila ce nu ne lasa sa uitam ca unii incearca sa Aiba O Parere chiar si acolo, sub pamint. Din eseul la care duce link-ul de mai sus mie mi-a placut urmatorul pasaj:

    “Experienta ne-a invatat pe toti ca perfectiunea, indiferent asupra carei entitati alegem sa o aplicam, e mai mult o iluzie dacat un dat.”

    Toti neexperimentatii care iau perfectiunea drept un dat si nu se feresc sa imbrace nimicul in constatari pompoase sint rugati sa purceada in directia beznei zorilor pentru doza zilnica de epistemologie. Experimentatii pot accede direct la nivelul urmator, procurindu-si singuri revista Cool Girl de pe unde pot.

  9. thefatredguy Says:

    Hmm, n-a mai iesit nimic din mina in ultima vreme. Pacat.

  10. Tomis Says:

    Da-i timp. Minerul este precum destinul – inevitabil. Meanwhile, undeva in Romania:

    class NuConteazaNumele
    {
    … maculatura

    bool setProperty(const QString& propertyName, const QVariant& propertyValue);
    bool setProperty(const QString& propertyName, const QString* propertyValue);
    // … inca 10 de supraincarcari ale functiei unde variaza al doilea parametru


    }

    Hai sa vedem ce este deasupra acestei clase.

    struct ItemProperty
    {
    static QString Type;
    static QString Rgba;
    // … etc, multe din astea
    };

    In .cpp avem, desigur, urmatoarele:

    QString ItemProperty::Type = “type”;
    QString ItemProperty::Rgba = “rgba”;
    // … etc, multe din alea

    Cand am incercat sa-i spun autorului ca arhitectura este urata si ca ar trebui sa foloseasca enum el a constracarat cu “ba e frumos si imi permite sa scriu setProperty(ItemProperty::Type, “…”), imi afiseaza intellisense ce contine ItemProperty cu patru puncte, lucru pe care nu-l pot face cu un enum”. N-am mai zis nimic pentru ca el e superiorul si persoana care se presupune ca stie mai multe si mai bine decat mine.

    Fast forward vreo luna cand incerc sa folosesc setProperty si vad ca vrea parametru un string si sa ma ia naiba daca stiu ce sa pasez asa ca trebuie sa ma apuc de sapat in surse ca minerul sa dau peste ce argument vrea functia asta magica. Asadar spuneti-mi voi – chiar credeti ca Silviu, Ardelean este unic?

  11. Mihnea Says:

    N-am sustinut vreodata ca-i unic, doar ca-i reprezentativ pentru o clasa de retardare – sau “emblematic”, cum ii place lui sa spuna.

    Tipul ala de “design” cu string-uri se intilneste peste tot prin Softimage|XSI. La ei scuza a fost si mai tare decit “se vede in intellisense”: cica asa pastreaza compatibilitatea binara intre XSI si plug-in-uri de la o versiune la alta. Dar ma rog, aia sint canadieni, deci tot un fel de mineri.

  12. Tomis Says:

    pese – daca as da copy/paste la ce grozavie am avut de corectat la bool Item::operator == (const Item & other) si la alte functii ai zice ca te uiti la Blair witch project noaptea in miezul padurii. Exemplu extrem de cosmetizat (a se remarca avantajele folosirii unui string in loc de enum, metoda care iti permite sa eviti switch-urile alea neelegante) :

    if(property == ItemProperty::Type)
    {
    // … do “staff”
    return; // return-uri puse de mine intrucat autorul (defensive programming expert din cate se pare) se gandise ca poate sistemul de operare schimba valoarea variabilei si nu strica sa testezi pana la capat
    }

    if(property == ItemProperty::Rgba)
    {
    // …
    return;
    }

    // ….. inca zece if-uri cu sub-if-uri ad infinitum

    Dau bine nea Gogule?

Leave a Reply

Optionally add an image (JPEG only)