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

Despre simularea si disimularea creierului

Posted in 112, Premiul n00bel on April 8th, 2011 by Mihnea

Motto-ul site-ului scientia.ro este “Stiinta pe intelesul tuturor”. Pe bune, chiar al tuturor? Si al astora? Si al lui Silviu Ardelean? Din ce s-o fi tragind convingerea fondatorilor ca oricine poate intelege “stiinta” – sa fie noblete, naivitate sau comunism? Sa fie oare posibil sa prezinti “stiinta” asta (orice ar fi ea) intr-un asemenea mod incit s-o poata pricepe si cea mai intunecata minte de miner?

Din fericire putem gasi raspunsul negativ la aceasta ultima intrebare pe forumul cu care este inzestrat scientia.ro, unde care cei ce se simt in target – “tuturorii”, daca-mi permiteti – ne arata ce-au inteles si dau glas intrebarilor ce le framinta starea de veghe. Sa-i dam cuvintul lui Sorin_dan84:

Salut. Am vazut de curand o stire despre computere uriase care pot simula clima de pe pamant, si alte chiestii(chiar formarea unei galaxii)…ce spuneti in cati ani credeti ca se poate simul toata viata de pe pamant?     Si de aici ideea unor regizori de filme sf., gen Matrix.

Si daca ar fi creat un simulator al Terei, plecand de la tehnologia actuala(punand in acest simulator cam toate cunostintele stintifice actuale si apoi “furand” noi descoperiri stintifice de la simulator?…..sa zicem ca in simulator 1 an=cu o secunda la noi.
Ar fi un computer cat o metropola…un oras calculator?, daca nu pun in aplicare nanotehnologia.

In caz ca n-ati inteles pentru ca inca asteptati sa se inchida paranteza aia, propunerea lui Sorin este ca cercetatorii sa simuleze niste mini-cercetatori si doar sa se uite ce mini-cerceteaza aia. Eu imi permit sa-i propun o chestie si mai simpla, pe care am vazut-o intr-un film: pentru a obtine ORICE, te apuci si faci un robot care produce acel ORICE, dar de asemenea poate calatori inapoi in timp. Nici nu termini bine de gindit cu gindul la aceasta idee, ca robotul va si aparea linga tine cu obiectul dorit, ca doar te-ai gindit sa-l faci, deci l-ai facut, deci el s-a intors in timp la tine. Nici nu mai e nevoie sa-l faci.

Simtind ca a dat peste o idee de valoare, Sorin continua:

Astept pareri de la specialisti in domeniu….sau poate am dat o idee de proiect, care ar putea fi impartasit(japonezilor sau americanilor – ca la noi e criza ) pt. accelerarea stiitei ……Multumesc.

Cine se baga la implementarea proiectului? Oportunitatile ca asta nu cresc in copaci, o singura data in viata ai sansa sa-ti dea cineva o asemenea idee (daca o ai si p-aia). Ar fi pacat sa dati cu piciorul. Nu faceti ca florin_, care s-a impotmolit in calculele unor alti “specialisti”:

Acum vre-o multi ani in urma citisem undeva ca specialistii in domeniu au venit cu cea mai acurata prezicere a cite PC-uri de pe vremea aia (cam Pentium III la 0.5-1GHz) ar fi necesare sa faca toate operatiunile pe care le face creierul uman (toate functiile si cele constiente si cele inconstiente).

Ei bine cantitatea de PC-uri necesare ar fi  asa de mare ca nu ar fi  incaput in intreg universul vizibil de azi.

Ei bine, eu as propune pur si simplu sa simulam un univers mai mare, in care sa incapa toate PC-urile necesare pentru a simula universul nostru mai mic. Nu stiu daca propunerea mea e fezabila, caci nu ma pricep la calcul polinomial cu n arbitrar:

Explicatia lor tinea de faptul ca sinapsele si retelele neuronale pot executa calcul polinomial cu n arbitrar de mare in timp linear (cu alte cuvinte retelele neuronale ar putea rezolva probleme ce necesita xn operatii intr-un timp proportional nu cu xn ci cu x1 (linear)).

Noroc ca a venit Dendros sa le deschida si mai mult orizonturile:

E doar o parere. Dar daca e adevarata afirmatia lui florin_, suntem departe de a atinge intregul potential al creierului sau poate nu-l vom atinge niciodata pe deplin, fiindca ar putea fi nelimitat, doar sa avem timp suficient.

Luati aminte, daca ai suficient timp, poti sa numeri pina la infinit si poti atinge limita potentialului nelimitat. Totusi trebuie sa recunoasteti ca omul are dreptate, participantii la discutie nu au prea multe sanse de a atinge vreodata pe deplin potentialul unui creier.

Subiectul neuronilor si al retelelor pe care acestia le formeaza apare frecvent in discutiile de pe scientia.ro. Este si normal, caci oamenii care fac diferenta nu se multumesc cu status quo-ul, ci incearca tot timpul sa obtina ceea ce n-au. tavy ne explica cum sta treaba cu translatoarele automate, aceste unelte ale diavolului ce-l sperie pe Silviu Ardelean:

Traducerile nu sunt chestiuni exacte, de multe ori sunt subiective și de multe ori nu se pot face sau dau aberații mari dacă sunt scoase din context. Din acest motiv, la traduceri se pretează mai bine rețelele neuronale în dezavantajul calculului algoritmic.

Stiu ca acum sinteti pe cale sa va inlocuiti toate calculele algoritmice cu retele neuronale, dar mai zaboviti oleaca. Inainte de a te arunca cu capul inainte in truda, e bine sa te intrebi daca meseria pe care incerci s-o practici chiar exista, asa cum face XploreDesign in thread-ul Meseria de programator – mit sau realitate:

Una dintre cele mai căutate profesii  este cea de programator. Sunt foarte multe motivele care te-ar putea determina să optezi pentru o asemenea opțiune, dar cel mai important, după părerea mea, este faptul că această profesie îți oferă o deschidere internațională

Ce coincidenta, si ing. Boata Cristian zice la fel.

Simpla cunoaștere a unui limbaj de programare, sau a unei tehnologii, nu iți poate asigura statutul de programator, mult dorit. E nevoie de mult mai mult. E nevoie de experiență, e nevoie de cunoașterea mai multor limbaje de programare sau de scripting, e nevoie de cunoașterea celor mai noi tehnologii precum și de un portofoliu consistent de lucrari care să te diferențieze de ceilalți concurenți și, un lucru foarte important, e nevoie de ”atitudine” ”pro-to-do”.

Atitudine? Protodo? Portofoliu de lucrari? Inseamna ca Silviu si-a asigurat “statutul de programator virgula mult dorit”. Unde mai pui ca are si inteligenta emotionala…

Afirmatiile provocatoare ale lui Xplorica au alimentat nesiguranta alle_csandr_ei, care n-a mai rezistat si a pus intrebarea ce statea pe buzele tuturor:

As avea si eu o intrebare cat de bine este sa fii programator? ???in comparatie cu alte meserii ma refer

Nici un post despre imbecilitate nu poate fi complet fara un citat din viorel2005, singurul om in viata a carui retardare iese in evidenta chiar si pe codexpert. Sa vedem ce are el de zis despre… pula mea, n-am inteles. Poate gasiti voi vreo legatura intre propozitiile din comunicarea sa, sau macar intre cuvintele din interiorul propozitiilor:

In prima versiune a cartii lui Charles Petzold de programare in Windows, era o propozitie despre niste “eroi necunoscuti” care au pus bazele sistemului Windows(chiar daca a fost inspirat de la Apple, totusi el este un succes comercial). Acum hardware-ul dicteaza totul si apoi software-ul. De aceea nu exista tablete Windows. Si atunci se ajunge intr-o directie managed. Legea lui Moore va limita puterea lui C++.

Cine sloboz e Moore asta, ca eu nu l-am votat?

LE: inca una repede, ca am dat de ea dupa ce am postat. Din putul gindirii numit wikipedia in romana aflam ce-i ala un “systems programmer”:

Programatorul de sistem este persoana care se ocupă de instalarea / generarea și întreținerea sistemului de operare furnizat de producătorul unui calculator pentru a-l adapta la cerințele utilizatorului. Sistemul de operare este frecvent distribuit pe un suport de date într-o formă standard, conținând un maxim de funcțiuni. Din această formă standard programatorul de sistem poate instala sau genera un sistem de operare concret, potrivit configurației hardware individuale și nevoilor utilizatorului.

Zic ca merita un loc caldut in panoplia esecurilor wikipedofile, linga articolul despre CoBra. Tu cind ti-ai generat ultima oara Windows-ul?

 

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

Stiri pe scurt

Posted in Regula 0 on March 21st, 2011 by Mihnea

Un cititor binevoitor ne-a semnalat ca referer.us e mai breaz decit anonym.to sau alte servicii similare si scoate de tot referrer-ul, asa ca am upgradat JS-ul care proceseaza link-urile spre abataj si ograda expertilor sa treaca pe la aia in caz ca nefericitul cititor nu foloseste Chrome. Cu ocazia asta m-am pus la curent cu haosul care domneste prin ce zic browserele la user agent si mi-am intarit convingerea ca web-ul trebuie sters si facut din nou.

Gardianul Ovidiu a simtit ca pozitia lui de postac al intrebarilor de interviu este amenintata de activitatea lui 0ptr si a trecut in modul smartass. Sintem convinsi ca daca chiar ar fi la un interviu si cineva l-ar pune sa implementeze atoi(), ar cere intii specificatiile complete ale functiei in 3 exemplare semnate si parafate de director si de ofiterul politic. Obisnuit din vechiul regim sa puna intrebari si sa raspunda singur la ele, el a declarat:

Cum gandesc? Gandesc pragmatic. Daca nici tu nu sti exact ce vrei, nu te astepta sa obtii de la mine exact ce vrei!

Sau, cum ar zice mai rimat protejatul sau, “noi muncim, noi nu gindim”. E demn de mentionat ca daca Ovidiu punea intrebarea si 0ptr facea pe desteptul, s-ar fi facut urgent apel la Pravila 0 si probabil la butonul de ban.

Si ca tot veni vorba de miner, iata ce a inteles el din faptul ca am facut misto de pChar += sizeof(char):

Atat amar sa fie… unii au fantezi si se gandesc sa migreze atoi() la wide-char… ca doar atoi() nu vine de la ASCII si de _wtoi() nu s-a auzit.

Lasind la o parte razboiul contra i-urilor pe care-l duc minerul si militianul pe codexpert, propun sa meditam cu totii 5 minute la uimitoarele capacitati de intelegere de care da dovada Silviu prin afirmatia asta. Srsly, the fuck.

Un prieten care a absolvit Bitdefender Bucuresti mi-a comunicat o veste soc: Silviu a parasit multinationala emblematica in decursul saptaminii ce a trecut. Aparent a gasit o firma unde departamentul de HR n-are acces la Google si a zis ca e o oportunitate pe care nu trebuie s-o rateze.

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

Haters gonna hate

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

 

 

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

Internetul, memoria si Ardeleanul

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

Azi e o zi importanta pentru Silviu Virgula Ardelean: in sfirsit a gasit un articol care explica pe intelesul sau ce-i cu pointerii si cu memoria. Surescitat de descoperirea sa, expertul ce duce-n spate nu mai putin de 9 ani de tras la saiba C++-ului si-a aruncat tirnacopul in zare, sa stie toata lumea:

A nice and simple tutorial of “C/C++ Memory Corruption and Memory Leaks”: http://bit.ly/jWwEd

Vreau sa subliniez “pe intelesul sau”. Articolul nu e in nici un caz pe intelesul oricui, ci doar al lui Silviu, asa cum discutiile intre doi boschetari beti nu-s pe intelesul oamenilor de rind. Sa spicuim:

char *oldString = "Old String";
char newStrig = strdup(oldString);
if(newString == ENOMEM) ... // Fail!!!!

...

free(newString);

Nu-i asa ca aveti un deja-vu? Cod care nu se compileaza, pentru ca “omul nu are un compilator in cap”, si pentru ca “tutorialele nu-s facute sa iei cu copy/paste din ele”? Bifat. Autor care e asa de prost incit crede ca malloc() returneaza ENOMEM cind nu mai are de unde da, dar posteaza totusi tutoriale pe net? Bifat. Utilizarea limbii lui Shakespeares pentru a ne asigura ca mesajul de pace si incompetenta este inteles si de oamenii din “India, Africa de Sud, Columbia, Rusia, etc”?

Memory allocated by copy constructors for pointer duplication. Check in destructor and delete if necessary. Memory allocated in passing class by value which invokes copy constructor.

Bifat.

Numarul de ineptii din articolul respectiv este aproximativ egal cu numarul de propozitii (doar daca socotim drept propozitii si enunturile alea fara predicat, altfel ineptiile cistiga), dar n-o sa stau acum sa fac analiza pe text. Mai interesant ar fi de aflat cum si de ce a ajuns minerul sa-si gaseasca sufletul-pereche in persoana acestui Greg Ippolito. “Cum” e simplu: a scris in google free memory tutorial si a dat pe primul link. “De ce” are legatura cu site-ul asta si cu utilizatorii sai.

Acum ceva vreme, minerul a postat un articol in care ataca spinoasa problema a convertirii numerelor in string-uri. La momentul creatiei l-am sarit pentru ca nu ni s-a parut ca ar avea suficient potential umoristic, dar un cititor fidel ne-a urecheat ca n-am semnalat faptul ca Silviu punea destructori virtuali in niste clase goale, ca un automaton constiincios ce este. Sigur pe textele invatate pe de rost de prin surse dubioase, Silviu (care, tineti minte, nu se ascunde dupa nick-uri pentru ca are singe in instalatie) a venit deghizat in Coco si a lasat urmatorul comentariu veninos:

Coco Says:
January 26th, 2011 at 4:32 pm
@thefatredguy: prima data trebuie sa scrie un FAQ special pentru tine despre destructori virtuali.

Dupa risetele ce au urmat, el si-a inmuiat intrucitva pozitia:

Coco Says:
January 26th, 2011 at 4:58 pm
Discutia cu destructor virtual / nevirtual e cu dus-intors oricum ai intoarce-o. Voie buna!

Vazind totusi ca voia buna nu inceteaza, a dat fuga la articol si a scos destructorii aia virtuali, ca nu se stie. A ramas totusi cu un ghimpe, ca n-a inteles de ce i-a scos, asa cum n-a inteles nici de ce i-a pus. Neintelegind ca e atit de prost incit nu va intelege niciodata, el a continuat sa caute raspunsuri sub forma de tutoriale si asa a dat peste Greg.

Un om de calibrul lui Silviu, care isi recunoaste greselile, nu putea dormi noaptea fara a scorni o justificare pentru faptul ca orice spune se dovedeste a fi gresit. El e un suflet nobil si mare, care vede dincolo de corecturi. Atita timp cit Adevarul iese la iveala, pe Silviu nu-l intereseaza cum se ajunge la asta. Cum ne-a obisnuit, minerul iar da cu tirnacopul in peretele gresit, crezind ca noi ne luam de el pentru ca isi corecteaza post-urile, asa ca ma voi preface ca incerc sa-l indrept pe calea cea buna, inainte sa-si darime abatajul in cap.

Nu, draga Silviule. Noi nu ridem de tine pentru ca iti corectezi scrierile, ci pentru ca trebuie s-o faci. Tot ce scrii este gresit si tu nu vrei sa vezi in asta un semn al incompetentei colosale care-ti caracterizeaza existenta. Post-urile tale ar trebui sa-i avertizeze pe cititori sa nu ia nimic de bun pina nu apare articolul corespunzator la noi pe site. Daca vrei, facem noi plug-in-uri de wordpress si phpbb care afiseaza un disclaimer in ce postezi si adauga automat link-ul catre noi in momentul in care publicam corecturile. Visez la ziua in care vei putea imprumuta de la cineva un sfert de creier si vei putea vedea ironia faptului ca ai invatat despre pointeri, constructori si destructori de la un idiot ca tine, care nu stie despre ce vorbeste, dar totusi vorbeste. Tu, in prostia ta, ai preluat prostia lui si o dai mai departe altora. Daca Fibonacci ar fi trait azi, i-ar fi dat pulii de iepuri si ar fi studiat pe tine rata de crestere a prostiei pe internet.

Sigur, incercarile acestea de a-l face pe Silviu un ortac mai bun sint nascute moarte. Un intelept ne-a lasat mai demult pe failbook urmatorul mesaj, ce ilustreaza cu mare concizie si absoluta precizie imposibilitatea comunicarii cu minerul-programator:

Cand Silviu-Marius Ardelean greseste si incerci sa ii spui, sunt trei variante:

1. Faci misto si nu se prinde;
2. Ii spui discret si nu intelege;
3. Ii spui direct si nu te crede.

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

Cel mai iubit dintre Arhitecti

Posted in Regula 0, Stand-up philosophy on February 28th, 2011 by jos8cal

Asociatia pentru o lume mai buna a anuntat recent un master class la care pe post de Dumnezeu va fi un Dumnezeu care a pus umarul la inventarea cosorului pentru impletit cod. Educator si pedagog, el va fi pret de o saptamina ca un doctor care va sta la capatiiul arhitectului bolnav si va astepta pina acesta se va face bine, adica se va ridica pe picioarele lui!

Toti arhitectii vor merge acolo pentru reeducare! Adica sa invete o meserie din care sa se hraneasca pe sine si ulterior familiile lor. Cu ajutorul unui instrument ingenios, vor invata sa faca impreuna lucruri folositoare pentru oameni si pentru programatori in special. Caci meseria este bratara de aur! Si anume, vor invata sa impleteasca cod in general.

In ingeniozitatea lui, programatorul isi impleteste codul folosind briceagul, care ii permite mai apoi sa-si ievaluieze productivitatea la hectar de cod scris. Dar pentru asta, cineva s-a gindit cu capul lui sa vina in ajutorul programatorului si a inventat un instrument mai ingenios decit briceagul. Asa a aparut Cosorul.

Cosorul este format din doua parti: partea lemn-oasa si partea fer-oasa, iar pentru a invata sa-l minuiti corespunzator aveti nevoie de 2750 de euroi fara TVA. Spor la impletit!

Mai jos redam o bucata din editia precedenta a master class-ului care a avut loc la Slanic:

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

XCode

Posted in Slagare internationale on February 17th, 2011 by Mihnea

Steve Jobs are cancer la pancreas deoarece o multime de programatori au vrut sa-si bage pulile in ficatul lui si unii din ei au nimerit pe linga. Probabil Steve nu e direct de vina pentru faptul ca XCode este un puroi revoltator, dar oftica e mult mai spornica atunci cind o poti canaliza in directia unei persoane si Steve e usor de nimerit in pozitia fruntasa in care s-a postat. Cancerul nu este total nejustificat insa, caci rolul de Führer al Nationalsozialistische Hipsterisch Arbeiterpartei ii confera lui Steve dreptul de a-i spinzura cu coarde de pian pe cei care au adus pe lume abominatia; faptul ca el nu-si exercita acest drept este o insulta la adresa intregii omeniri de la Charles Babbage incoace.

Pentru a intelege cum a putut lua nastere XCode, acest abject esec al spiritului uman, trebuie sa examinam intii contextul in care a fost construit el. Vom vedea ca soarta lui a fost pecetluita inca inainte de a se scrie prima linie de cod, dar ca maimutele care au lucrat la el nu s-au multumit sa mosteneasca imbecilitatile platformei pe care cladeau, ci au dus stafeta prostiei pe noi culmi.

Contextul lui XCode este OS X. In Finder (echivalentul hipsteristic al lui Windows Explorer, pentru neinitiati), tasta pentru a deschide un fisier selectat nu este Enter, ci Cmd+O. Enter face rename. Articolul asta s-ar putea incheia aici. Evident n-o sa se incheie, dar macar discutiile din magazinele Apple intre clientii potentiali si vinzatori ar trebui sa se sfirseasca in acest mod.

– Cum fac rename la un fisier?
– Apesi Enter.
– Muie.

Este clar de ce cred Apple ca au facut asta cu Cmd+O: pentru consistenta. In alte programe, “Open” este Cmd+O, deci sa fie si in Finder. Motivul real pentru care au facut asta este la fel de clar: pentru ca sint retardati. Pentru rename cu enter nici macar nu exista un motiv inchipuit, exista doar retardarea.

Fanboii vor spune ca asta cu tastele e doar o preconceptie a cuiva care vine dintr-un alt mediu. Pentru ei am exemplul redimensionarii. In OS X, ferestrele se pot redimensiona doar din coltul din dreapta-jos. Daca ai un geam in dreapta ecranului si vrei sa-l faci mai lat, intii trebuie sa-l tragi mai la stinga, dupa care sa-l maresti. In general n-o sa stii cit de mare vrei sa-l faci, deci n-o sa-l tragi suficient de mult in stinga si n-o sa ai loc sa-l faci cit de mare vrei, asa ca o sa-l mai tragi un pic, si o sa-l mai maresti un pic. Aparent, un test cu un focus grup a relevat faptul ca utilizatorii sufera un atac de panica daca ii lasi sa redimensioneze geamurile din orice colt. Eu cred ca de fapt testul a relevat surprinzatoarea implicatie ca daca faci focus grupuri cu retardati, ajungi la concluzii retardate.

In Biblia UI-ului Apple, unde regasim porunca asta cu strictetea redimensionarii, putem citi si citeva reguli de bun simt. Una din ele e sa nu-ti faci alfabetul tau din pictograme, pentru ca in general oamenii stiu deja un alfabet. Pictogramele trebuie folosite pentru grupat vizual chestiile similare, nu pentru a inlocui textul. Exceptie fac pictogramele pe care le pricepe orice om, gen sagetile, dar si alea trebuie folosite cu mare grija. In aroganta lor, Apple isi dau derogare de la regula asta si pentru mazgalelile de pe tastele lor speciale, caci daca nu vrei sa inveti ca semnul de puscarie e tasta de linga spatiu, nu meriti Lumina lui Steve. Scrie in pula mea “Alt+Cmd+Enter”, nu “juma’ de zvastica puscarie inapoi”, ca nu vreau sa invat ideograme hipsteristice doar ca sa pot sa joc Finder din taste. De asemenea, tastaturile Apple au ergonomia unei mine antipersonal, deci daca vrei sa-ti mai poti misca miinile dupa o zi de interactionat cu un Mac trebuie sa-ti iei o tastatura de oameni, care n-o sa aiba simbolurile cultului Apple pe tastele speciale si n-o sa poti sa te uiti sub degete sa vezi pe ce cacat de buton vrea sa apesi. Pentru avansati avem si o intrebare bonus: cum se numesc cele trei taste din poza urmatoare? Indiciu 1: nici macar pe tastaturile Apple nu sint. Indiciu 2: da, sint 3, muia aia din stinga care abia se vede asa apare in dialogurile de configurare.

Problemele astea sint minore, dar le-am mentionat pentru a putea zugravi o mentalitate. Apple cred ca orice iese din mina lor este perfectiunea intruchipata si o binecuvintare pentru intreaga suflare a planetei, asa ca vor tine cu dintii de orice idee, chiar daca se dovedeste a fi o imbecilitate. Mai mult, daca intrebi cum poti face o chestie care nu se poate face, nu-ti vor spune “nu se poate, sintem retardati”, ci vor incerca sa-ti explice ca de fapt nu vrei sa faci chestia aia. Nu vei putea redimensiona niciodata geamurile ca oamenii, din orice colt, pentru ca Apple stiu mai bine decit tine ca nu vrei sa faci asta, asa cum au stiut timp de 20 de ani ca mouse-ul trebuie sa aiba un singur buton. Heil Apple.

De la mentalitatea asta ajungem la problema editarii textului, care il afecteaza direct pe XCode. Prin 1986, IBM s-au prins ca oamenii folosesc tastatura pentru a scrie text si ca ar fi frumos daca ar pune pe ea niste butoane pentru chestii uzuale cum ar fi mers la inceputul rindului, la sfirsitul lui, o pagina in sus sau una in jos. Apple nu au fost de acord. Cine cacat vrea un buton de home? De la balconul Geamiei Perfectiunii si Adevarului Suprem, muezinii Apple le-au tot repetat credinciosilor: mouse-ul are un buton si n-aveti nevoie de home, end sau function keys. Pina la urma fatwa-ul impotriva butoanelor a fost ridicat si o vreme tastaturile Apple au avut butoane de home si end, dar tocmai a fost reinstituit, si ultimele instrumente de torturat degete marca Steve iar au pierdut butoanele astea eretice. Oricum, nici cind le aveau nu mergeau, pentru ca in dorinta lor de a fi altfel, Apple le-au pus sa te duca la inceputul si sfirsitul documentului, dar fara sa mute cursorul, ca asta sigur e o chestie care-ti trebuie foarte des (mult mai des decit sa duci cursorul la inceputul liniei). De asemenea, page up si page down muta doar view-ul, nu si cursorul, alta chestie teribil de utila (mai ales cind ai scroll wheel la mouse, o inventie recenta in lumea Apple, ce-i drept).

In concluzie, viteza cu care poti edita text in XCode l-ar face pe Gutenberg sa se sufoce de ris. Risul lui Gutenberg poate duce la cancer la pancreas pentru Steve prin mecanismul descris in introducere, avind in vedere ca programatorii tind sa-si petreaca majoritatea timpului scriind text. Sigur, te poti duce la inceputul rindului apasind Ctrl+A, ca pe vremea lui VT100, sau Cmd+Stinga, dar Apple n-au auzit nici macar de smart home, un feature care e in toate editoarele de text din ultimii 20 de ani. Ctrl+A si Cmd+Stinga te duc intotdeauna la prima coloana, nu schimba intre primul caracter din rind si prima coloana, ca la oameni. Au si Alt+Page Up / Alt+Page Down, care muta si cursorul (normal, doua taste pentru functia uzuala si una singura pentru aia inutila). Daca te simti aventuros poti chiar sa-ti redefinesti tastele ca-n jocuri si sa pui home sa faca home, doar ca sa-ti amplifici frustrarea in momentul in care trebuie sa faci ceva la calculatorul altcuiva. Cu putina vointa poti sa-ti cresti productivitatea pina undeva la nivelul lui notepad din Windows, moment in care intervin feature-urile avansate, alea care ne arata ca XCode stie ca nu-i un editor de text chior, ci un editor de cod.

XCode are code completion. Tasta cu care il activezi este Escape. Asta e si mai tare decit rename cu Enter. Escape, in pula mea. Bine, ca in practica nu conteaza, deoarece parserul de C++ e cam la nivelul pe care l-ai obtine daca i-ai cere celui mai prost student din grupa sa-ti faca un parser de C++ dupa ce a mers mahmur la prima ora a unui curs in care se mentioneaza tangential programele “flex” si “bison”. Code completion-ul intelege functii, metode si uneori nume de variabile, dar cam atit. Daca ii arati un template intra in fibrilatie. Totusi, in rarele ocazii cind incepi sa scrii numele unei functii si i se pare ca stie ce vrei sa scrii, iti sugereaza functia, cu tot cu parametrii sai:

Daca dai enter sa accepti sugestia, selecteaza definitia primului parametru, astfel incit s-o poti suprascrie cu ce vrei sa pasezi acolo. Urmatoarele defintii nu se mai selecteaza automat, deci trebuie sa le stergi de mina. Daca nu le stergi, ramin acolo in program si poti chiar sa salvezi textul in halul ala:

Daca te uiti in fisier dupa ce-l salvezi, observi urmatoarea aberatie:

int main()
{
    test(5, <#float y#>)
    return 0;
}

Ineficienta in editarea textului ar fi o problema daca ai putea sa ajungi la fisiere ca sa le editezi, ceea ce in general nu e cazul. Un nou focus grup compus din retardati i-a ajutat pe Apple sa decida ca schimbatul intre ferestre din taste este o alta mare sursa de confuzie pentru utilizatori. In OS X, tasta cu care schimbi intre geamurile aceleiasi aplicatii ia ferestrele la rind in ordinea in care au fost create, nu schimba ordinea in functie de ultima accesare, cum face Ctrl+Tab in Windows. Daca ai 10 fisiere deschise dar umbli in momentul de fata in doua, nu poti cicla intre ele cu o tasta. Daca apesi Cmd+`, vei trece de fiecare data prin toate cele 10 surse, plus celelate geamuri ale lui XCode care or mai fi deschise. Daca nu-ti convine asta, exista un mod in care toate sursele se deschid in acelasi geam, dar atunci nu poti sa ciclezi intre ele in nici un fel din taste. In cel mai bun caz iti pui o tasta care deschide dropdown-ul cu lista de fisiere active, dupa care il alegi cu sagetile p-ala pe care il vrei. Daca intrebi un fanboi Apple ce-i cu retardarea asta, iti va spune ori ca nu-i bine sa ai atitea fisiere deschise in acelasi timp, ori ca exista o tasta pentru schimbat intre doua fisiere .h si .cpp cu acelasi nume si e gresit sa vrei sa ciclezi intre doua fisiere care nu respecta regula asta. In orice caz, Apple stiu mai bine decit tine ce vrei sa programezi si cum.

Presupunind ca nu te deranjeaza sa tot duci mina de pe tastatura pe mouse ca sa schimbi intre ferestre de parca ai avea OCD si ti s-ar parea ca mouse-ul nu-i niciodata unde trebuie, tot vei avea o problema: ce geam sa alegi? XCode e un program saritor, care stie ca e bine sa-ti deschida acelasi fisier in cit mai multe geamuri de-odata. Recordul meu e de 5 geamuri diferite cu acelasi fisier, si l-am obtinut in felul urmator:

  1. Click pe fisier in lista din geamul principal al proiectului, se deschide in geamul ala.
  2. Dublu click pe fisier, vine si un geam separat cu el.
  3. Fa-l sa contina o eroare de compilare, da-i build. Da click pe iconu’ cu eroarea, vine un geam cu build status care va contine si el fisierul.
  4. Da find in files dupa ceva din fisierul ala. Click pe rezultat. Ai ghicit.
  5. Pune un breakpoint in fisier, deschide debugger-ul (care e un geam separat, dintr-un motiv ce-mi scapa) si fa-l sa se opreasca in breakpoint. Da, acum il ai si-n debugger.

Sint convins ca se poate depasi recordul, dar mi-e lene acum sa mai caut cacaturi prin meniuri. Mai interesant este sa ne aplecam un pic asupra debugger-ului, daca tot l-am mentionat. Fiind o companie care incearca din rasputeri sa fie altfel decit tot restul lumii doar de dragul de a fi altfel, era de asteptat ca Apple sa copieze ce fac altii fix in locurile in care nu trebuie. In speta, XCode trateaza problema debuggingului in acelasi mod retardat in care o abordeaza toate pocnitorile de IDE-uri facute pe genunchi in baie de adolescenti cuprinsi de febra Linux si open source: vorbeste cu GDB printr-un pipe. Prin viu grai. Ceva de genul write(gdb_pipe[0], “Draga gdb, poti te rog sa pui un breakpoint?”). Ca si in pocnitorile open source, schimbul de amabilitati se incheie abrupt cind gdb nu intelege sonetul expediat prin pipe, de exemplu atunci cind incerci sa faci step in printf().

Desi cu gdb se pot face multe lucruri, XCode e pe undeva pe la nivelul lui Borland C++ 1.0 ca feature-uri expuse. Tastele de step into/over nu merg in disassembly daca dai sa vezi combinat source cu disassembly. Nu exista set next statement (exista o consola unde poti vorbi direct cu gdb, insa, daca te simti poet). Exista un fel de edit & continue, dar merge doar pe programe didactice si oricum e destul de limitat fara set next statement. Daca ai un breakpoint si inserezi linii deasupra lui, uneori nu se muta mai jos, astfel incit sa ramina la codul la care era, ci ramine la linia lui, adica ti se va opri la alt cod. Daca ai un program mai complicat decit hello world, uneori se plictiseste de facut debug la el dupa citeva rulari, si nu se mai opreste in nici un breakpoint pina nu restartezi sistemul. Lista poate continua, dar cred ca s-a inteles cit de impecabil e debugger-ul. Probabil ca daca-i arati problemele unui fanboi, iti va spune sa scrii cod fara buguri, ca sa n-ai nevoie de debugger.

Totusi, ca sa ai la ce sa faci debug, trebuie sa poti intii sa-ti compilezi proiectul. Apple au vazut la Visual Studio manevra cu platforme, configuratii, Debug, Release, cacat, dar n-au inteles nimic. La ei nu poti avea doua target-uri cu configuratii diferite in acelasi proiect. Cretinatatea acestui fapt mi se pare colosala, caci nu-mi dau seama cit de retardat trebuie sa fii ca sa concepi sistemul in acest mod, mai ales cind exista alte IDE-uri care s-au lovit de aceeasi problema si au rezolvat-o deja. Raspunsul la intrebarea retorica este ca Apple au concluzionat ca configuratiile sint ca widget-ul de redimensionat geamuri: prea multe optiuni, prea mare confuzia in focus grup. Iar au stiut mai bine ca tine.

Sa presupunem ca facem doua plug-in-uri pentru doua aplicatii 3rd party. Fiecare plug-in suporta o serie de versiuni ale aplicatiei sale, si pentru fiecare versiune vom avea doua configuratii, Debug si Release. Primul plugin va avea Debug2008, Release2008, Debug2009, Release2009 etc. iar al doilea va avea Debug8.0, Release 8.0, Debug 9.0, Release 9.0 etc. Acum surpriza: facem si un lib cu care linkeaza ambele. Deoarece dezvoltarea lib-ului se intimpla concomitent cu dezvoltarea plug-in-urilor, vrem sa includem proiectul lib-ului in ambele solutii, ca asa ne-am obisnuit din Visual Studio, unde ai voie sa-ti setezi proiectele cum vrei tu, nu cum vrea Steve. Mai mult, lib-ul nu depinde de aplicatia-host, deci va avea doar doua configuratii: Debug si Release.

In primul rind, XCode nu are conceptul de proiect impartit intre doua solutii. Poti ori sa faci un proiect separat cu lib-ul si sa stai cu ambele proiecte deschise si sa dai build de mina in ambele cind schimbi ceva, ori sa faci proiectul lib-ului de doua ori, o data in fiecare proiect de plugin, cu toate fisierele si setarile si muile. Daca alegi metoda asta, vei remarca ca trebuie sa-i faci lib-ului aceleasi configuratii pe care le are plug-in-ul, pentru ca XCode nu vrea sa vada disensiuni intre target-urile aceluiasi proiect. Daca nici asta nu te convinge, o sa te rezolve faptul ca uneori oricum nu linkeaza cum trebuie, ca desi pui dependinte si cacaturi pe-acolo, nu se prinde tot timpul ca trebuie sa linkeze din nou plug-in-ul pentru ca s-a schimbat lib-ul.

Sistemul de muire a programatorilor din XCode are multiple nivele de fallback. Daca nu reuseste sa va futa cu cacaturile astea legate de configuratii si target-uri, tot va gasi un mod in care sa se asigure ca nu-l puteti folosi in nimic mai mare de hello world. De exemplu, daca va trece prin cap sa aveti un lib care se cheama altfel intre configuratii diferite (cacat_debug.lib si cacat_release.lib, sa zicem) si sa-l puneti ca dependinta la alt target din proiect, simpaticul XCode ii va trece numele curent in setarile de link ale target-ului care depinde de el. Cind schimbati configuratia activa, se schimba si numele ala, la linia corespunzatoare in fisierul cu proiectul. Daca dai commit asa si dupa aia da update un nefericit care are alta configuratie activa decit aveai tu, o sa iasa un conflict. Ca bonus, cind il rulezi in command line ca sa faci un batch build, nu-i in stare sa calculeze numele lib-ului asa cum o face cind e in GUI mode, asa ca o sa incerce sa-ti linkeze target-ul cu ce a ramas scris acolo ultima data cind ai inchis GUI-ul. Si in final, daca nici in cazuri d-astea nu va prinde, uneori se decide sa mute random chestii prin fisierul de proiect desi tu nu schimbi nimic cu mina ta, ca sa o puna totusi de un conflict cind dai urmatorul update.

XCode vine si cu o serie de unelte ajutatoare de o calitate la fel de suprema ca el. Preferatul meu este muismul ala de facut installere. Apple au decretat ca nu vor sa vada installere pentru aplicatii, ceea ce e un lucru bun (la ei aplicatiile vin ca niste arhive din care tragi fisierele afara si gata). Totusi, in unele cazuri chiar trebuie sa faci un installer, si atunci ai la dispozitie PackageMaker, cel mai bugos program pe care l-am vazut vreodata. Pe linga faptul ca periodic iti fute proiectul pentru ca asa i s-a sculat, si ca setarea proiectului in sine este un demers sisific, cel mai tare feature al acestui program mi se pare ca isi tine proiectul in format XML, dar XML-ul e tot pe o singura linie. Daca deschizi un proiect de installer, ii dai build si dai sa-l inchizi, iti va spune ca s-a schimbat. Daca faci timpenia sa-i zici sa salveze, in multe cazuri iti va distruge proiectul. Daca incerci sa dai un diff sa vezi ce-a facut, nu vei avea prea mare spor, fiind totul pe o linie. Noroc ca-i XML, acest format care poate fi citit si de oameni, si de masini, si de Silviu Ardelean.

Observ ca s-a facut tirziu si ca m-am intins un pic. As mai avea chestii de zis, dar ma voi screme inspre retorica finala. Inteleg ca pe Steve il doare la pancreas despre XCode si suferinta pe care o provoaca el programatorilor fortati sa faca aplicatii pe OS X. Nu inteleg totusi cum se face ca muistii care lucreaza la gunoiul asta nu au fost inca linsati de colegii lor, care trebuie sa-l foloseasca. Daca eu as fi programator pe plantatia de meri si as sti ca in cladire cu mine traiesc si defeca cod infectii care au abatut asupra mea cel mai rau intentionat IDE din istorie, s-ar lasa cu singe. Aia de la Apple ori au un IDE secret pe care-l folosesc in-house, ori isi cirpesc propriile solutii cu vim, emacs sau alte editoare preistorice (ceea ce nu e neaparat mai bine), ori spalarea pe creier aplicata personal de Steve fiecarui nou angajat chiar are randament 100%.

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

Optimizing QuickSort and staff

Posted in Premiul n00bel, Slagare internationale, Stand-up philosophy on February 3rd, 2011 by jos8cal

Frunzaream recent revista celor de la codexpert.ro. Cum ce revista? Pai si-au lansat revista! E scrisa de un bot. In fine!

Evenimentul lansarii a fost unul sters, ca sa nu mai zic de lipsa totala a fundamentului ideologic. Dat fiind ca sintem familiari cu curentul codexpertian, ne-am zis sa incropim noi doua trei rinduri despre necesitatea si misiunea acestui ziar in lume, si nu numai. Asadar:

Pentru noi, cei care am supravietuit prigoanei, raspunderea pentru idealurile miscarii codexpertiste este atit de mare incit de multe ori simtim ca este o povara care ne copleseste si, daca n-ar fi legatura tainica cu C++-ul, poate demult s-ar fi stins nadejdea in sufletele noastre.

Profesorii Ardelean, Cucu si Bancila ne-au invatat sa gindim. Dupa cum Capitanul Bjarne a despartit hotarele lumii vechi de lumea noua, cei trei au despartit lumea formelor sterpe de lumea cugetarii realiste.

Dar cugetatorii si-au sacrificat darul mintii pentru adincul omenesc.

De cind au luat la cunostinta de C++, limbaj atit de apropiat de conceptia lor de viata, nu s-au putut desparti de drumul lui. Si si-au inceput viata intr-o apoteoza de neinchipuita frumusete morala. Ziarul trebuie sa pastreze nealterat spiritul miscarii si sa-l exprime in linia de cugetare a celor trei.

Un ziar de lupta si de idei, dar fara verbalism si entuziasm usor!
Fiecare cuvint trebuie sa se nasca din adincurile sufletului si sa fie insotit de intreaga raspundere a celui care il scrie.

“Ziarul Codexpert” este o batalie si pornim la ea cu aceeasi incredere in Victorie!

Acum ca avem si sprijinul ideologic, putem porni la drum sa ne scaldam printre titlurile care ne sint supuse atentiei in ziar.

Gasim o optimizare de quicksort. Gasim la autor si justificarea ideologica pentru batutul din taste:

“The idea for doing this is that instead of each new recursion copying the same code and using up more memory, it reuses the same code.”

Deja vu. Zbucium. Silviu Ardelean nu este un om, este o modalitate de a vedea lumea.

Ridicam bezmetici capul si privim codul in ochi. 10 numere sint torturate si fortate sa se alinieze de la mic la mare, in numele unei noi ideologii optime, acest pleonasm minier. Luam codul si-l virim sub nas, linie cu linie. Tragem incet si simtim cum ne ia cu ameteala. Trebuie sa gasim o modalitate de a salva numerele din mina ideologiei mirsave! Pregatim siringa pe care sta scris Array.sort() si batem incet vena. Milioane de numere ne trec prin fata ochilor. Eminescu. Truda. Pierdem vena. Intepam de 10 ori si ne intindem pe spate cu ochii tintiti la tavan. Senzatia de timp dispare. Ceasul numara de la kilometrul zero, over and over:

Optimized QuickSort: 00:00:01.2692034
Array sort: 00:00:01.1664805
Optimized QuickSort: 00:00:01.2490031
Array sort: 00:00:01.1632019
Optimized QuickSort: 00:00:01.2463744
Array sort: 00:00:01.1634480
Optimized QuickSort: 00:00:01.2695249
Array sort: 00:00:01.1568251
Optimized QuickSort: 00:00:01.2440373
Array sort: 00:00:01.2517662
Optimized QuickSort: 00:00:01.2694608
Array sort: 00:00:01.1581570
Optimized QuickSort: 00:00:01.2646042
Array sort: 00:00:01.1657108
Optimized QuickSort: 00:00:01.2499172
Array sort: 00:00:01.1557011
Optimized QuickSort: 00:00:01.2406120
Array sort: 00:00:01.1544470
Optimized QuickSort: 00:00:01.2434693
Array sort: 00:00:01.1576033

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

Antisilviul

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

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

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

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

Maiastrul Silviu: Ce intelegi tu prin const int?

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

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

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

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

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

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

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

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