<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.studentclub.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Ovidiu Platon</title><link>http://weblogs.studentclub.ro/ovidiupl/default.aspx</link><description>&lt;strong&gt;The Big Picture&lt;/strong&gt;&lt;br&gt;&lt;em&gt;&amp;quot;I don't care if it works on your machine! We are not shipping your machine!&amp;quot;&lt;/em&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Debug Build: 61120.2)</generator><item><title>S-a-nchis</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/09/10/s-a-nchis.aspx</link><pubDate>Mon, 10 Sep 2007 03:55:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:16502</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/16502.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=16502</wfw:commentRss><description>Era evident de ceva vreme, așa că o spun în mod oficial: weblogs.studentclub.ro/ovidiupl se închide. Pentru probleme de serviciu, va apărea în curând un blog al echipei din care fac parte, CLR Code Generation team (adică JIT + NGen) pe blogs.msdn.com. Pentru chestiuni tehnice în general, ca și pentru alte halucinații, există http://ovidiupl.spaces.live.com, pe care puteți găsi deocamdată poze din cele mai recente excursii prin munți și, ocazional, fișiere partajate și alte asemenea; pe viitor e posibil să apară și lucruri mai concrete și mai utile.&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=16502" width="1" height="1"&gt;</description></item><item><title>Malware Removal Starter Kit</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/07/12/malware-removal-starter-kit.aspx</link><pubDate>Thu, 12 Jul 2007 20:58:36 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:16091</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/16091.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=16091</wfw:commentRss><description>&lt;p&gt;N-am știut până acum, dar pe &lt;a href="http://www.microsoft.com/TechNet/"&gt;TechNet&lt;/a&gt; există un catalog destul de amplu numit &lt;a href="http://www.microsoft.com/technet/solutionaccelerators/default.mspx"&gt;Solution Accelerators&lt;/a&gt;, destinat administratorilor de sistem. Sunt acolo tot felul de ghiduri cu rețete pentru îndeplinit rapid&amp;nbsp;tot felul de sarcini.&lt;/p&gt; &lt;p&gt;Acum câteva zile, a fost publicat &lt;a href="http://www.microsoft.com/technet/security/guidance/disasterrecovery/malware/default.mspx"&gt;Malware Removal Starter Kit&lt;/a&gt;. Starter kitul în sine este un simplu document Word, cu informații despre malware în general, despre cum trebuie să arate un plan de răspuns pentru urgențe, despre cum arată simptomele unei infecții cu malware șamd.&lt;/p&gt; &lt;p&gt;De departe, însă, partea cea mai interesantă a documentului este secțiunea despre pregătirea unui kit pentru scanare offline.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;După cum bine știți (sau sper că știți), un sistem de operare infectat cu malware nu se poate curăța de unul singur. Motivul este simplu: Un rootkit bine scris care se încarcă în nucleul sistemului de operare se poate ascunde rezonabil de bine de orice scanner. În general, chiar dacă scannerele devin din ce în ce mai inteligente, nici rootkiturile nu stau pe loc, și are loc o cursă a înarmărilor, în care uneori scannerele câștigă, uneori nu.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;În general, dacă reinstalarea sistemului de operare pe o maşină infectată nu este o opţiune, soluția este scanarea offline a sistemului infectat. Cu alte cuvinte, putem folosi o mașină curată pentru a scana hard-diskurile sistemului infectat, sau putem boota un alt sistem de operare pe aceeași mașină.&lt;/p&gt; &lt;p&gt;Una peste alta, &lt;a href="http://www.microsoft.com/technet/security/guidance/disasterrecovery/malware/default.mspx"&gt;Malware Removal Starter Kit&lt;/a&gt; conține instrucțiuni detaliate pentru crearea unui CD bootabil de Windows, pe care pot fi instalate utilitare de scanare pentru viruși și spyware, sau alte utilitare de uz general (printre exemplele menționate în documentație se numără avast! Virus Cleaner, McAfee AVERT Stinger, Microsoft Malicious Software Removal Tool și Spybot - Search &amp;amp; Destroy, dar teoretic pot fi instalate și altele).&lt;/p&gt; &lt;p&gt;În concluzie, dacă aveți nevoie din când în când să scanați câte o mașină suspectă, aveți acum la dispoziție un set simplu de scule. Instrucțiuni de folosire aveți la &lt;a title="http://www.microsoft.com/technet/security/guidance/disasterrecovery/malware/default.mspx" href="http://www.microsoft.com/technet/security/guidance/disasterrecovery/malware/default.mspx"&gt;http://www.microsoft.com/technet/security/guidance/disasterrecovery/malware/default.mspx&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Flash+Update" rel="tag"&gt;Flash Update&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Security" rel="tag"&gt;Security&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=16091" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Flash+Update/default.aspx">Flash Update</category><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Security/default.aspx">Security</category></item><item><title>Pinky wagging</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/07/04/pinky-wagging.aspx</link><pubDate>Wed, 04 Jul 2007 00:17:01 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:16006</guid><dc:creator>ovidiupl</dc:creator><slash:comments>5</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/16006.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=16006</wfw:commentRss><description>&lt;p&gt;Ultima dată când am fost prin România, statisticile rutiere erau sinistre. Poate ar fi utilă și pe acolo o campanie de genul ăsta:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.youtube.com/watch?v=5hWxU_ICoHM" href="http://www.youtube.com/watch?v=5hWxU_ICoHM"&gt;http://www.youtube.com/watch?v=5hWxU_ICoHM&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(Dacă mai e nevoie de explicații: &lt;a title="http://www.msnbc.msn.com/id/19569900/site/newsweek/" href="http://www.msnbc.msn.com/id/19569900/site/newsweek/"&gt;http://www.msnbc.msn.com/id/19569900/site/newsweek/&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=16006" width="1" height="1"&gt;</description></item><item><title>"Defense in depth"</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/03/22/defense-in-depth.aspx</link><pubDate>Thu, 22 Mar 2007 18:09:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14849</guid><dc:creator>ovidiupl</dc:creator><slash:comments>6</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14849.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14849</wfw:commentRss><description>&lt;p&gt;Ieri am fost la o prezentare de securitate (un fel de quick refresher). Când am ajuns la secțiunea de SQL Injection, ne-a fost prezentat exemplul clasic de injection, care folosea " '&amp;nbsp;OR 2 &amp;gt; 1 --&amp;nbsp;". La un moment dat, instructorul întreabă "de ce am folosit 2 &amp;gt; 1?".&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Pentru că expresia e întotdeauna adevărată și «orice» OR TRUE = TRUE etc"&lt;/p&gt;
&lt;p&gt;"Bine, bine, dar de ce nu am folosit OR 1 = 1 așa cum vedeți în toate exemplele de pe net?"&lt;/p&gt;
&lt;p&gt;"... ?!?"&lt;/p&gt;
&lt;p&gt;"Pentru că în prezent, mai toate sistemele de intrusion detection caută în mod explicit în șirurile care le ajung pe mână după 1=1. Vă vine să credeți cât de imbecili pot fi?"&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nu-mi vine să cred, dar sunt sigur că e adevărat. Peticirea problemei acolo unde se manifestă în loc de rezolvarea problemei reale e un sport deosebit de util pentru securitatea jobului. Nu și pentru securitatea codului, dar cel puțin e genul de lucru care te ține ocupat cu săptămânile.&lt;/p&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Security" rel="tag"&gt;Security&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/WTF" rel="tag"&gt;WTF&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/SQL+Injection" rel="tag"&gt;SQL Injection&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14849" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Security/default.aspx">Security</category><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/WTF/default.aspx">WTF</category><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/SQL+Injection/default.aspx">SQL Injection</category></item><item><title>Mandatory Integrity Control în Windows Vista</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/03/22/mandatory-integrity-control-n-windows-vista.aspx</link><pubDate>Thu, 22 Mar 2007 06:00:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14840</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14840.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14840</wfw:commentRss><description>&lt;p&gt;Zilele astea am încercat să îmi aduc puţin la zi cunoştinţele despre securitatea aplicaţiilor. Unul din conceptele pe care am ajuns să-mi arunc ochii este funcţionalitatea MIC din Vista.&lt;/p&gt; &lt;p&gt;Încă de la prima versiune, securitatea din Windows NT s-a bazat în mare măsură pe Discretionary Access Control, care probabil este familiar multora - fiecare obiect din Windows are un ACL (Access Control List) alcătuit din mai multe intrări ACE (Access Control Entry).&lt;/p&gt; &lt;p&gt;Fără a intra în prea multe detalii despre DAC, una din limitările fundamentale ale modelului este că toate procesele aparţinând aceluiaşi utilizator au drepturi egale asupra obiectelor utilizatorului. Cu alte cuvinte, chiar dacă folosesc un Windows dintr-un cont de utilizator normal (fără nici un fel de privilegii suplimentare şi fără a aparţine de alt grup în afară de Users), toate aplicaţiile pe care le folosesc au acces egal la fişierele mele (chiar dacă ele nu pot afecta în nici un fel restul sistemului).&lt;/p&gt; &lt;p&gt;În Windows Vista, Mandatory Integrity Control oferă posibilitatea de a separa aplicaţiile şi fişierele folosite de acelaşi utilizator pe niveluri de integritate. Există mai multe modele teoretice care descriu acest gen de funcţionalitate. Două din cele mai simple sunt:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Modelul Bell-LaPadula (inventat în 1973 pentru Pentagon şi numit şi "modelul militar") rezolvă problema confidenţialităţii datelor, în sensul că fiecare "document" are un nivel de integritate (de exemplu "Top Secret", "Classified", "Unclassified" şi "Public"), iar fiecare entitate are la rândul său un nivel de acces.&lt;br&gt;În modelul Bell-LaPadula, entităţile &lt;b&gt;nu pot citi în sus&lt;/b&gt; (un angajat cu drept de acces la documente publice nu va putea citi documente "Top Secret") şi &lt;b&gt;nu pot scrie în jos&lt;/b&gt; (un angajat "top secret" nu va crea documente pentru ochii publicului).&lt;br&gt;Atenţie, documentul nu interzice entităţilor să citească în jos (un angajat "top secret" poate citi orice) şi să scrie în sus (un angajat cu acces la nivelul "classified" poate crea documente "top secret"... Dar ar fi bine să le scrie ca lumea din prima, pentru că nu va avea cum să le mai citească).  &lt;/li&gt;&lt;li&gt;Modelul Biba (1977) se ocupă de integritatea datelor. În acest model, entităţile &lt;b&gt;nu pot scrie în sus&lt;/b&gt; şi &lt;b&gt;nu pot citi în jos&lt;/b&gt;. Cu alte cuvinte, dacă în modelul Bell-LaPadula, datele importante nu se puteau "scurge în jos", în modelul Biba, datele contaminate nu se pot propaga în sus. E bine de reţinut că în modelul Biba, entităţile pot citi în sus şi pot scrie în jos.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Implementarea din Windows Vista nu e nici una, nici alta. Mai exact, este cam jumătate din modelul Biba, jumătate din modelul Bell-LaPadula şi încă ceva, în sensul că există patru niveluri de integritate (Low, Medium, High şi System), iar obiectele sunt &lt;a href="http://msdn2.microsoft.com/en-us/library/aa965848.aspx"&gt;etichetate&lt;/a&gt; cu nivelul de integritate la care se află şi cu politica de acces la care vor fi supuse entităţile care doresc acces.&lt;/p&gt; &lt;p&gt;În versiunea curentă, cele trei politici disponibile sunt SYSTEM_MANDATORY_LABEL_NO_WRITE_UP (o entitate aflată la un nivel scăzut nu poate modifica obiecte aflate la un nivel mai înalt), SYSTEM_MANDATORY_LABEL_NO_READ_UP (o entitate nu poate citi obiecte aflate la un nivel mai înalt) şi SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP (o entitate nu poate executa cod aflat la un nivel mai înalt). Etichetarea se face cu ajutorul funcţiei &lt;a href="http://msdn2.microsoft.com/en-us/library/aa965464.aspx"&gt;AddMandatoryAce&lt;/a&gt;, iar dacă un obiect nu are o etichetă, se consideră implicit că se află la nivelul Medium.&lt;/p&gt; &lt;p&gt;La logon, utilizatorul primeşte la rândul lui o etichetă (Medium), iar toate aplicaţiile pe care le porneşte rulează implicit la acest nivel. Când UAC este activat, procesele elevate vor rula la nivelul High, iar Internet Explorer va fi Low (atunci când opţiunea de a rula în "Protected Mode" este activă în IE; atât UAC, cât şi Internet Explorer Protected Mode pot fi dezactivate). Serviciile critice sistemului de operare rulează ca System.&lt;/p&gt; &lt;p&gt;Nu am idee care au fost constrângerile care au condus la acest design, dar dacă ar fi să speculez puţin, aş spune că a contat foarte mult uşurinţa în utilizare a sistemului. Evident, aplicarea ambelor modele de care am discutat fără a face sistemul practic inutilizabil este imposibilă (dacă nici o entitate nu poate scrie/citi, nici în sus, nici în jos, ajungem practic de unde am plecat, sau mai rău).&lt;/p&gt; &lt;p&gt;Alegerea unei singure metode ar fi însemnat că utilizatorii ar&amp;nbsp;fi beneficiat fie doar de integritatea datelor, fie doar de confidenţialitatea lor, dar nu de ambele facilităţi. Şi aşa, hibridul aparent ciudat din Windows Vista capătă sens, pentru că modelul oferă posibilitatea de a proteja date cu nivel ridicat de integritate în faţa operaţiilor neautorizate de scriere/citire/execuţie din partea entităţilor cu nivel mai scăzut.&lt;/p&gt; &lt;p&gt;Sigur, modelul conţine şi un element de risc, în sensul că operaţiile de citire "în jos" nu sunt împiedicate în nici un fel (cel puţin din câte mi-am dat eu seama de prin documentaţie). Probabil că totuşi este mai bine aşa, pentru că ar fi fost cel puţin ciudat (din punctul de vedere al unui utilizator) ca o aplicaţie rulând ca Medium să nu poată citi un document descărcat de pe internet şi salvat cu eticheta Low.&lt;/p&gt; &lt;p&gt;Important este însă că o aplicaţie aflată la un nivel scăzut nu poate ajunge la&amp;nbsp;obiecte aflate mai sus pe cont propriu. E nevoie de o altă aplicaţie (lansată explicit de utilizator sau de altă componentă din sistem) care să preia date "de jos" pentru ca acele date să fie procesate la un nivel mai ridicat.&lt;/p&gt; &lt;p&gt;Privit în izolare, MIC nu e nici pe departe extraordinar ca măsură de securitate. La o privire de ansamblu, însă, integrarea cu UAC, cu interfaţa vizuală (prin User Interface Privilege Isolation), plus bateria de măsuri defensive care înconjoară aplicaţiile fac din Windows Vista un sistem mult mai robust în comparaţie cu versiunile anterioare.&lt;/p&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Vista" rel="tag"&gt;Vista&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Security" rel="tag"&gt;Security&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14840" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Vista/default.aspx">Vista</category><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Security/default.aspx">Security</category></item><item><title>Codul fiscal</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/03/05/codul-fiscal.aspx</link><pubDate>Mon, 05 Mar 2007 03:22:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14694</guid><dc:creator>ovidiupl</dc:creator><slash:comments>2</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14694.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14694</wfw:commentRss><description>&lt;P&gt;Dacă nu ştiaţi, în SUA este în plină desfăşurare sezonul taxelor. An de an, contribuabilul american munceşte cu asiduitate la adunări şi scăderi, deduceri şi procente, termenul limită pentru depunerea declaraţiei de venit fiind de obicei 15 aprilie (anul ăsta cred că e 16 aprilie, 15 pică într-o duminică).&lt;/P&gt;
&lt;P&gt;Pe parcursul acestui proces complex, Publicaţia 17 (&lt;A href="http://www.irs.gov/publications/p17/index.html"&gt;HTML&lt;/A&gt;, &lt;A href="http://www.irs.gov/pub/irs-pdf/p17.pdf"&gt;PDF&lt;/A&gt;) reprezintă o deosebit de utilă lumină călăuzitoare.&amp;nbsp;Extrem de interesant în această publicaţie este capitolul 12, "Alte venituri". La pagina 85, aflăm următoarele:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Bribes.&lt;/STRONG&gt; If you receive a bribe, include it in your income.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;Până aici, nimic neobişnuit. Oamenii guvernului nu sunt spectaculos de inteligenţi nicăieri în lume, nu m-ar surprinde să-şi pună veniturile colaterale pe declaraţia de venit. Lucrurile devin interesante câteva paragrafe mai jos, la pagina 87:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P dir=ltr&gt;&lt;STRONG&gt;Illegal income.&lt;/STRONG&gt; Illegal income, such as money from dealing illegal drugs, must be included in your income on Form 1040, line 21, or on Schedule C or Schedule C-EZ (Form 1040) if from your self-employment activity.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;Dacă n-aţi înţeles, vă explic eu. Dacă vindeţi&amp;nbsp;dulciuri la colţul străzii "pe persoană fizică", trebuie să declaraţi veniturile pe linia 21 a formularului 1040. Dacă prestaţi această activitate ca liber profesionist, trebuie să ataşaţi şi Schedule C sau Schedule C-EZ şi să declaraţi acolo veniturile. Şi asta nu e tot. La pagina 88:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT:0px;"&gt;
&lt;P dir=ltr&gt;&lt;STRONG&gt;Stolen property.&lt;/STRONG&gt; If you steal property, you must report its fair market value in your income in the year you steal it unless in the same year, you return it to its rightful owner.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;Cu alte cuvinte, dacă din greşeală aţi rămas pe-acasă cu un laptop (sau zece) pe care aţi uitat să-l înapoiaţi proprietarului până la sfârşitul lui 2006, va trebui să plătiţi impozit la valoarea curentă de piaţă a bunului respectiv.&lt;/P&gt;
&lt;P dir=ltr&gt;(Dacă nu vreţi să navigaţi prin PDF, citatele de mai sus se găsesc şi în versiunea &lt;A href="http://www.irs.gov/publications/p17/ch12.html#d0e31898"&gt;HTML&lt;/A&gt;, sunt doar mai greu de găsit.)&lt;/P&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14694" width="1" height="1"&gt;</description></item><item><title>Două reguli</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/03/02/dou-reguli.aspx</link><pubDate>Fri, 02 Mar 2007 19:48:29 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14686</guid><dc:creator>ovidiupl</dc:creator><slash:comments>5</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14686.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14686</wfw:commentRss><description>&lt;p&gt;Dacă se întâmplă vreodată să lucrăm la același proiect, trebuie să știți că există&amp;nbsp;două reguli simple care mă fac foarte fericit, atâta vreme cât sunt respectate de toată lumea:&lt;/p&gt; &lt;p&gt;1. "Single point of truth" (aka "Don't repeat yourself")&lt;/p&gt; &lt;p&gt;Regula asta spune că orice entitate trebuie definită o singură dată într-un proiect. Denumirea de "single point of truth" am găsit-o în "The Art of Unix Programming" de Eric Raymond și am reținut-o pentru că denotă perfect efectul pe care îl are: Când ai ceva de modificat, trebuie să mergi într-un singur loc, nu să orbecăi prin tot felul de locații obscure.&lt;/p&gt; &lt;p&gt;Mai este cunoscută și sub numele de "nu introduceți constante magice în cod", dar exprimarea asta nu e suficient de generală. Am văzut și bucăți de cod în care aceeași constantă este definită în mai multe locuri. E destul de enervant&amp;nbsp;descoperi că într-un modul PI are aceeași semnificație ca în altul, dar 4 zecimale în plus. În plus, regula se aplică și pentru alte lucruri în afară de constante.&lt;/p&gt; &lt;p&gt;2.&amp;nbsp;În source control se țin numai fișiere sursă&lt;sup&gt;*&lt;/sup&gt;&lt;/p&gt; &lt;p&gt;Dintr-un motiv sau altul, ați putea fi tentați să introduceți în source control binare generate de către proiect. Nu faceți așa ceva, deoarece&amp;nbsp;încălcați regula #1 - din moment ce puteți obține sculele respective prin compilare, nu are nici un rost să vă repetați.&lt;/p&gt; &lt;p&gt;Dacă faceți așa ceva deoarece procesul de build depinde de prezența sculelor respective, aveți o problemă de bootstrapping (aka "oul și găina"). Încercați să rezolvați problema originală și nu să o mascați cu soluții improvizate.&lt;/p&gt; &lt;p&gt;Dacă faceți așa ceva deoarece aveți extrem de multe surse, din care un număr foarte mic se modifică de la un build la altul, problema&amp;nbsp;se află tot în procesul de build. Găsiți o modalitate eficientă de a compila numai fișierele modificate atunci când există un set anterior de binare la îndemână. Aveți grijă să nu introduceți buguri legate de interacțiunea dintre binare cu versiuni ușor diferite.&lt;/p&gt; &lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;Există o excepție notabilă.&amp;nbsp;Țineți în source control toate componentele externe folosite în procesul de build (SDK, compilator, scule auxiliare gen interpretorul de Perl și Python etc). Dacă în viitor doriți să reconstituiți de la zero o anumită versiune a proiectului, veți avea nevoie de exact același compilator, biblioteci etc, pentru a obține exact același rezultat.&amp;nbsp;De asemenea e recomandat să vă folosiți inteligența când decideți ce&amp;nbsp;conține toolset-ul necesar pentru build. Probabil că nu vreți să faceți check-in la o instalare completă de Windows și Visual Studio.&lt;/p&gt; &lt;p&gt;Pe lângă cele spuse mai sus, ar mai fi câteva reguli auxiliare, dar nu are rost să mă lungesc cu vorba. Ar mai trebui să precizez că regulile sunt necesare, nu și suficiente pentru a mă face fericit.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14686" width="1" height="1"&gt;</description></item><item><title>Windows Home Server</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/02/17/windows-home-server.aspx</link><pubDate>Sat, 17 Feb 2007 02:00:15 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14640</guid><dc:creator>ovidiupl</dc:creator><slash:comments>2</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14640.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14640</wfw:commentRss><description>&lt;p&gt;N-am idee dacă ați băgat în seamă &lt;a title="Bill Gates Unveils Windows Home Server at the 2007 International Consumer Electronics Show" href="http://www.microsoft.com/Presspass/press/2007/jan07/01-08WindowsHomeServerPR.mspx"&gt;anunțul&lt;/a&gt; din 8 ianuarie 2007 despre Windows Home Server. Dacă nu știți despre ce e vorba, Windows Home Server e o&amp;nbsp;variantă &lt;a title="Windows Home Server Simplifies Digital Life for Families" href="http://www.microsoft.com/presspass/features/2007/jan07/01-08HomeServer.mspx"&gt;consumer-friendly&amp;nbsp;de Windows Server&lt;/a&gt;, destinată utilizatorilor care au mai multe calculatoare acasă.&lt;/p&gt; &lt;p&gt;Eu am numai două calculatoare, un desktop și un notebook, dar îmi propun de vreo jumătate de an să-mi organizez cumva pozele, muzica și documentele în așa fel încât să-mi fie ușor accesibile de pe ambele mașini (eventual fără să fie pornite amândouă în același timp), și eventual să am și o schemă oarecare de backup, și cu toate astea nu am ajuns până acum la nici un rezultat concludent (dar, trebuie să recunosc, încă nu am încercat nici măcar lucrurile simple gen Offline Files din Windows XP sau o sculă de replicare peer-to-peer gen Groove).&lt;/p&gt; &lt;p&gt;Cea mai mare problemă e că periodic mai apare câte un set de poze și când mă apuc să le descarc, ajung pe undeva, după care când le organizez trebuie să țin cont care sunt deja pe CD sau DVD și care nu, care sunt duplicate pe ambele calculatoare și care sunt unicat. Cealaltă problemă e că Windows Search îmi e foarte util, dar pe mine personal mă deranjează să văd tot felul de aplicații consumând timp de procesor, și mai ales operații de intrare/ieșire fără să fac nimic la calculator (oarecum ironic, ținând cont că la serviciu una din componentele mele este serviciul NGen din .NET Framework, care face același lucru).&lt;/p&gt; &lt;p&gt;Aveam de mai multă vreme pe wish-list construirea unei mașini pe care să-mi stea toate documentele, pe care să ruleze tot timpul Windows Search, și care să aibă suficient spațiu încât să nu mai am nevoie vreodată să fac backup pe DVD (și ceva redundanță în așa fel încât să nu pierd toate datele o dată cu primul hard-disk care se decide să mă părăsească pentru&amp;nbsp;o lume mai bună). Din câte am văzut, aș putea crea un RAID de mai mult de 1 TB la un preț destul de rezonabil. 1 TB&amp;nbsp;reprezintă de vreo 10 ori mai multe&amp;nbsp;date decât am scris până acum pe CD-uri și DVD-uri de backup.&lt;/p&gt; &lt;p&gt;Ca să nu mai lungesc povestea, am decis să amân pasul&amp;nbsp;acesta pentru o vreme când am auzit că pe undeva prin firmă, o echipă pregătește un server de genul ăsta. Din câte știu, planul pentru versiunea finală arată cam așa: Un utilizator care are mai multe calculatoare pe acasă cumpără un&amp;nbsp;sistem cu Windows Home Server preinstalat. Acest sistem nu este PC-ul tradițional cu Windows, ci un server care poate fi ascuns în debara și de care poți uita complet după ce îl configurezi (nu necesită monitor, tastatură, mouse, doar electricitate, aer și conexiune la rețea). Pe celelalte calculatoare din casă trebuie instalat clientul de Home Server, care știe ce directoare au o copie master pe server și care se ocupă zilnic de backup, replicare și rezoluția conflictelor.&lt;/p&gt; &lt;p&gt;Mai mult, una din funcțiile anunțate de echipă mi-a depășit așteptările - există posibilitatea de a subscrie la un serviciu online care permite accesarea securizată a mașinii de oriunde de pe internet - nu mai e nevoie să plimb memory stick-uri sau CD-RW-uri după mine, sau să-mi trimit emailuri de acasă la serviciu și invers! De alte dorințe de-ale mele (Windows Search integrat pe server, sau posibilitatea de a descărca patch-urile de pe Windows Update o singură dată ca să le instalez pe toate calculatoarele după aceea) n-am auzit nimic încă, dar sunt convins că mai devreme sau mai târziu se vor gândi și la mine. În schimb, o altă caracteristică a sistemului (care depinde de hardware-ul utilizat, ce-i drept) este că e suficientă introducerea unui hard-disk nou și sistemul îl detectează automat și începe să-l folosească pentru stocare (fără reboot, fără alte eforturi de configurare).&lt;/p&gt; &lt;p&gt;Dacă ați rezistat până aici, urmează și vestea bună: Dacă mergeți la &lt;a title="http://connect.microsoft.com/WindowsHomeServer" href="http://connect.microsoft.com/WindowsHomeServer"&gt;http://connect.microsoft.com/WindowsHomeServer&lt;/a&gt;&amp;nbsp;și răspundeți la chestionarul de acolo, aveți șansa de a participa la programul beta 2 pentru Windows Home Server. Completarea chestionarului nu garantează că veți primi beta-ul, dar sunt convins că echipa are nevoie de câți mai mulți utilizatori care să chinuiască produsul în configurații cât mai diverse. Dacă aveți un calculator liber pe-acasă, vreți să îl transformați în server de fișiere și să vă jucați cu Home Server, &lt;a href="http://connect.microsoft.com/WindowsHomeServer"&gt;completați chestionarul cât mai curând&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14640" width="1" height="1"&gt;</description></item><item><title>"Atât cât trebuie și nimic mai mult"</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2007/02/08/at-t-c-t-trebuie-i-nimic-mai-mult.aspx</link><pubDate>Thu, 08 Feb 2007 19:06:44 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14602</guid><dc:creator>ovidiupl</dc:creator><slash:comments>7</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14602.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14602</wfw:commentRss><description>&lt;p&gt;Există exact două moduri de a scrie programe: bine sau prost. Ați putea fi tentați să credeți că există o varietate de nuanțe între cele două extreme, dar adevărul e că lucrurile nu stau deloc așa.&lt;/p&gt; &lt;p&gt;Cum anume arată codul bun nu are rost să discutăm. "Toată lumea știe că" e important să fie clar, bine comentat, consistent, modularizat, și că analiza cerințelor, alegerea unei arhitecturi, crearea unui model de securitate, testarea funcțională și evaluarea performanțelor sunt doar câțiva din pașii esențiali pentru crearea unei aplicații de calitate.&lt;/p&gt; &lt;p&gt;Am observat însă că în orice proiect există un indicator foarte simplu al calității proiectului pe ansamblu: Istoricul check-in-urilor din sistemul de source control. Serios, asta e tot. Dacă aveți la îndemână un proiect la care se lucrează de mai mult de 1-2 ani, aruncați o privire prin modificările făcute în surse. Este un exercițiu foarte interesant, care oferă posibilitatea de a înțelege "de ce"-ul din spatele multor decizii luate de-a lungul timpului.&lt;/p&gt; &lt;p&gt;De exemplu, dacă introducerea unei funcționalități noi se face "chirurgical", în sensul că există o serie de fișiere, clase și metode noi, dar modificările aduse codului existent sunt minime, înseamnă că trebuie să mulțumiți autorilor designului inițial pentru că au creat un produs modular și ușor extensibil (și astfel de produse există, nu sunt doar un mit).&lt;/p&gt; &lt;p&gt;În schimb, dacă un check-in atinge zeci de fișiere, dar funcționalitatea nouă e ascunsă doar în două-trei, ați dat de belea: Aveți de-a face cu un sistem strâns integrat, care trebuie testat ca un întreg pentru a verifica dacă piesele individuale lucrează cum trebuie. De obicei, complexitatea testării și întreținerii codului crește exponențial cu introducerea fiecărei funcționalități noi (probabil că nu trebuie să vă amintesc că și aceste produse sunt reale).&lt;/p&gt; &lt;p&gt;(Dacă ar fi să mă exprim abstract, aș spune că un sistem integrat este ca un spațiu vectorial în care lucrând de-a lungul axei &lt;strong&gt;R&lt;/strong&gt;&lt;sup&gt;&lt;em&gt;n+1&lt;/em&gt;&lt;/sup&gt; trebuie să ții cont de toate combinațiile dintre funcționalitățile existente pe primele &lt;em&gt;n&lt;/em&gt; axe, pe când într-un sistem modularizat, există o oarecare independență. Dar nu o să mă exprim abstract, mai ales că analogia nu e ideală).&lt;/p&gt; &lt;p&gt;Mai pot fi trase diverse concluzii și din frecvența cu care este modificat un fișier, atât în perioada de dezvoltare, cât și în perioada de întreținere a componentei pe care o găzduiește.&amp;nbsp;Dacă este modificat foarte rar, fie este scris extrem de bine, fie este inutil. Dacă este modificat foarte des, e interesant de văzut care e amplitudinea modificărilor și care e cauza lor - dacă e prost scris și necesită multă atenție ca să rămână în stare de funcționare, dacă a devenit prea mare și&amp;nbsp;trebuie segregat într-un fel sau altul pentru că modificările se fac de fapt în componente distincte sau dacă e altceva în neregulă.&lt;/p&gt; &lt;p&gt;Răsfoind&amp;nbsp;check-in-urile altora, am învățat să fiu puțin mai critic cu ale mele. Secretul din spatele multor proiecte este să menții complexitatea la minim, ori complexitatea nu crește în mod detectabil de la o zi la alta, ci urcă pe o pantă lină. Nu e ca și cum vineri seara pleci acasă după ce ai lucrat la un proiect "simplu" și luni dimineața codul e dintr-o dată de neînțeles. Din cauza asta, fiecare check-in trebuie să adauge sau să modifice atât cât trebuie și nimic mai mult.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14602" width="1" height="1"&gt;</description></item><item><title>Diacritice românești pentru Windows XP</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/11/20/diacritice-rom-ne-ti-pentru-windows-xp.aspx</link><pubDate>Mon, 20 Nov 2006 19:18:56 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14056</guid><dc:creator>ovidiupl</dc:creator><slash:comments>3</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14056.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14056</wfw:commentRss><description>&lt;p&gt;Într-un comentariu primit&amp;nbsp;zilele trecute, un cititor &lt;a href="http://weblogs.studentclub.ro/ovidiupl/archive/2006/11/07/Glume-de-matematician.aspx#4485"&gt;se plângea&lt;/a&gt; de caracterele pe care le folosesc pe weblog, mai exact de 'ș' și 'ț'. S-ar putea să știți că în versiunile&amp;nbsp;anterioare de Windows, cele două litere erau reprezentate folosind caractere împrumutate din setul Latin2 (ISO-8859-2), mai exact U+015E (LATIN CAPITAL LETTER S WITH CEDILLA), U+015F (LATIN SMALL LETTER S WITH CEDILLA), U+0162 (LATIN CAPITAL LETTER T WITH CEDILLA) și U+0163 (LATIN SMALL LETTER T WITH CEDILLA), cunoscute și sub numele de "ș și ț cu sedilă". Pe siteul consorțiului &lt;a href="http://www.unicode.org/"&gt;Unicode&lt;/a&gt; găsiți aceste caractere în secțiunea &lt;a href="http://www.unicode.org/charts/PDF/U0100.pdf"&gt;Latin Extended-A&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Din câte știu, aceste caractere au fost preluate din setul folosit pentru limba turcă deoarece la vremea respectivă nu exista un standard pentru limba română (vorbim aici de mijlocul anilor '90). După cum v-ați dat seama deja, caracterele cu pricina sunt compuse din 's' și 't' și o sedilă atașată sub ele.&lt;/p&gt; &lt;p&gt;Problema este că în limba română, cele două caractere sunt compuse de fapt prin atașarea unei virgule&amp;nbsp;și au fost introduse ceva mai târziu în standardele din domeniu&amp;nbsp;(ISO-8859-16, care conține așa-numitul set Latin10). Cu alte cuvinte, caracterele corecte pentru limba română sunt U+0218 (LATIN CAPITAL LETTER S WITH COMMA BELOW), U+0219 (LATIN SMALL LETTER S WITH COMMA BELOW), U+021A (LATIN CAPITAL LETTER T WITH COMMA BELOW) și U+021B (LATIN SMALL LETTER T WITH COMMA BELOW), pe care le puteți găsi în secțiunea &lt;a href="http://www.unicode.org/charts/PDF/U0180.pdf"&gt;Latin Extended-B&lt;/a&gt;, paragraful "Additions for Romanian".&lt;/p&gt; &lt;p&gt;Pentru a nu lungi prea mult povestea, Windows Vista conține suport complet pentru aceste caractere, cu tot cu un layout nou pentru tastatură (pe care îl folosesc și pentru a scrie acest articol). Am aflat astăzi &lt;a href="http://blogs.msdn.com/michkap/archive/2006/11/19/1104093.aspx"&gt;o veste bună&lt;/a&gt; de pe pagina lui &lt;a href="http://blogs.msdn.com/michkap/"&gt;Michael Kaplan&lt;/a&gt;, developer în grupul de internaționalizare de la Microsoft: Tocmai a fost lansat pe Microsoft Downloads un pachet pentru Windows XP&amp;nbsp;numit &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0ec6f335-c3de-44c5-a13d-a1e7cea5ddea&amp;amp;DisplayLang=en"&gt;European Union Expansion Font Update&lt;/a&gt;, care actualizează fonturile Times New Roman și Arial pentru a permite afișarea corectă a celor patru caractere noi.&lt;/p&gt; &lt;p&gt;Vestea mai puțin bună este că introducerea acestor caractere de la tastatură este mai dificilă în Windows XP, deoarece layout-ul implicit nu știe de ele. Totuși, există posibilitatea de a crea layout-uri particularizate de tastatură folosind &lt;a href="http://www.microsoft.com/globaldev/tools/msklc.mspx"&gt;Microsoft Keyboard Layout Creator&lt;/a&gt;, așa că există speranțe și pentru cei care vor să adopte noile caractere pe Windows XP. Oricum, cel puțin problema vizualizării este parțial rezolvată.&lt;/p&gt; &lt;p&gt;În loc de încheiere, mă gândeam că poate comunitatea românească de IT ar trebui să-i mulțumească și lui &lt;a href="http://www.secarica.ro/"&gt;Cristian Secară&lt;/a&gt;, unul din primii care au remarcat inconsistența implementării diacriticelor în Windows și care a susținut în mod activ cauza adoptării și implementării standardelor pentru limba română. Vorbeam zilele trecute cu &lt;a href="/tudorg"&gt;Tudor&lt;/a&gt; despre diverse subiecte și printre altele, îmi povestea că a fost foarte impresionat de gradul în care s-a implicat și de pasiunea pe care a arătat-o Cristian Secară în a urmări soluționarea acestei probleme.&lt;/p&gt; &lt;p&gt;Mai rămân de convertit de la formatul vechi documentele și bazele de date și am rezolvat-o și pe asta... Că tot veni vorba, pe Windows Vista am avut o vreme și layout-ul Romanian (Standard), și pe cel anterior, Romanian (Legacy). Am renunțat foarte repede la varianta veche, deoarece m-am obișnuit ușor cu cea nouă și pentru că trecerea de la engleză la română o fac cu Alt+Shift, dar trecerea de la un layout la altul în română se face cu Ctrl+Shift.&lt;/p&gt; &lt;p&gt;Cum folosesc foarte mult tastatura, și Ctrl+Shift (+ săgeată) e folosit și pentru a selecta blocuri de text (cuvânt cu cuvânt), ajunsesem să comut de la Legacy la Standard și invers de câteva ori pe document, fără să-mi dau seama. Dacă sunteți foarte atenți, o să remarcați asta în câteva articole de acum câteva săptămâni, care conțin și&amp;nbsp;caracterele cu sedilă, și pe cele cu virgulă. Asta este, durerile tranziției...&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14056" width="1" height="1"&gt;</description></item><item><title>Glume de matematician</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/11/07/Glume-de-matematician.aspx</link><pubDate>Tue, 07 Nov 2006 21:52:22 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:14005</guid><dc:creator>ovidiupl</dc:creator><slash:comments>3</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/14005.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=14005</wfw:commentRss><description>&lt;p&gt;Zilele trecute, cineva a pus o întrebare pe una din listele interne de discuții dedicate .NET Framework: În afară de Double.NaN, Double.PositiveInfinity (șamd), mai există și alte numere speciale în .NET?&lt;/p&gt; &lt;p&gt;Evident, au urmat tradiționalele "Ce anume vrei să faci de fapt?" și&amp;nbsp;"Numărul Pi este special, sau nu se pune?", dar răspunsul de azi dimineață le-a făcut praf pe toate cele dinainte:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Teoremă: Orice număr este special.&lt;/p&gt; &lt;p&gt;Demonstrație: În mod evident,&amp;nbsp;0 este special, fiind primul număr natural. 1 este și el special, fiind elementul identitate pentru înmulțire.&amp;nbsp;2 este singurul număr prim și par. 3 este cel mai mic număr prim și impar.&lt;/p&gt; &lt;p&gt;Se poate spune că există&amp;nbsp;multe numere speciale. Să presupunem că mulțimea numerelor care nu sunt speciale este nevidă. Atunci, există&amp;nbsp;cel mai mic&amp;nbsp;număr natural care nu este special.&lt;/p&gt; &lt;p&gt;Dar, în acest caz, și acest număr e destul de special, nu?&lt;/p&gt; &lt;p&gt;Tocmai am demonstrat că dacă mulțimea numerelor care nu sunt speciale este nevidă, ea va conține cel puțin un număr special. Acest lucru este absurd, deci ipoteza de la care am pornit este greșită.&lt;/p&gt; &lt;p&gt;În concluzie, toate numerele sunt speciale. Extinderea demonstrației pentru numere reale rămâne cititorului ca exercițiu.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=14005" width="1" height="1"&gt;</description></item><item><title>Profiling 101 (Anexa 2)</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/25/Profiling-101-_2800_Anexa-2_2900_.aspx</link><pubDate>Wed, 25 Oct 2006 15:00:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13902</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13902.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13902</wfw:commentRss><description>&lt;p&gt;Am &amp;icirc;ncheiat articolul de &lt;a href="/ovidiupl/archive/2006/10/24/Profiling-101-_2800_Anexa-1_2900_.aspx" title="Profiling 101 (Anexa 1)"&gt;data trecută&lt;/a&gt; cu o &amp;icirc;ntrebare: Ce este mai avantajos pentru un utilizator, să aibă o conexiune de 1 Gbps cu latența de 1 s, sau o conexiune de 10 Mbps cu latența de 1 ms?&lt;/p&gt;&lt;p&gt;Depinde. &amp;Icirc;n primul caz, pentru fiecare cerere utilizatorul va aștepta 2 secunde p&amp;acirc;nă să primească primul bit al răspunsului, dar răspunsul propriu-zis va sosi foarte repede. Dacă fiecare cerere are &amp;icirc;n medie 100 KB, rezultă că &amp;icirc;n medie utilizatorul va aștepta 2.0001024 s pentru fiecare pagină web. Dacă, &amp;icirc;n schimb, fiecare cerere are 100 MB, timpul mediu de așteptare (p&amp;acirc;nă la ultimul bit) va fi de 2.1048576 s. Cu alte cuvinte, conexiunea este foarte avantajoasă pentru transferul cantităților mari de date și atunci c&amp;acirc;nd decalajul de 2 secunde nu este important.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n al doilea caz, la cereri de 100 KB, răspunsul mediu va dura 0.01124 s. &amp;Icirc;n schimb, la cereri de 100 MB, răspunsul mediu va avea 10.48676 s. Cu alte cuvinte, tipul acesta de conexiune excelează la interactivitate pentru transferuri mici și medii, dar nu se comportă bine la volume mari de date. Evident, ambele exemple sunt prezentate exclusiv din punctul de vedere (pur teoretic) al clientului și nu țin cont de o mulțime de alți factori din lumea reală.&lt;/p&gt;&lt;p&gt;Generaliz&amp;acirc;nd, ne interesează de fapt răspunsul la două &amp;icirc;ntrebări: Cum alegem scenariile pe care le testăm, și cum alegem parametrii care influențează cel mai semnificativ acele scenarii?&lt;/p&gt;&lt;p&gt;La prima &amp;icirc;ntrebare, răspunsul este mai delicat dec&amp;acirc;t v-ați aștepta: Teoretic, scenariile esențiale din punctul de vedere al performanțelor sunt la alegerea clientului. Sigur, toată lumea &amp;icirc;și dorește aplicații rapide și care să ocupe puțină memorie, dar acest obiectiv are un mare defect - nu este măsurabil. Soluția este să includeți &amp;icirc;n specificațiile aplicației obiective de performanță concrete, specifice și măsurabile.&lt;/p&gt;&lt;p&gt;Acest lucru e valabil indiferent că dezvoltați o soluție sub contract, pentru un client, caz &amp;icirc;n care parametrii de performanță doriți sunt o parte a contractului, sau o soluție pentru publicul larg, caz &amp;icirc;n care este responsabilitatea voastră să determinați cerințele de performanță și să le tratați la fel ca pe toate celelalte cerințe ale aplicației.&lt;/p&gt;&lt;p&gt;Alegerea scenariilor propriu-zise este unul din domeniile care țin mai mult de arta programării (vizavi de știința programării), deoarece implică &amp;icirc;nțelegerea percepțiilor și așteptărilor utilizatorilor. Nu există o rețetă universală pentru rezolvarea acestei probleme.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n lumea reală, de cele mai multe ori clienții articulează cu greu scenarii concrete de performanță și dorințele lor &amp;icirc;n legătură cu acestea. Probabil că singura strategie corectă este să vă folosiți intuiția și să alegeți c&amp;acirc;teva situații pe care le considerați importante, să optimizați scenariile alese, și să includeți &amp;icirc;n aplicație instrumentație și mecanisme de feedback c&amp;acirc;t mai vizibile și mai ușor de folosit. &amp;Icirc;n acest fel, dacă utilizatorii sunt nemulțumiți și se dovedește că deciziile luate au fost incorecte, puteți adapta rapid aplicația la cerințele reale ale clienților.&lt;/p&gt;&lt;p&gt;La a doua &amp;icirc;ntrebare, răspunsul este similar: &amp;Icirc;n cazul &amp;icirc;n care după o sesiune de profiling observați o problemă de performanță, probabil că vă veți pune &amp;icirc;ntrebări &amp;icirc;n legătură cu natura problemei și veți ajunge să decideți care parametri merită luați &amp;icirc;n considerare. Ca regulă generală, orice operație care necesită implicarea altor componente dec&amp;acirc;t procesorul și memoria sistemului poate dura oric&amp;acirc;t.&lt;/p&gt;&lt;p&gt;Mult mai grav este dacă după toate sesiunile de lucru nu observați nici un fel de probleme (ce se &amp;icirc;nt&amp;acirc;mplă dacă toate testele sunt rulate &amp;icirc;ntr-o rețea de 1 Gbps și cu latență de 1 ms?). Teoretic, dacă &amp;icirc;nțelegeți bine arhitectura aplicației, sunt mari șanse să vă dați seama de la bun &amp;icirc;nceput care sunt elementele cu potențialul cel mai mare de a ridica probleme de performanță. Un alt factor care poate fi de mare ajutor sunt colegii mai experimentați de echipă (greșelile trecutului sunt &amp;icirc;n general un indicator foarte bun al greșelilor care vor fi evitate pe viitor; evident, există și excepții de la această regulă).&lt;/p&gt;&lt;p&gt;&amp;Icirc;n paranteză fie spus, am avut ocazia să &amp;icirc;nt&amp;acirc;lnesc programatori altminteri capabili, dar care au rămas complet siderați c&amp;acirc;nd un consultant mult mai trecut prin arhitecturi distribuite le-a explicat că o aplicație bazată pe .NET Remoting, care face enorm de multe apeluri &amp;icirc;n rețea pentru fiecare operație se va comporta excelent &amp;icirc;n mediul lor de test (rețea LAN de 100 Mbps), dar nu are nici o șansă să supraviețuiască &amp;icirc;n viața reală: clientul lor dorea să utilizeze aplicația peste linii ISDN de 128 kbps, și at&amp;acirc;t latența, c&amp;acirc;t și lățimea de bandă făceau și cele mai simple funcții să se execute cu viteza melcului. Nu cred că vreți să&amp;nbsp;descoperiți probleme de acest gen c&amp;acirc;nd proiectul e &amp;icirc;ncheiat.&lt;/p&gt;&lt;p&gt;Dacă nu aveți la dispoziție colegi super-experimentați și nu cunoașteți fiecare colțișor al aplicației implementate și al platformei de care depinde, ultima soluție este forța brută: Testați pe c&amp;acirc;t mai multe combinații de platforme hardware și software. Folosiți cele mai puternice combinații pe care le aveți la dispoziție pentru a rezolva problemele cele mai presante, după care treceți la configurații c&amp;acirc;t mai apropiate de ale utilizatorilor și vedeți ce probleme mai ies la iveală.&amp;nbsp;E valabil at&amp;acirc;t pentru aplicații client, c&amp;acirc;t și pentru servere! Nu vreți ca aplicația să meargă perfect pe serverul de test, cu o bază de date de 10 utilizatori, dar să se t&amp;acirc;rască pe serverul de producție care poate fi de 100 de ori mai rapid, dar&amp;nbsp;suportă 100 de milioane de utilizatori.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13902" width="1" height="1"&gt;</description></item><item><title>Profiling 101 (Anexa 1)</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/24/Profiling-101-_2800_Anexa-1_2900_.aspx</link><pubDate>Tue, 24 Oct 2006 15:02:20 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13882</guid><dc:creator>ovidiupl</dc:creator><slash:comments>1</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13882.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13882</wfw:commentRss><description>&lt;p&gt;În articolul inițial despre &lt;a title="Profiling 101" href="/ovidiupl/archive/2006/10/16/Profiling-101.aspx"&gt;profiling&lt;/a&gt; au rămas câteva chestiuni nelămurite, asupra cărora aș vrea să revin cu mai multe detalii.&lt;/p&gt; &lt;p&gt;Astăzi discutăm puțin despre o anomalie observată în rezultatele măsurării din articol. Din ce cauză salvarea imaginii nou create durează 515 ms în unul din teste și&amp;nbsp;57 ms în al doilea? Răspunsul este foarte simplu, dar trebuie avut permanent în vedere atunci când vine vorba de evaluarea performanțelor: Toate măsurările sunt afectate de zgomot.&lt;/p&gt; &lt;p&gt;Este foarte posibil ca în prima situație, aplicația să fi așteptat până când datele au fost scrise efectiv pe disc, deoarece sistemul de operare nu avea suficiente pagini disponibile în cache-ul managerului de memorie, pe când în a doua situație este destul de evident că rezultatele salvării nu s-au dus direct pe disc: imaginile generate au puțin peste 9 MB, iar această cantitate de date scrisă în 57 ms ar implica o viteză de transfer la scriere de aproximativ 158 MB/s. Întrucât nici măcar interfața discului nu suportă viteze de genul acesta (am&amp;nbsp;rulat testul&amp;nbsp;pe un disc Ultra DMA), este clar că la mijloc se află unul sau mai multe niveluri de caching.&lt;/p&gt; &lt;p&gt;Soluția pentru eliminarea zgomotului este simplă: Efectuați cât mai multe teste, în limita timpului disponibil, și luați-le în considerare pe cele mai relevante din punct de vedere statistic (de exemplu, eliminând din listă rezultatele "anormale", până când abaterea standard devine rezonabil de mică). De cele mai multe ori, anomaliile vor ieși foarte ușor în evidență chiar și vizual (de exemplu într-un grafic unidimensional, în care rezultatul fiecărei măsurări este un punct).&lt;/p&gt; &lt;p&gt;Sigur,&amp;nbsp;mai este nevoie de&amp;nbsp;încă o clarificare: Care este definiția normalității? În exemplul de mai sus, trebuie să ne așteptăm ca datele să poată fi scrise de fiecare dată în cache, extrem de rapid, sau dimpotrivă, este de așteptat ca în majoritatea cazurilor memoria sistemului să fie insuficientă astfel încât aplicația va fi nevoită să aștepte ca fiecare scriere să aibă loc complet?&lt;/p&gt; &lt;p&gt;Evident, nu există un răspuns universal: Dacă aplicația încearcă să scrie 10 MB de date pe disc, timpii de execuție vor varia semnificativ în funcție de viteza discului și de cantitatea de memorie disponibilă sistemului de operare. De exemplu, este destul de plauzibil că pe o mașină cu 64-128 MB de RAM, aceste date nu vor sta foarte mult în cache, deoarece 10 MB reprezintă un procent însemnat din memoria sistemului, care este probabil necesară pentru execuția normală a aplicațiilor și a codului sistemului de operare; în acest caz, viteza discului va fi o variabilă importantă.&lt;/p&gt; &lt;p&gt;Pe de altă parte, pe o mașină cu 1-2 GB de RAM care rulează rezonabil de puține aplicații (să zicem că sunt ocupați maxim 150 MB de memorie), șansele sunt foarte mari ca datele respective să fie transferate foarte rapid într-o memorie tampon a sistemului de operare, de unde vor fi scrise mult mai târziu pe disc (asincron, din punctul de vedere al aplicației). În acest caz, viteza propriu-zisă a discului nici nu mai contează.&lt;/p&gt; &lt;p&gt;În practică, pentru evaluarea influenței factorilor externi, se încearcă de obicei să se măsoare comportamentul aplicației în situațiile extreme, în așa fel încât comportamentul aplicației să fie cât mai bine&amp;nbsp;înțeles pe un set de configurații hardware. De exemplu, la măsurarea vitezei operațiilor cu discul, se practică măsurarea "la rece", când cache-ul sistemului de operare nu conține nici un fel de date (și eventual este suficient de mic încât să forțeze ca un număr mare de operații de scriere să ajungă direct până la disc) și "la cald", când cache-ul sistemului de operare conține deja o mare parte din datele necesare aplicației și este suficient de mare încât majoritatea scrierilor să se facă asincron.&lt;/p&gt; &lt;p&gt;Similar, pentru aplicațiile care comunică în rețea se fac în mod obișnuit teste pe conexiuni cu latență variată și cu lățime de bandă variată. Ce anume trebuie testat depinde de natura aplicației - de exemplu pentru un navigator de web, latența contează într-o oarecare măsură, deoarece ea dictează cât are de așteptat aplicația până să primească chiar și primul bit venit de pe un server web, dar lățimea de bandă este&amp;nbsp;cel puţin la fel de&amp;nbsp;importantă, deoarece determină timpul de aşteptare dintre primul și ultimul bit. Ne putem imagina cu uşurinţă tot felul de situaţii extreme generate de combinaţiile posibile de latenţă şi viteză: De exemplu, este mai avantajoasă o conexiune de 1 Gbps cu latență de 1 s sau o conexiune de 10 Mbps cu latența de 1 ms? Răspunsul în episodul viitor (dar puteți înșira speculații în secțiunea de comentarii).&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13882" width="1" height="1"&gt;</description></item><item><title>Doctorat - Virginia Tech</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/23/Doctorat-_2D00_-Virginia-Tech.aspx</link><pubDate>Mon, 23 Oct 2006 03:15:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13874</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13874.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13874</wfw:commentRss><description>&lt;p&gt;La rugămintea lui Mihai Alexe, doctorand la Virginia Tech Department of Computer Science, postez un anunţ al prof. Adrian Sandu, din cadrul aceluiaşi departament:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Cu respect doresc să vă informez de posibilitatea de a urma studii de doctorat &amp;icirc;n Computer Science la Virginia Tech. Burse de studii (&amp;icirc;n diferite specializări &amp;icirc;n cadrul Computer Science) sunt disponibile pentru aplicanţii calificaţi.&lt;/p&gt;&lt;p&gt;Virginia Tech oferă un mediu excepţional pentru studii de doctorat şi pentru cercetare avansată &amp;icirc;n mai multe domenii din Computer Science. Vă scriu &amp;icirc;n special despre domeniul &amp;icirc;n care &amp;icirc;mi desfăşor eu activitatea - &amp;quot;Computational Science and Engineering&amp;quot; (metode de calcul numeric, parallel, şi aplicaţii). Burse speciale de cercetare sunt disponibile pentru absolvenţi de diplomă sau de masterat cu calităţi deosebite, interesaţi să urmeze doctoratul &amp;icirc;n acest domeniu.&lt;/p&gt;&lt;p&gt;Departamentul de Computer Science (&lt;a href="http://www.cs.vt.edu"&gt;http://www.cs.vt.edu&lt;/a&gt;) are un grup puternic de cercetare &amp;icirc;n Computational Science. Domeniile de cercetare cuprind calcul masiv-parallel, algoritmi numerici de algebră liniară, optimizare, metode de rezolvare numerică a ecuaţiilor diferenţiale ordinare şi cu derivate parţiale, etc, cu diverse domenii de aplicaţie. &lt;/p&gt;&lt;p&gt;Virginia Tech găzduieşte supercomputerul System X (&lt;a href="http://www.tcf.vt.edu"&gt;http://www.tcf.vt.edu&lt;/a&gt;) care, la 12.5 TeraFlops/sec este cel mai rapid supercomputer academic din lume. Colegiul de Inginerie (din care face parte Departamentul de Computer Science) este an de an nominalizat ca una dintre cele mai bune şcoli de ştiinţe inginereşti din Statele Unite. &lt;/p&gt;&lt;p&gt;Grupul nostru (&lt;a href="http://people.cs.vt.edu/~asandu"&gt;http://people.cs.vt.edu/~asandu&lt;/a&gt;) lucrează la multe proiecte interesante. Dezvoltăm algoritmi de calcul numeric şi software pentru simulări foarte mari pe maşini masiv-paralele, algoritmi pentru integrarea informaţională a observaţiilor şi modelelor, metode de simulare cu rezoluţie adaptivă &amp;icirc;n timp şi spaţiu, modelarea sistemelor cu incertitudini, etc. Domeniile de aplicaţie includ ştiinţele Păm&amp;acirc;ntului, inginerie mecanică, biologie, etc. &lt;/p&gt;&lt;p&gt;Procedura de admitere (&lt;a href="http://www.cs.vt.edu/gpc/admissions.html"&gt;http://www.cs.vt.edu/gpc/admissions.html&lt;/a&gt;) şi cerinţele programului de doctorat (&lt;a href="http://www.cs.vt.edu/gpc/phd.html"&gt;http://www.cs.vt.edu/gpc/phd.html&lt;/a&gt;) sunt on-line. Cei interesaţi &amp;icirc;n a urma studii de doctorat &amp;icirc;n Computer Science la Virginia Tech pot să mă contacteze direct la adresa de mai jos. &lt;/p&gt;&lt;p&gt;Cu mult respect al Dvs,&lt;br /&gt;Prof. Adrian Sandu&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Adrian Sandu, Assoc. Prof.&lt;/td&gt;&lt;td&gt;Phone: (540) 231-2193&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Department of Computer Science&lt;/td&gt;&lt;td&gt;Fax: (540) 231-6075&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Virginia Tech&lt;/td&gt;&lt;td&gt;Email: &lt;a href="mailto:sandu@cs.vt.edu"&gt;sandu@cs.vt.edu&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blacksburg, VA 24061-0106&lt;/td&gt;&lt;td&gt;URL: &lt;a href="http://www.cs.vt.edu/~asandu"&gt;http://www.cs.vt.edu/~asandu&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;Pe scurt, un candidat ar trebui să fie interesat de cercetare &amp;icirc;n următoarele direcţii:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ecuaţii diferenţiale cu derivate parţiale&lt;/li&gt;&lt;li&gt;adjoint modelling&lt;/li&gt;&lt;li&gt;probleme inverse&lt;/li&gt;&lt;li&gt;optimizare pentru probleme neliniare&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ca o bază de plecare, studenţii interesaţi trebuie să aibă cunoştinţe fundamentale de analiză numerică, algebră liniară + ecuaţii diferenţiale ordinare + algoritmi paraleli (bine&amp;icirc;nţeles, totul urmează să fie aprofundat prin cursuri la graduate level o dată ce &amp;icirc;ncep lucrul la VT).&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Dacă sunteţi atraşi de acest domeniu, sau aveţi prieteni care se &amp;icirc;ncadrează &amp;icirc;n cerinţele de mai sus, puteţi lua legătura cu prof. Sandu folosind datele de contact de mai sus.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13874" width="1" height="1"&gt;</description></item><item><title>Prezența obligatorie</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/19/Prezen_1B02_a-obligatorie.aspx</link><pubDate>Thu, 19 Oct 2006 18:22:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13848</guid><dc:creator>ovidiupl</dc:creator><slash:comments>7</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13848.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13848</wfw:commentRss><description>&lt;p&gt;Din &lt;a href="http://www.gandul.info/" title="G&amp;acirc;ndul"&gt;G&amp;acirc;ndul&lt;/a&gt; de &lt;strike&gt;astăzi&lt;/strike&gt; &lt;a href="http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/19/Prezen_1B02_a-obligatorie.aspx#4315"&gt;anul ăsta&lt;/a&gt;, &lt;a href="http://www.gandul.info/articol_9955/politehnica_bucuresti__prima_universitate_care_impune_studentilor_prezenta_obligatorie_la_cursuri.html" title="Politehnica București, prima universitate care impune prezența obligatorie la cursuri"&gt;aflăm&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;La 200 de absente pe semestru, adica pentru mai putin de doua luni de cursuri, seminarii si laboratoare cumulate, un student de la Politehnica va trebui sa plateasca taxa anuala de studii in urmatorul an universitar. Aceasta este cea mai drastica si cea mai contestata (de catre studenti) prevedere din noul Regulament al Universitatii Politehnica Bucuresti (UPB), ce va intra in vigoare la 1 octombrie 2006. Studentii care vor chiuli mai mult de 80 de ore &amp;quot;din activitatile didactice dintr-un semestru&amp;quot;, adica aproximativ doua saptamani, vor fi sanctionati cu mustrare, iar pentru mai mult de 130 de ore vor primi un avertisment scris. &lt;/p&gt;&lt;p&gt;Calificativele de student mustrat sau atentionat nu sunt puse doar de ochii lumii, ci atrag dupa sine pierderea urmatoarelor drepturi: de a participa la tabere de odihna, de a primi burse de merit, de a fi reprezentant al studentilor sau de a participa la programele SOCRATES, ERASMUS, LEONARDO, precum si la alte programe internationale. Regulamentul UPB nu a fost votat de nici unul dintre studentii prezenti la sedinta Senatului din 4 mai, cand a fost adoptat. Prima contestatie a studentilor a fost aceea ca ei nu au fost consultati de conducerea universitatii atunci cand a fost intocmit regulamentul. In scurt timp de la adoptarea regulamentului, Asociatia Studentilor din Politehnica a inaintat conducerii o petitie in care reprosa, in primul rand, prezenta obligatorie la cursuri. Degeaba au incercat ei sa argumenteze ca prezenta la curs nu determina nivelul de cunostinte al studentului, ca sunt prea putine sali cu o capacitate de peste o suta de locuri in care sa se desfasoare cursurile (intr-o grupa [mai degrabă serie - n.r.] fiind 150 de studenti), ca multi studenti lucreaza sau sunt la doua facultati sau chiar ca exista profesori carora le lipsesc aptitudinile pedagogice si ale caror cursuri sunt greu de urmarit. Tot ce au putut obtine, in urma sedintei care a avut loc la sfarsitul saptamanii trecute, a fost o amanare a aplicarii regulamentului.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Din același articol, aflăm părerea doamnei profesoare Andronescu: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;quot;forma de invatamant pe care Politehnica Bucuresti o promoveaza este aceea la zi, cu frecventa. In al doilea rand, invatamantul tehnic este un invatamant greu, dificil, iar la curs profesorul iti spune mai mult decat scrie in carte, iti povesteste si din experienta proprie. Si atunci este un plus de valoare, iar studentul invata mai mult. Deocamdata, am hotarat ca acest sistem sa se aplice un an, experimental, fara sanctiuni, ca o modalitate de a inregistra frecventa si pentru a analiza aspectele bune si mai putin bune. E posibil ca, la sfarsit, sa ne dam seama ca e gresit, dar e posibil si ca studentii sa se convinga ca e pentru buna lor pregatire profesionala. Nu am facut acest lucru impotriva studentilor, ci pentru cresterea calitatii in invatamant. &amp;quot;60% din cei mai buni studenti, de la Electrotehnica si Calculatoare, din anul II, lucreaza. Or, sa muncesti 8 ore cand esti student e prea mult. Ceea ce invata la serviciu este extraordinar de limitat, desi angajatorul, care urmareste profit, ii spune ca el acolo face scoala. Te intrebi ce va face studentul cu cariera&amp;quot;. Ce solutii a gasit doamna rector? &amp;quot;M-am gandit la o initiativa legislativa prin care studentii sa poata sa lucreze part-time. Mai vrem sa aducem companii care sa lucreze in campusul universitatii. Sa dezvoltam un parc tehnologic in curtea Politehnicii&amp;quot;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Dacă ar fi să privesc lucrurile &amp;icirc;n mod abstract, m-aș bucura pentru această hotăr&amp;acirc;re. Este anormal ca &amp;icirc;n fiecare semestru, sălile de curs să fie destul de populate la primul curs, dar la ultimele cursuri să mai participe doar c&amp;acirc;te un reprezentant al fiecărei grupe. Este la fel de anormal ca studenții să-și petreacă semestre &amp;icirc;ntregi la serviciu, c&amp;acirc;nd ei ar trebui să se preocupe de&amp;nbsp;dezvoltarea lor intelectuală. Desigur, asta e o părere pur abstractă.&amp;nbsp;E abia un an și un pic de c&amp;acirc;nd am scăpat din facultate și dacă &amp;icirc;mi amintesc bine, realitatea conține și c&amp;acirc;teva elemente care lipsesc din modelul abstract de mai sus. &lt;/p&gt;&lt;p&gt;Conducerea Politehnicii face o confuzie gravă &amp;icirc;ntre cauză și efect. Sigur, este de fapt o problemă destul de comună pentru liderii care nu se ridică la &amp;icirc;nălțimea responsabilităților lor. &amp;Icirc;n general, cam oricine poate identifica o problemă (de exemplu, &amp;quot;sălile de curs sunt goale; ciudat, pe h&amp;acirc;rtie avem destui cursanți&amp;quot;). De aici, &amp;icirc;nsă, lucrurile pot porni &amp;icirc;n două direcții. Un manager competent va &amp;icirc;ncepe căutarea soluției cu o &amp;icirc;ntrebare pe care cam toți copiii o pun la o anumită v&amp;acirc;rstă, dar pe care ca adulți o punem din ce &amp;icirc;n ce mai rar: &amp;quot;De ce?&amp;quot;. Nu se va mulțumi cu cel mai comod, sau cu primul răspuns pe care &amp;icirc;l va primi (&amp;quot;pentru că studenții trag chiulul&amp;quot;), ci va repeta &amp;icirc;ntrebarea (&amp;quot;dar de ce trag studenții chiulul?&amp;quot;) p&amp;acirc;nă c&amp;acirc;nd calitățile lui de&amp;nbsp;manager &amp;icirc;i vor spune că a ajuns la adevărata cauză a fenomenului. Abia atunci poate trece la al doilea pas, la căutarea unei soluții. &lt;/p&gt;&lt;p&gt;Desigur, există o alternativă mult mai simplă: De ce sunt sălile de curs goale? Pentru că studenții absentează. A, păi e simplu atunci: Din moment ce suntem deasupra studenților din punctul de vedere al autorității, vom decreta că locul lor e la curs, nu &amp;icirc;n altă parte. Avem și argumente logice: Din moment ce forma de &amp;icirc;nvățăm&amp;acirc;nt este la zi, cu frecvență, e clar că trebuie să impunem acest aspect prin regulament. Dacă &amp;icirc;ntreabă cineva, mai avem și alte argumente. &lt;/p&gt;&lt;p&gt;Opiniile doamnei Andronescu ar fi un exemplu foarte bun pentru elevii de clasa a VI-a care &amp;icirc;ncep să &amp;icirc;nvețe bazele geometriei euclidiene (dacă asta se mai &amp;icirc;nt&amp;acirc;mplă &amp;icirc;n clasa a VI-a; pe vremea mea așa era). &amp;Icirc;nainte de a pătrunde prea ad&amp;acirc;nc &amp;icirc;n axiome și teoreme, profesorul nostru de matematică ne-a ținut o prelegere despre bazele logicii. Printre altele, ne-a explicat lucruri precum tabelele de adevăr, despre implicațiile logice și despre formula echivalentă pentru implicație, construită cu logică tradițională (P=&amp;gt;Q &amp;lt;=&amp;gt; !P || Q). Tot atunci ne-a atras atenția asupra unei situații interesante, principiul implicării adevărului prin fals (0=&amp;gt;1 are valoarea logică 1). Mai exact, e posibil să pleci de la premize greșite și să ajungi la o concluzie corectă. &lt;/p&gt;&lt;p&gt;Citatul de mai sus este interesant din alt motiv: Premizele de la care se pornește sunt rezonabile (studenții nu ar trebui să absenteze de la cursuri și nu ar trebui să aibă serviciu full-time &amp;icirc;n timpul școlii), dar concluzia la care se ajunge (prezența va fi obligatorie la cursuri) este aberantă. Cu alte cuvinte, cineva a greșit calculele pe drum (1=&amp;gt;0 are valoarea logică 0). &lt;/p&gt;&lt;p&gt;Eu le urez celor care păstoresc at&amp;acirc;t de inteligent viitoarele generații de ingineri ale Rom&amp;acirc;niei să pună m&amp;acirc;na pe o carte bună de economie și pe una de logică. Nu de alta, dar suspectez că atunci c&amp;acirc;nd studenții cei mai buni preferă să lucreze pe salarii destul de proaste, nu fac altceva dec&amp;acirc;t să aleagă răul cel mai mic. P&amp;acirc;nă la urmă, mai bine 2 grame de experiență și un salariu oarecare dec&amp;acirc;t c&amp;acirc;teva tone de timp pierdut și burse de c&amp;acirc;teva ori mai mici, nu? &lt;/p&gt;&lt;p&gt;Studenților nu le urez deocamdata nimic. Asta e o discutie pentru altadata.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13848" width="1" height="1"&gt;</description></item><item><title>Profiling 101</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/16/Profiling-101.aspx</link><pubDate>Mon, 16 Oct 2006 04:03:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13830</guid><dc:creator>ovidiupl</dc:creator><slash:comments>7</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13830.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13830</wfw:commentRss><description>&lt;p&gt;Am promis &amp;icirc;n &lt;a href="/ovidiupl/archive/2006/10/08/Feri_1B02_i_2D00_v_0301_-de-surprize.aspx" title="Feriți-vă de surprize"&gt;discuția de acum c&amp;acirc;teva zile&lt;/a&gt; că voi explica mai pe larg cum am utilizat profilerul din Visual Studio Team System pentru a măsura viteza de execuție a unei aplicații C#. M-am g&amp;acirc;ndit eu bine și am ajuns la concluzia că mai bine scriu acest post sub forma unui &amp;icirc;ndrumar pas cu pas, cu ocazia asta urm&amp;acirc;nd să experimentez și modul &amp;icirc;n care se vor &amp;icirc;nțelege &lt;a href="http://windowslivewriter.spaces.live.com/" title="Windows Live Writer"&gt;Windows Live Writer&lt;/a&gt; și &lt;a href="http://www.communityserver.org" title="Community Server"&gt;Community Server&lt;/a&gt; la salvarea pozelor și la ce voi mai &amp;icirc;ncerca eu să fac pe aici. Cu alte cuvinte, dacă nu iese din prima, cel puțin știți de ce. &amp;Icirc;n plus, am făcut tot posibilul să scriu articolul &amp;icirc;n așa fel &amp;icirc;nc&amp;acirc;t să vă descurcați și fără exemplele vizuale.&lt;/p&gt;&lt;h2&gt;Configurarea sistemului&lt;/h2&gt;&lt;p&gt;&amp;Icirc;n primul r&amp;acirc;nd, aveți nevoie de Visual Studio Team Edition for&amp;nbsp;Developers, cu utilitarele de performanță instalate, pe o mașină rezonabil de puternică (pe o mașină cu performanțe mai slabe, viteza aplicației poate avea de suferit fără să fie de vină aplicația &amp;icirc;n sine, de exemplu din cauza paginării). Va trebui să lucrați&amp;nbsp;dintr-un cont de administrator, deoarece pentru anumite configurații despre care vom discuta mai jos&amp;nbsp;este necesară &amp;icirc;ncărcarea unui driver &amp;icirc;n nucleul sistemului de operare, iar această operație are nevoie de privilegii indisponibile utilizatorilor obișnuiți. &amp;Icirc;n fine, pentru a obține de la profiler lista corectă de funcții apelate, veți avea nevoie de simboluri corecte at&amp;acirc;t pentru aplicația voastră, c&amp;acirc;t și pentru binarele Microsoft.&lt;/p&gt;&lt;p&gt;Dacă aveți clientul de Symbol Server instalat corespunzător (conform instrucțiunilor de pe pagina &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx" title="Debugging Tools and Symbols: Getting Started"&gt;Getting Started&lt;/a&gt; de pe site-ul dedicat &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx" title="Debugging Tools for Windows"&gt;Debugging Tools for Windows&lt;/a&gt;), nu mai aveți nimic de făcut. &amp;Icirc;n particular, pe calculatorul meu am configurat variabila de mediu _NT_SYMBOL_PATH la valoarea SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols pentru toți utilizatorii și obțin automat simbolurile publice de la Microsoft de fiecare dată c&amp;acirc;nd pornesc orice debugger de la Microsoft, de la WinDbg la Visual Studio. Mai puteți face &amp;quot;set _NT_SYMBOL_PATH=SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols&amp;quot; dintr-o consolă de Windows și lansați Visual Studio de acolo și sunt destul de sigur că puteți configura calea și din Tools - Options - Debugging - Symbols, dar nu am &amp;icirc;ncercat asta niciodată.&lt;/p&gt;&lt;h2&gt;Aplicația&lt;/h2&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13758/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13758/thumb.aspx" width="100" /&gt;&lt;/a&gt; Presupun&amp;acirc;nd că toate condiţiile de bază sunt &amp;icirc;ndeplinite,&amp;nbsp;deschideți un Visual Studio și creați o aplicație C# de consolă. Eu am denumit proiectul &amp;quot;Grayscale&amp;quot;, dar&amp;nbsp;&amp;icirc;i puteți spune&amp;nbsp;cum doriți. Adăugați o referință la System.Drawing.dll, directivele using corespunzătoare, și adăugați următoarea funcție &amp;icirc;n clasa care conține programul principal:&lt;/p&gt;&lt;pre&gt;static void Grayscale(Bitmap img)&lt;br /&gt;{&lt;br /&gt;  if (img.PixelFormat != PixelFormat.Format24bppRgb)&lt;br /&gt;  {&lt;br /&gt;    // Mental note: Never embed strings in code like this&lt;br /&gt;    throw new ArgumentException(&amp;quot;Expected a 24 bpp bitmap&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;  BitmapData bmpData = null;&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;    bmpData = img.LockBits(&lt;br /&gt;      new Rectangle(0, 0, img.Width, img.Height),&lt;br /&gt;      ImageLockMode.ReadWrite, img.PixelFormat);  &lt;br /&gt;&lt;br /&gt;    unsafe&lt;br /&gt;    {&lt;br /&gt;      for (int y = 0; y &amp;lt; img.Height; y++)&lt;br /&gt;      {&lt;br /&gt;        byte* src = (byte*)bmpData.Scan0 + y * bmpData.Stride;&lt;br /&gt;        for (int x = 0; x &amp;lt; img.Width; x++, src += 3)&lt;br /&gt;        {&lt;br /&gt;          src[0] = src[1] = src[2] = (byte)(0.2125 * src[2] +&lt;br /&gt;                            0.7154 * src[1] + 0.0721 * src[0]);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  finally&lt;br /&gt;  {&lt;br /&gt;    if (bmpData != null)&lt;br /&gt;    {&lt;br /&gt;      img.UnlockBits(bmpData);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Programul principal e destul de simplu - deschide primul fișier primit pe linia de comandă, &amp;icirc;l transformă și &amp;icirc;l salvează &amp;icirc;n al doilea:&lt;/p&gt;&lt;pre&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;    if (args.Length != 2)&lt;br /&gt;    {&lt;br /&gt;      // Mental note: Never embed strings in code like this&lt;br /&gt;      throw new ArgumentException(&amp;quot;Usage: Grayscale InputFile.bmp OutputFile.bmp&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    Bitmap bmp = new Bitmap(args[0]);&lt;br /&gt;    Grayscale(bmp);&lt;br /&gt;    bmp.Save(args[1]);&lt;br /&gt;  }&lt;br /&gt;  catch (Exception e)&lt;br /&gt;  {&lt;br /&gt;    Console.WriteLine(e.Message);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13762/original.aspx"&gt;&lt;img align="left" height="73" src="/photos/ovidiupl/images/13762/thumb.aspx" width="100" /&gt;&lt;/a&gt; &lt;a href="/photos/ovidiupl/images/13764/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13764/thumb.aspx" width="100" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ajunși &amp;icirc;n stadiul acesta, trebuie să configurăm puțin proiectul pentru a &amp;icirc;l putea compila cu succes. Deschideți&amp;nbsp;proprietățile proiectului&amp;nbsp;(&amp;icirc;n Solution Explorer, faceți clic pe dreapta pe proiectul Grayscale) și mergeți la pagina &amp;quot;Build&amp;quot;. &amp;Icirc;n caseta &amp;quot;Configuration&amp;quot; selectați &amp;quot;All Configurations&amp;quot;, după care bifați opțiunea &amp;quot;Allow unsafe code&amp;quot;. Vă mai recomand și să treceți prin pagina &amp;quot;Debug&amp;quot;&amp;nbsp;și să deselectați opțiunea &amp;quot;Enable the Visual Studio hosting process&amp;quot; (Există &amp;icirc;n MSDN Library explicații despre &lt;a href="http://msdn2.microsoft.com/en-us/library/ms242202.aspx" title="Debugging and the Hosting Process"&gt;Visual Studio hosting process&lt;/a&gt;; pe scurt, oferă servicii gen partial trust debugging și design-time expression evaluation. Nu este necesar pentru măsurătorile noastre, și cu c&amp;acirc;t avem&amp;nbsp;mai puține procese pornite, cu at&amp;acirc;t mai bine).&lt;/p&gt;&lt;h2&gt;Măsurătorile&lt;/h2&gt;&lt;h2&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13765/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13765/thumb.aspx" width="100" /&gt;&lt;/a&gt; Formalitățile fiind &amp;icirc;ncheiate, putem trece la partea interesantă. Selectați configurația &amp;quot;Release&amp;quot; a proiectului (&amp;icirc;n general, e bine să aveți grijă să nu măsurați viteza versiunii de debug) și deschideți fereastra &amp;quot;Performance Explorer&amp;quot; (View - Other Windows - Performance Explorer). Dacă nu găsiți comanda, e posibil să nu aveți Visual Studio Team Edition for Developers instalat (vezi pasul 1) sau să vă fi particularizat mediul de dezvoltare &amp;icirc;n cine știe ce fel, caz &amp;icirc;n care va trebui să deschideți dialogul &amp;quot;Customize&amp;quot; cu Tools - Customize, să selectați pagina &amp;quot;Commands&amp;quot; și să căutați comanda &amp;quot;Performance Explorer&amp;quot; &amp;icirc;n grupul &amp;quot;View&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13767/original.aspx"&gt;&lt;img align="left" height="73" src="/photos/ovidiupl/images/13767/thumb.aspx" width="100" /&gt;&lt;/a&gt; &lt;a href="/photos/ovidiupl/images/13770/original.aspx"&gt;&lt;img align="right" height="63" src="/photos/ovidiupl/images/13770/thumb.aspx" width="100" /&gt;&lt;/a&gt; &amp;Icirc;n fereastra &amp;quot;Performance Explorer&amp;quot;, faceți clic pe &amp;quot;New Performance Session&amp;quot;. Va fi creată automat o sesiune numită &amp;quot;PerformanceN&amp;quot;, cu două subdirectoare, &amp;quot;Targets&amp;quot; și &amp;quot;Reports&amp;quot;. Faceți clic pe dreapta pe &amp;quot;Targets&amp;quot; și selectați &amp;quot;Add Target Project&amp;quot;. &amp;Icirc;ntruc&amp;acirc;t proiectul Grayscale este singurul care face parte din soluție, va fi adăugat automat ca țintă. Faceți clic pe dreapta pe Grayscale și deschideți fereastra de proprietăți. Pe pagina &amp;quot;Launch&amp;quot;, bifați &amp;quot;Override project settings&amp;quot;, iar &amp;icirc;n caseta &amp;quot;Arguments&amp;quot; introduceți calea completă spre fișierul .BMP care va fi folosit drept intrare și calea completă spre ieșire (de exemplu, &amp;#39;C:\Grayscale\Test\Input.bmp C:\Grayscale\Test\Output.bmp&amp;#39;, fără apostrofuri). Eu am folosit ca intrare o poză oarecare, de 2048 x 1536 pixeli, convertită la&amp;nbsp;formatul BMP 24 bpp (cam 9 MB și ceva). Nu uitați să folosiți ghilimele &amp;icirc;n cazul &amp;icirc;n care numele conțin spații. Salvați setările și &amp;icirc;nchideți fereastra.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13775/original.aspx"&gt;&lt;img align="right" height="65" src="/photos/ovidiupl/images/13775/thumb.aspx" width="100" /&gt;&lt;/a&gt; Salvați sesiunea de performanță pe care tocmai ați creat-o (eu am salvat-o &amp;icirc;n același director cu proiectul, și i-am dat același nume). Faceți clic pe dreapta pe sesiunea de performanță și deschideți fereastra de proprietăți. &amp;Icirc;n pagina &amp;quot;General&amp;quot;, configurați opțiunea &amp;quot;Profiling collection&amp;quot; pe valoarea &amp;quot;Instrumentation&amp;quot; (implicit este pe &amp;quot;Sampling&amp;quot;). Deoarece ne interesează să evaluăm doar viteza aplicației, nu vom configura secțiunea &amp;quot;.NET memory profiling collection&amp;quot; (deși sunt lucruri interesante de văzut și acolo). Verificați că &amp;icirc;n pagina &amp;quot;Launch&amp;quot; este bifat proiectul Grayscale (ar trebui să fie bifat implicit, și nu există alte opțiuni oricum). Salvați setările și &amp;icirc;nchideți fereastra.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13781/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13781/thumb.aspx" width="100" /&gt;&lt;/a&gt; &amp;Icirc;n acest moment, &amp;icirc;n &amp;quot;Performance Explorer&amp;quot; ar trebui să mai fi apărut un buton numit &amp;quot;Launch&amp;quot;. Faceți clic pe el pentru a rula aplicația. După terminarea procesului, Visual Studio va descărca datele obținute și le va transforma &amp;icirc;ntr-o serie de rapoarte. &amp;Icirc;n acest timp, e o idee bună să monitorizați fereastra Output - dacă observați mesage de genul &amp;quot;Failed to load pdb for module ...&amp;quot;, &amp;icirc;nseamnă că nu ați configurat corespunzător simbolurile (vezi pasul 1).&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13789/original.aspx"&gt;&lt;img align="left" height="73" src="/photos/ovidiupl/images/13789/thumb.aspx" width="100" /&gt;&lt;/a&gt; &amp;Icirc;n&amp;nbsp;pagina de sumar sunt afișate funcțiile cele mai interesante din program. Primul grup afișează funcțiile apelate de cele mai multe ori, al doilea afișează funcțiile &amp;icirc;n care este petrecut cel mai mult timp (fără a pune la socoteală funcțiile apelate de acestea), iar al treilea afișează funcțiile care durează cel mai mult. După părerea mea, pagina aceasta este cel mai puțin interesantă, &amp;icirc;n special din cauza terminologiei alese pentru cele trei grupuri (Care e diferența &amp;icirc;ntre al doilea și al treilea grup? De ce &amp;icirc;n al doilea grup, funcția get_Width apare cu 1114 ms, iar &amp;icirc;n al treilea are 1253 ms?). Chiar și așa, e ușor de observat care sunt cele mai &amp;quot;interesante&amp;quot; apeluri de funcție.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13790/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13790/thumb.aspx" width="100" /&gt;&lt;/a&gt; Ceva mai interesantă este pagina &amp;quot;Functions&amp;quot; din raport. Puteți vedea o listă plată de funcții, sau le puteți grupa după modulul de care aparțin. Implicit, sunt afișate coloane pentru numărul de apeluri și pentru cele mai importante măsurători de timp. Puteți adăuga și alte coloane, dacă doriți, și puteți sorta datele cum vă este mai la &amp;icirc;ndem&amp;acirc;nă.&lt;/p&gt;&lt;p&gt;&amp;quot;Exclusive time&amp;quot; este termenul pentru timpul petrecut exclusiv &amp;icirc;n codul unei funcții, fără a include &amp;icirc;n această valoare timpul petrecut &amp;icirc;n funcțiile apelate, pe c&amp;acirc;nd &amp;quot;Inclusive time&amp;quot; este termenul pentru timpul petrecut &amp;icirc;ntr-o funcție, cu tot cu graful de funcții pe care aceasta le-a apelat. Diferența dintre &amp;quot;Elapsed&amp;quot; și &amp;quot;Application&amp;quot; este simplă: Primul termen desemnează timpul fizic petrecut &amp;icirc;n funcția respectivă (numit și &amp;quot;wall-clock time&amp;quot;), pe c&amp;acirc;nd al doilea desemnează timpul de procesor consumat efectiv de acea funcție, convertit la milisecunde. Dacă tot suntem aici, explicații complete privind termenii utilizați &amp;icirc;n Visual Studio găsiți pe pagina &lt;a href="http://msdn2.microsoft.com/en-us/library/z9z62c29.aspx" title="Understanding Performance Terms"&gt;Understanding Performance Terms&lt;/a&gt; din MSDN.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n practică,&amp;nbsp;cele două valori&amp;nbsp;nu coincid niciodată, cel puțin pentru că &amp;icirc;n sistemele de operare multitasking, nucleul sistemului &amp;icirc;ntrerupe periodic fiecare aplicație pentru a oferi și altora șansa de a rula. Dacă tot suntem la acest subiect, spunem despre un program că este &amp;quot;CPU bound&amp;quot; atunci c&amp;acirc;nd &amp;quot;Application time&amp;quot; tinde spre &amp;quot;Elapsed time&amp;quot; sau, cu alte cuvinte c&amp;acirc;nd aplicația folosește procesorul la capacitatea maximă permisă de sistemul de operare. Cealaltă extremă este reprezentată de aplicații &amp;quot;I/O bound&amp;quot;, &amp;icirc;n care &amp;quot;Elapsed time&amp;quot; este mult mai mare mare dec&amp;acirc;t &amp;quot;Application time&amp;quot;, deoarece aplicația depinde mai mult de sistemele de intrare/ieșire ale calculatorului (de exemplu, transferul unui fișier mare peste o conexiune lentă).&lt;/p&gt;&lt;p&gt;&amp;Icirc;ntre cele două extreme găsim un spectru foarte variat, despre care nu vom discuta azi. Merită totuși amintit că un aspect nu &amp;icirc;l exclude complet pe celălalt: Cele mai multe aplicații au nevoie de ambele resurse, dar una din ele se &amp;icirc;nt&amp;acirc;mplă să domine. Există și aplicații care au nevoie &amp;icirc;n măsură aproximativ egală de timp de procesor și&amp;nbsp;de operații de intrare/ieșire, cel mai comun exemplu de aplicație lacomă cu toate resursele fiind compilatorul de C++.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13791/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13791/thumb.aspx" width="100" /&gt;&lt;/a&gt; Trec&amp;acirc;nd pe pagina &amp;quot;Call Tree&amp;quot;, găsim aceleași informații, dar organizate &amp;icirc;ntr-un arbore de apeluri. Aceasta este una din vederile mele preferate, pentru că scoate foarte ușor &amp;icirc;n evidență locurile unde &amp;icirc;și petrece aplicația timpul. &amp;Icirc;n cazul nostru, din datele obținute reiese că funcția Main este nesemnificativă, deoarece din timpul total de rulare (3054 ms), aplicația petrece 3 ms &amp;icirc;n Main. Se vede, &amp;icirc;n schimb, că execuția funcției Grayscale domină timpul total de rulare, cu 2485 ms, și că aplicația petrece 50 ms &amp;icirc;ncărc&amp;acirc;nd imaginea de pe disc și 515 ms salv&amp;acirc;nd rezultatul (puteți investiga de ce apare această discrepanță ca exercițiu).&lt;/p&gt;&lt;p&gt;Continu&amp;acirc;nd disecarea rezultatelor, observăm că Program.Grayscale petrece 1231 ms făc&amp;acirc;nd operații proprii, dar că aproximativ 2485 - 1231 = 1254 ms sunt petrecute &amp;icirc;n funcțiile apelate. Dintre acestea, iese imediat &amp;icirc;n evidență faptul că 1253 ms sunt petrecute &amp;icirc;n Image.get_Width, care este apelată de un număr de ori apropiat de numărul pixelilor din imagine.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13793/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13793/thumb.aspx" width="100" /&gt;&lt;/a&gt; Pentru că am ales un program simplu ca exemplu, investigația noastră se oprește aici: Știm că dimensiunile pozei nu se schimbă pe parcursul execuției algoritmului, așa că vom apela o singură dată Image.get_Width și vom salva rezultatele &amp;icirc;ntr-o variabilă locală:&lt;/p&gt;&lt;pre&gt;bmpData = img.LockBits(&lt;br /&gt;  new Rectangle(0, 0, img.Width, img.Height),&lt;br /&gt;  ImageLockMode.ReadWrite, img.PixelFormat); &lt;br /&gt;&amp;nbsp;&lt;br /&gt;int width = img.Width;&lt;br /&gt;int height = img.height;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;unsafe&lt;br /&gt;{&lt;br /&gt;  for (int y = 0; y &amp;lt; height; y++)&lt;br /&gt;  {&lt;br /&gt;    byte* src = (byte*)bmpData.Scan0 + y * bmpData.Stride;&lt;br /&gt;    for (int x = 0; x &amp;lt; width; x++, src += 3)&lt;br /&gt;    {&lt;br /&gt;      src[0] = src[1] = src[2] = (byte)(0.2125 * src[2] +&lt;br /&gt;        0.7154 * src[1] + 0.0721 * src[0]);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;(Am scos &amp;icirc;n afara buclei și apelul Image.get_Height, pentru simetrie).&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13796/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13796/thumb.aspx" width="100" /&gt;&lt;/a&gt; Cu codul modificat, după &amp;icirc;ncă o rundă de măsurători rezultatele se schimbă destul de radical: &amp;nbsp;Timpul total de execuție scade la 157 ms, din care funcția de conversie la alb-negru ocupă 51 ms, &amp;icirc;ncărcarea imaginii durează 45 ms, iar salvarea ei 57 ms (ciudat, chiar ar merita investigat de ce &amp;icirc;n cealaltă rundă de măsurări salvarea era de 10 ori mai lentă).&lt;/p&gt;&lt;p&gt;&amp;Icirc;nainte de a &amp;icirc;ncheia, mai merită vorbit despre c&amp;acirc;teva lucruri. &amp;Icirc;n primul r&amp;acirc;nd, c&amp;acirc;nd am configurat sesiunea de performanță, ați observat că am schimbat tipul măsurării efectuate din &amp;quot;Sampling&amp;quot; &amp;icirc;n &amp;quot;Instrumentation&amp;quot;. Cele două metode sunt radical diferite, și merită scoasă &amp;icirc;n evidență diferența dintre ele.&lt;/p&gt;&lt;p&gt;La instrumentarea unei aplicații, profilerul inserează cod suplimentar pentru fiecare apel de funcție (&amp;icirc;naintea lui, și după el) pentru a măsura timpul de execuție al fiecărei componente. Această metodă are avantajul că este precisă, &amp;icirc;n sensul că oferă informații exacte despre numărul de apeluri efectuate, despre funcțiile care apelează și sunt apelate de o anumită funcție, și rezonabil de exacte despre timpii de execuție. Spun &amp;quot;rezonabil de exacte&amp;quot; deoarece inserarea codului suplimentar de către profiler afectează memoria ocupată, ca și viteza aplicației.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13798/original.aspx"&gt;&lt;img align="right" height="65" src="/photos/ovidiupl/images/13798/thumb.aspx" width="100" /&gt;&lt;/a&gt; Tehnica de măsurare prin sampling este radical diferită: Periodic, sistemul de operare &amp;icirc;ntrerupe execuția tuturor firelor de execuție din procesul monitorizat, parcurge stiva fiecărui fir de execuție din acel moment și memorează această stivă. Sunt de notat c&amp;acirc;teva lucruri aici: &amp;Icirc;n primul r&amp;acirc;nd, metoda de măsurare este inexactă, deoarece procesul nu poate fi suspendat la fiecare instrucțiune executată. Intervalul de timp la care are loc &amp;icirc;ntreruperea este de obicei de ordinul milioanelor de perioade de ceas (1 - 10 milioane).&lt;/p&gt;&lt;p&gt;Apoi, pentru ca datele obținute să aibă valoare, ele trebuie să fie relevante din punct de vedere statistic; cu alte cuvinte, numărul de mostre adunate trebuie să fie cel puțin de ordinul miilor, dacă nu mai mare (cu c&amp;acirc;t mai mare, cu at&amp;acirc;t mai bine).&lt;/p&gt;&lt;p&gt;&amp;Icirc;n al treilea r&amp;acirc;nd, nu suntem obligați ca pe axa X să avem timpul ca unitate de măsură. De exemplu, putem instrui profilerul să ia o mostră la fiecare 50 de hard page faults. Evident, schimb&amp;acirc;nd unitatea de măsură, schimbăm &amp;icirc;nțelesul datelor: Funcțiile care vor apărea &amp;icirc;n acest caz nu sunt cele mai interesante din punctul de vedere al vitezei, ci al accesului la memoria internă și externă a sistemului.&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13799/original.aspx"&gt;&lt;img align="left" height="65" src="/photos/ovidiupl/images/13799/thumb.aspx" width="100" /&gt;&lt;/a&gt; &amp;Icirc;n al patrulea r&amp;acirc;nd, contează extrem de mult frecvența cu care sunt adunate mostrele. Dacă intervalul ales e prea mare, ne vom alege cu mai puține mostre, deci scade relevanța statistică a setului de date colectat. Pe de altă parte, dacă intervalul e prea mic, vom ajunge să &amp;icirc;ntrerupem procesul prea des și &amp;icirc;i vom afecta performanțele &amp;icirc;n mod negativ fără ca procesul să fie vinovat de acest lucru (de exemplu prin introducerea forțată a unui număr prea mare de schimbări de context).&lt;/p&gt;&lt;p&gt;&lt;a href="/photos/ovidiupl/images/13826/original.aspx"&gt;&lt;img align="right" height="73" src="/photos/ovidiupl/images/13826/thumb.aspx" width="100" /&gt;&lt;/a&gt; &amp;Icirc;n fine, am lăsat la urmă unul din aspectele cele mai importante: Din punctul de vedere al sistemului de operare, o stivă e o stivă și at&amp;acirc;t. Nu contează că pe ea se află funcții native sau .NET, profilerul va evalua tot. &amp;Icirc;n felul acesta, putem diseca mult mai precis modul &amp;icirc;n care lucrează o aplicație (așa am aflat de exemplu că apelul Image.get_Width este lent deoarece există o tranziție spre cod nativ și un nivel de sincronizare).&lt;/p&gt;&lt;p&gt;M-am lungit cu vorba, așa că mai bine mă opresc aici. Am pus la &amp;icirc;n pagina &amp;nbsp;&lt;a href="/photos/ovidiupl/category1106.aspx" title="Profiling 101 (74)"&gt;Profiling 101&lt;/a&gt;&amp;nbsp;toate imaginile pe care le-am cules cu ocazia acestui experiment. Nu voi intra azi &amp;icirc;n subiecte precum automatizarea acestui proces, configurarea mașinilor de test și a testelor pentru că mai am nevoie de subiecte și pentru altă dată. Și &amp;icirc;ncă nu am ajuns la garbage collector.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n fine, nu mi-e clar nici măcar acum dacă pluralul pentru &amp;quot;apostrof&amp;quot; este &amp;quot;apostrofuri&amp;quot; (așa cum am scris aici) sau &amp;quot;apostroafe&amp;quot; (așa cum am scris prin alte articole). Am fost pe &lt;a href="http://www.dexonline.ro"&gt;www.dexonline.ro&lt;/a&gt; și au vreo cinci intrări pentru acest cuv&amp;acirc;nt, provenind din diferite dicționare. Prima variantă apare mai des, dar apare și a doua (cel puțin o dată).&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13830" width="1" height="1"&gt;</description></item><item><title>Probleme cu memoria?</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/13/Probleme-cu-memoria_3F00_.aspx</link><pubDate>Fri, 13 Oct 2006 16:24:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13746</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13746.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13746</wfw:commentRss><description>Claudio Caldato,&amp;nbsp;program manager &amp;icirc;n grupul CLR,&amp;nbsp;și Maoni Stephens, developer &amp;icirc;n același grup, au un articol foarte reușit &amp;icirc;n MSDN Magazine de luna aceasta despre &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/11/CLRInsideOut/" title="Investigating Memory Issues"&gt;investigarea problemelor de memorie&lt;/a&gt; &amp;icirc;n aplicații .NET. Nu exagerez deloc c&amp;acirc;nd spun că dacă parcurgeți acest articol și cele c&amp;acirc;teva articole de pe blogs.msdn.com la care se face referire, e foarte probabil să fiți &amp;icirc;n stare să depanați pe cont propriu cam orice problemă de performanță legată de alocarea obiectelor &amp;icirc;n aplicații .NET.&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Flash+Update" rel="tag"&gt;Flash Update&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13746" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Flash+Update/default.aspx">Flash Update</category></item><item><title>Feriți-vă de surprize</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/08/Feri_1B02_i_2D00_v_0301_-de-surprize.aspx</link><pubDate>Sun, 08 Oct 2006 04:47:28 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13703</guid><dc:creator>ovidiupl</dc:creator><slash:comments>8</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13703.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13703</wfw:commentRss><description>&lt;p&gt;... Când evaluați performanțele aplicațiilor.&lt;/p&gt; &lt;p&gt;Am citit cu interes astăzi &lt;a href="/victorparaschiv/archive/2006/10/07/O-surpriz_0301_-inedit_0301_.aspx"&gt;articolul lui Victor&lt;/a&gt; despre lucrul cu clasa Bitmap și diferențele surprinzătoare de performanță cauzate de două apeluri de funcție. Dacă nu ați citit încă articolul, chestiunea arată în rezumat cam așa:&lt;/p&gt; &lt;p&gt;Un obiect de tip System.Drawing.Bitmap este transformat (aici, în particular, o imagine color este transformată în alb-negru). Transformarea se face iterând peste fiecare pixel al imaginii și accesând direct datele care compun imaginea, folosind cod C# unsafe. Victor a observat că dacă scrie bucla în care se face prelucrarea așa:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;int width = bmp.Width;&lt;br&gt;int height = bmp.Height;&lt;br&gt;for (int y = 0; y &amp;lt; height; y++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int x = 0; x &amp;lt; width; x++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...]&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;... În loc de așa...&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;for (int y = 0; y &amp;lt; bmp.Height; y++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int x = 0; x &amp;lt; bmp.Width; x++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...]&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;... Creșterea de performanță este semnificativă (de la 2 secunde la 0.3 secunde pe testul lui).&lt;/p&gt; &lt;p&gt;Dacă am înțeles bine, explicația oferită de Victor a fost că salvarea rezultatelor în două variabile locale face ca utilizarea lor să fie mult mai rapidă decât citirea lor repetată din memorie.&lt;/p&gt; &lt;p&gt;În vreme ce explicația este plauzibilă, pentru mine ea nu este satisfăcătoare, deoarece nu este susținută cu măsurători concrete. În plus, intuiția îmi spune că back-end-ul compilatorului JIT ar trebui să înlocuiască&amp;nbsp;o instrucțiune de forma "x &amp;lt; bmp.get_Width()" (pentru JIT noțiunea de proprietate nu prea există) cu echivalentul lui&amp;nbsp;"x &amp;lt; bmp.m_width", presupunând că obiectul Bitmap implementează proprietatea ca pe o fațadă pentru o variabilă internă; în funcție de metoda compilată, este posibil pentru JIT chiar și să salveze acea variabilă într-un registru, dacă este foarte des folosită. Chiar și dacă apelul de funcție nu ar fi fost substituit inline,&amp;nbsp;diferența de viteză nu avea cum să fie atât de mare câtă vreme acea proprietate nu ar fi făcut altceva decât să returneze o valoare precalculată.&lt;/p&gt; &lt;p&gt;Ca să nu cad în același păcat, cel de a susține o ipoteză fără date, m-am pus pe măsurat. Am construit o aplicație de test cât mai asemănătoare, am compilat o versiune retail și am pus profilerul pe ea. Într-adevăr, pentru varianta care apela proprietatea la fiecare iterație a buclei, testul meu dura în medie 750 ms, pentru varianta care salva rezultatele în variabile locale, testul dura în medie 16 ms (cam de 47 de ori mai rapid), o îmbunătățire chiar mai spectaculoasă decât cea observată de Victor, cauzată probabil de faptul că testul meu a fost extrem de simplist, în vreme ce al lui bănuiesc că făcea operații mai complexe care mascau într-o oarecare măsură pierderea de viteză.&lt;/p&gt; &lt;p&gt;Folosind un profiler, însă, am aflat ceva ce nu aș fi putut descoperi altfel: Proprietățile Width și Height ale clasei Bitmap sunt doar wrappere pentru apeluri interne de funcții GDI+. Cu alte cuvinte, valorile returnate provin din cod nativ (unde sunt probabil stocate într-un câmp oarecare) și trec prin nivelul P/Invoke din CLR. Mai mult, dacă e să dau crezare profilerului, implementarea nativă a funcțiilor este thread-safe, și o bună parte din timp este petrecut de fapt în mecanismul de sincronizare.&lt;/p&gt; &lt;p&gt;Ca să nu mă lungesc prea mult cu vorba, am de fapt de spus două lucruri.&lt;/p&gt; &lt;p&gt;În primul rând, aveți grijă cum utilizați proprietățile în .NET. Sunt deosebit de înșelătoare, deoarece sunt construite în așa fel încât să pară variabile, dar sunt de fapt apeluri de funcție. Asta înseamnă că nu e obligatoriu să fie pur și simplu fațade pentru niște variabile interne, ci pot fi apeluri extrem de complexe, care conțin sincronizare, efecte colaterale și toate bucuriile oferite de programarea imperativă în general. Exemplul meu favorit sunt expresiile de forma "a.X += b.Y", în care unii programatori nici nu realizează că se ascund trei apeluri de funcție (plus o adunare și o atribuire ca bonus).&lt;/p&gt; &lt;p&gt;În al doilea rând, atunci când întâmpinați probleme de performanță, sau pur și simplu diferențe inexplicabile, nu aruncați cu ipoteze fără să le susțineți cu date. Ca regulă generală în domeniul performanțelor aplicațiilor, dacă ați găsit o explicație pentru un fenomen oarecare pe căi pur teoretice, e foarte probabil ca explicația&amp;nbsp;să fie&amp;nbsp;greșită.&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13703" width="1" height="1"&gt;</description></item><item><title>O perlă</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/10/05/O-perl_0301_.aspx</link><pubDate>Wed, 04 Oct 2006 21:29:17 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13673</guid><dc:creator>ovidiupl</dc:creator><slash:comments>14</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13673.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13673</wfw:commentRss><description>&lt;p&gt;Citind niște cod,&amp;nbsp;am avut azi un mic moment&amp;nbsp;"WTF?!". Spuneți-mi și mie dacă vi se pare în regulă o declarație de funcție (aici, în particular, C++, dar ar putea fi în orice limbaj) de forma:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;void EnumerateSomeDataStructure(LPCTSTR criteria, bool bDisplay, bool bErase, bool bQueue, bool bEraseQueued)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Dacă nu, ce anume e greșit aici?&lt;/p&gt; &lt;p&gt;(În realizarea acestei reconstituiri, identitatea celor implicați a fost ascunsă pentru a proteja martorii)&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13673" width="1" height="1"&gt;</description></item><item><title>Dileme de programator</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/09/29/Dileme-de-programator.aspx</link><pubDate>Fri, 29 Sep 2006 18:34:10 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13628</guid><dc:creator>ovidiupl</dc:creator><slash:comments>9</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13628.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13628</wfw:commentRss><description>&lt;p&gt;Probabil am mai povestit pe aici despre faptul că în vara anului 2003 am participat la un stagiu de practică (aka "internship") la Microsoft, tot în cadrul grupului CLR. La vremea respectivă, cantitatea şi calitatea instrumentaţiei disponibile în Windows şi în CLR au fost două din aspectele surprinzătoare pentru mine&amp;nbsp;(în particular, mă refer la &lt;a title="Event Tracing for Windows" href="http://windowssdk.msdn.microsoft.com/en-us/library/ms683347.aspx"&gt;instrumentaţia ETW&lt;/a&gt;, despre care nici nu ştiam că există la vremea respectivă).&lt;/p&gt; &lt;p&gt;Mai auzisem eu că în codul din nucleul sistemelor de operare, cam 30% din linii conţin funcţionalitatea propriu-zisă, restul de 70%&amp;nbsp;având grijă de tratarea erorilor şi de diverse alte elemente de infrastructură, dar am avut atunci pentru prima dată ocazia să beneficiez în practică de existenţa acelei infrastructuri, din perspectiva consumatorului de informaţie, iar posibilitatea de a vedea câte o "radiografie" a Windows în timp real s-a dovedit nepreţuită.&lt;/p&gt; &lt;p&gt;Tot atunci am auzit de la managerul meu o expresie care mi-a rămas întipărită - "Dacă ai cere cuiva să conducă o maşină fără indicatoare pe bord, ar spune că eşti nebun. Cu toate astea, majoritatea covârşitoare a aplicaţiilor din prezent nu au nici un fel de indicatoare ale stării lor interne."&lt;/p&gt; &lt;p&gt;În ziua de azi este o naivitate să spui că o aplicație este satisfăcătoare din punctul de vedere al calității doar pentru că îndeplinește cerințele funcționale din specificații.&lt;/p&gt; &lt;p&gt;În ultimii ani, ne-am obișnuit faptul că pe lângă criteriul menționat mai sus, o altă cerință minimă pentru orice aplicație este securitatea. E drept, se poate spune că securitatea codului este o consecință a calității lui, dar de obicei securitatea componentelor individuale ale unui sistem nu garantează automat securitatea sistemului pe ansamblu. Mai sunt necesari pași suplimentari la nivel arhitectural, cum ar fi analiza amenințărilor, încadrarea lor în categorii de risc șamd,&amp;nbsp;dar (de multe ori) şi la nivel de implementare.&lt;/p&gt; &lt;p&gt;Similar, o altă cerinţă pe care trebuie să o îndeplinească orice aplicaţie este performanţa. Există, de altfel, oarecare similitudini între performanţă şi securitate, ca aspecte ale unei aplicaţii. E foarte dificil să demonstrezi că o&amp;nbsp;bucată de cod&amp;nbsp;este sigură sau performantă în absenţa unor obiective clare în această privinţă, dar este foarte uşor să recunoşti o aplicaţie nesigură sau neperformantă. Din păcate, pentru relativ mulţi producători de software, aceste aspecte nu apar în planificarea iniţială, ci sunt "ataşate" pe parcurs, atunci când lucrurile încep să scârţâie.&lt;/p&gt; &lt;p&gt;Enumerarea ar putea continua mult și bine. Am putea vorbi despre ușurința instalării, actualizării și ștergerii aplicațiilor, mai ales că "grija" cu care majoritatea producătorilor de software se ocupă de aceste aspecte e îngrijorătoare. Sau am putea vorbi despre instrumentare - subiectul cu care am deschis azi discuția - despre posibilitatea de a privi direct în măruntaiele unei aplicații pentru a înțelege ce se întâmplă cu ea, și mai ales de ce. Sau despre globalizarea și localizarea aplicațiilor, subiecte mult mai dificile decât par. Probabil că oricâte aspecte aș numi, tot aș uita alte câteva, la fel de importante.&lt;/p&gt; &lt;p&gt;Pentru unele probleme, soluțiile tehnice abundă. Când vine vorba de instrumentare, mă refer de exemplu la &lt;a title="Event Tracing for Windows" href="http://windowssdk.msdn.microsoft.com/en-us/library/ms683347.aspx"&gt;ETW&lt;/a&gt; și &lt;a title="Windows Management Instrumentation" href="http://windowssdk.msdn.microsoft.com/en-us/library/ms758323.aspx"&gt;WMI&lt;/a&gt;, la &lt;a title="Performance Counters" href="http://windowssdk.msdn.microsoft.com/en-us/library/ms712497.aspx"&gt;contoare de performanță&lt;/a&gt;, &lt;a title="Event Logging" href="http://windowssdk.msdn.microsoft.com/en-us/library/ms767916.aspx"&gt;event logging&lt;/a&gt;, dar și la soluții low-tech gen OutputDebugString sau scrierea de mesaje într-un fișier. Pentru altele, cum este securitatea, este nevoie de pregătire specializată.&lt;/p&gt; &lt;p&gt;Întrebarea mea este simplă: Pentru a scrie o aplicație, este de cele mai multe ori nevoie de programatori&amp;nbsp;cu aptitudini relativ specializate. Unii sunt mai buni cu bazele de date, alții cu aplicațiile distribuite, alții cu interfețele Windows, web, (XAML?), și tot așa. Nu poți lua pe cineva care a lucrat ultimii câțiva ani în domeniul rețelelor și să-l faci peste noapte specialist în formate audio. Cum punem în echilibru nevoia de a crea aplicații cu adevărat industriale (care îndeplinesc toate criteriile menționate mai sus) cu necesitatea de a utiliza resursele fiecărui programator acolo unde este mai priceput?&lt;/p&gt; &lt;p&gt;Este mai&amp;nbsp;bine ca fiecare programator să devină expert și în securitate, performanță șamd, pe lângă bagajul de cunoștințe specializate la care apelează în activitatea de zi cu zi? Sau este mai eficient să avem specialiști în aceste aspecte, care lucrează cu toate componentele unui proiect și au grijă de aplicație pe ansamblu, dar introduc un nivel suplimentar de indirectare (sau birocrație, sau proces, sau cum vreți să-i spuneți).&lt;/p&gt; &lt;p&gt;Sunt de părere că pentru proiecte mici, cu buget și echipe restrânse, fiecare participant trebuie să poată avea grijă pe cont propriu de aceste aspecte, pentru componentele pe care le construiește. Pe termen lung, însă, cred că e benefică existența unui specialist în performanță sau securitate, care să aibă rol de supervizor și dictator la nivelul întregului proiect. Mai cred și că nu toate aspectele trebuie tratate în mod egal; de exemplu nu mă aștept ca toți programatorii să înțeleagă subtilitățile legate de securitatea sau de internaționalizarea aplicațiilor la același nivel la care o face un specialist; pe de altă parte, însă, mă aștept ca orice programator să știe să folosească un debugger, un profiler, să-și instrumenteze codul și să includă toate aspectele relevante în proiectarea aplicației, de la bun început.&lt;/p&gt; &lt;p&gt;Voi ce părere aveți? Prin proiectele la care lucrați, cum sunt tratate aspectele acestea?&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13628" width="1" height="1"&gt;</description></item><item><title>Tehnologia și filmul</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/09/26/Tehnologia-_1902_i-filmul.aspx</link><pubDate>Tue, 26 Sep 2006 19:39:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13614</guid><dc:creator>ovidiupl</dc:creator><slash:comments>2</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13614.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13614</wfw:commentRss><description>Vi s-a &amp;icirc;nt&amp;acirc;mplat vreodată să vă enervați c&amp;acirc;nd un &amp;quot;hacker&amp;quot; fabricat la Hollywood sparge un mega-super-calculator conect&amp;acirc;ndu-se la el cu telnet și folosind o adresă IPv4 care conține numere mai mari de 255? Și mie, dar suntem &amp;icirc;n cele din urmă răzbunați: GideonTech a publicat &lt;a href="http://www.gideontech.com/content/articles/326/1" title="Top 10 Worst Portrayals of Technology in Film"&gt;topul celor mai stupide reprezentări ale tehnologiei &amp;icirc;n filme&lt;/a&gt;. Voi ce ați fi pus &amp;icirc;n listă?&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13614" width="1" height="1"&gt;</description></item><item><title>Reţelele universităţilor şi securitatea datelor</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/09/20/Re_6301_elele-universit_03016301_ilor-_5F01_i-securitatea-datelor.aspx</link><pubDate>Wed, 20 Sep 2006 16:40:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13601</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13601.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13601</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.schneier.com/blog/"&gt;Bruce Schneier&lt;/a&gt; are astăzi un articol interesant pe&amp;nbsp;blog (ca de obicei, de altfel), &lt;a href="http://www.schneier.com/blog/archives/2006/09/university_netw.html"&gt;University Networks and Data Security&lt;/a&gt;. Multe din cele spuse acolo se aplică şi la infrastructura (sau la lipsa infrastructurii) din Politehnică. C&amp;acirc;nd eram student, nodul RoEdu din UPB era administrat de c&amp;acirc;ţiva studenţi şi absolvenţi foarte capabili (care după aceea au ajuns să facă acelaşi lucru pe la diverşi furnizori de internet din Bucureşti şi din ţară), dar securitatea reţelei era pusă pe planul doi, după funcţionalitate (prin 2000 o latenţă de 30 de secunde &amp;icirc;ntre două segmente de reţea din Automatică nu era ceva neobişnuit, dar prin 2002-2003 lucrurile mergeau deja şnur). Mă &amp;icirc;ntreb dacă se mai ocupă cineva de lucrurile astea acum şi dacă se mai g&amp;acirc;ndeşte cineva să &amp;icirc;mbunătăţească lucrurile sau e suficient dacă merg aşa cum merg...&lt;/p&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Flash+Update" rel="tag"&gt;Flash Update&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13601" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Flash+Update/default.aspx">Flash Update</category></item><item><title>Zece lucruri</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/09/08/Zece-lucruri.aspx</link><pubDate>Fri, 08 Sep 2006 04:12:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13553</guid><dc:creator>ovidiupl</dc:creator><slash:comments>7</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13553.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13553</wfw:commentRss><description>&lt;p&gt;... Pe care le-aş face altfel dacă aş fi din nou t&amp;acirc;năr. Nu sunt neapărat zece la număr, şi n-am &amp;icirc;mbătr&amp;acirc;nit aşa de mult de c&amp;acirc;nd am postat ultima oară pe blog, dar &amp;icirc;nţelegeţi voi ideea.&lt;/p&gt;&lt;p&gt;Pe parcursul ultimelor luni am descoperit că viaţa de angajat full-time are un dezavantaj major: Nu mai deţin controlul asupra timpului meu. Am o listă lungă de mini-proiecte la care mi-ar plăcea să implementez c&amp;acirc;te ceva pentru cultura mea tehnică, o listă şi mai lungă de cărţi pe care mi-ar plăcea să le citesc şi o mulţime de alte activităţi pe care mi-ar plăcea să le desfăşor &amp;icirc;n mod regulat. Şi toate astea &amp;icirc;ntre 8-9 ore de somn şi 9-10 ore de lucru &amp;icirc;n fiecare zi.&lt;/p&gt;&lt;p&gt;G&amp;acirc;ndindu-mă la perioadele lungi din liceu şi facultate c&amp;acirc;nd aveam relativ mult timp liber la dispoziţie, am &amp;icirc;ntocmit o listă cu c&amp;acirc;teva lucruri pentru care mi-aş aloca altfel resursele dacă aş mai avea ocazia.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n primul r&amp;acirc;nd, cu riscul de a vă dezamăgi, programator fiind, mi-ar fi plăcut să petrec &lt;strong&gt;mai mult timp scriind cod&lt;/strong&gt;. (Nu vă pierdeţi speranţa, urmează şi lucruri mai interesante ceva mai jos. Şi chiar şi aici, discuţia nu va fi de natură tehnică.)&lt;/p&gt;&lt;p&gt;Pentru mine, ca pasionat de software şi de posibilităţile pe care le oferă, perioada facultăţii a fost &amp;icirc;ntr-un fel un con de umbră, parţial din cauza facultăţii, parţial din cauza mea. Am petrecut o perioadă de timp adapt&amp;acirc;ndu-mă la ritmul şi cerinţele şcolii, oricare ar fi fost acelea, după care am devenit implicat &amp;icirc;ntr-o sumedenie de alte activităţi, care mai de care mai atrăgătoare, şi, undeva pe drum, am pierdut contactul cu plăcerea de a porni un proiect de la zero, care la sf&amp;acirc;rşitul unei perioade de acumulare şi efort face ceva, c&amp;acirc;t de c&amp;acirc;t interesant sau util.&lt;/p&gt;&lt;p&gt;Sigur, cod am scris tot timpul, dar este una c&amp;acirc;nd ai de făcut o temă pentru şcoală sau un proiect nu foarte complicat (şi de multe ori, activităţi extrem de interesante devin fade atunci c&amp;acirc;nd sunt făcute din obligaţie), şi este cu totul altceva c&amp;acirc;nd construieşti ceva pur şi simplu din pasiunea de a adăuga zi de zi c&amp;acirc;te puţin la un proiect care va prinde viaţă abia c&amp;acirc;nd adaugi la sf&amp;acirc;rşit cheia de boltă (asta depinde foarte mult şi de natura proiectului, şi de tehnologia folosită, şi de gusturile personale). Cred că m-am exprimat cam abstract, dar sunt sigur că pasionaţii de programare &amp;icirc;nţeleg la ce mă refer.&lt;/p&gt;&lt;p&gt;Ca o paranteză, la serviciu am de-a face cu mult cod, mai mult dec&amp;acirc;t poate ţine sub control un om normal după c&amp;acirc;teva mii de ani de citit surse, dar programarea &amp;quot;la profesionişti&amp;quot; este puţin diferită de programarea ca hobby. După cum &amp;icirc;mi spunea mentorul meu la un moment dat, codul sursă trebuie să servească două categorii de oameni: pe clienţii noştri şi pe colegii de echipă. O componentă bine scrisă &amp;icirc;ndeplineşte cerinţele funcţionale şi trebuie să fie sigură, performantă şi fiabilă; codul trebuie instrumentat, pentru a nu fi o cutie neagră pentru un administrator de sistem sau pentru un coleg de la suport, care &amp;icirc;ncearcă să-şi dea seama de ce comportamentul unei aplicaţii nu corespune aşteptărilor; mai mult dec&amp;acirc;t orice, totul trebuie documentat, at&amp;acirc;t &amp;icirc;n cod (care trebuie să fie c&amp;acirc;t mai uşor de citit, pentru că de scris, este scris o singură dată, dar va fi citit şi modificat de sute de ori după aceea), c&amp;acirc;t şi &amp;icirc;n documentaţie, astfel &amp;icirc;nc&amp;acirc;t atunci c&amp;acirc;nd un participant la proiect decide să exploreze alte ramuri ale domeniului şi schimbă echipele, cel care &amp;icirc;i ia locul să poată prinde viteză fără eforturi prea mari. (&lt;a href="http://blogs.msdn.com/ericlippert/"&gt;Eric Lippert&lt;/a&gt; are un articol foarte reuşit &amp;icirc;n care plasează simbolic &lt;a href="http://blogs.msdn.com/ericlippert/archive/2006/04/10/571098.aspx"&gt;programarea &amp;icirc;ntre proiectarea rachetelor şi chirurgia pe creier&lt;/a&gt;; vă las pe voi să aflaţi despre ce e vorba, şi merită să citiţi şi articolul care a st&amp;acirc;rnit discuţia). Pe scurt, pot să zburd pe unde am chef, c&amp;acirc;tă vreme rezultatul &amp;icirc;ndeplineşte toate condiţiile de mai sus şi efortul este justificat din punct de vedere economic. Dar să revenim.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n al doilea r&amp;acirc;nd, aş avea &lt;strong&gt;mai multă grijă &amp;icirc;n alegerea proiectelor&lt;/strong&gt; &amp;icirc;n care mă implic. Poate că sună un pic ciudat, aşa că o să explic mai pe larg: De-a lungul anilor de liceu şi de facultate, am fost pus de relativ multe ori &amp;icirc;n situaţia de a decide dacă vreau să mă implic &amp;icirc;ntr-o anumită activitate. De cele mai multe ori, ofertele au fost extrem de interesante, făc&amp;acirc;nd foarte dificilă decizia de a le accepta sau de a le respinge. Aşa se face că, de c&amp;acirc;teva ori, am acceptat să particip la o acţiune deşi nu dispuneam de timpul necesar pentru a o duce la bun sf&amp;acirc;rşit &amp;icirc;n condiţii bune, şi am dezamăgit un număr (din fericire, mic) de oameni care mi-au oferit şansa de a le fi colaborator.&lt;/p&gt;&lt;p&gt;Cred că dacă aş fi ştiut să &amp;icirc;mi evaluez mai bine limitele şi să spun &amp;quot;nu&amp;quot; atunci c&amp;acirc;nd era cazul, aş fi putut evita situaţiile neplăcute de acest gen. Sigur, faptul că am dus la bun sf&amp;acirc;rşit o varietate de acţiuni mi-a adus şi &amp;icirc;ncă &amp;icirc;mi mai aduce beneficii enorme, şi chiar şi &amp;icirc;nvăţămintele trase din greşeli oferă o anumită valoare faptului că le-am comis. At&amp;acirc;ta doar că eşecul, ca orice doctorie, este destul de amar, mai ales c&amp;acirc;nd implică şi dezamăgirea altora.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n al treilea r&amp;acirc;nd, cred că ar fi trebuit să aloc măcar o făr&amp;acirc;mă de timp &lt;strong&gt;studiului istoriei moderne&lt;/strong&gt;, &amp;icirc;n particular, &lt;strong&gt;şi c&amp;acirc;teva alte discipline umaniste&lt;/strong&gt;, &amp;icirc;n general. Citesc zilele acestea o carte numită &amp;quot;&lt;a href="http://www.amazon.com/Rise-Vulcans-History-Bushs-Cabinet/dp/0670032999"&gt;The Rise of the Vulcans&lt;/a&gt;&amp;quot;, de James Mann, şi la &amp;icirc;nceputul capitolului al cincilea, am fost uluit să constat că şase-şapte pagini de text mărunt, care discută c&amp;acirc;teva aspecte ale istoriei anilor &amp;#39;70 explică mai mult despre războiul din Irak şi despre situaţia din Orientul Mijlociu dec&amp;acirc;t au explicat &amp;icirc;n c&amp;acirc;ţiva ani o mulţime de jurnalişti isterizaţi, &amp;icirc;n căutare de audienţă, şi o mulţime la fel de mare de politicieni, &amp;icirc;n căutare de voturi.&lt;/p&gt;&lt;p&gt;Am realizat că istoria, aşa cum am &amp;icirc;nvăţat-o noi &amp;icirc;n şcoala generală şi &amp;icirc;n liceu (cel puţin generaţia mea), reprezintă o fracţiune infimă din ce s-a &amp;icirc;nt&amp;acirc;mplat &amp;icirc;n lume pe parcursul timpului, iar acest lucru este cu at&amp;acirc;t mai evident c&amp;acirc;nd vorbim despre istoria ultimului secol. De exemplu, &amp;icirc;n manualele din liceu istoria modernă se reducea la tovarăşul Dej, tovarăşul Ceauşescu şi c&amp;acirc;teva comentarii despre Războiul Rece, ONU, URSS şi SUA; eu mai mult de at&amp;acirc;t nu-mi prea amintesc. E de-a dreptul uimitor c&amp;acirc;t de uşor de &amp;icirc;nţeles devin acţiunile naţiunilor şi politicienilor &amp;icirc;n prezent dacă ştii c&amp;acirc;tuşi de puţin despre trecutul lor. E valabil chiar şi pentru Rom&amp;acirc;nia... Pe o notă similară (să-i spunem &amp;quot;punctul 3 bis&amp;quot;), găsesc la fel de interesante psihologia şi sociologia. Sunt multe de explorat &amp;icirc;n universul care ne &amp;icirc;nconjoară, dar mai avem cel puţin la fel de multe de &amp;icirc;nvăţat despre oameni, ca indivizi şi ca grupuri organizate.&lt;/p&gt;&lt;p&gt;Trec&amp;acirc;nd la latura practică a lucrurilor, am descoperit &amp;icirc;n practică importanţa stăp&amp;acirc;nirii uneia sau mai multor &lt;strong&gt;limbi străine&lt;/strong&gt;. De exemplu, cu engleza am descoperit o problemă interesantă: Am studiat engleza generală relativ mulţi ani, şi mă descurc relativ bine la nivel conversaţional, iar &amp;icirc;n ce priveşte cunoştinţele de programare pe care le posed, peste 90% provin din documentaţie scrisă &amp;icirc;n engleză, deci &amp;icirc;n &amp;icirc;n privinţa aceasta stau foarte bine. Am constatat &amp;icirc;nsă că &amp;icirc;n viaţa de zi am probleme cu lucruri mărunte, cum ar fi denumirile unor legume sau fructe, sau ale unor accesorii casnice. E deosebit de distractiv atunci c&amp;acirc;nd ţi se strică ceva pe la baie şi trebuie să-i descrii instalatorului la telefon care e problema.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n plus, &amp;icirc;ntr-o lume globală, stăp&amp;acirc;nirea unei singure limbi străine se dovedeşte de multe ori nesatisfăcătoare. Deşi am avut tangenţe prin şcoală cu franceza şi rusa, nu am prea avut nevoie de ele &amp;icirc;n practică, şi din păcate mare lucru nu s-a lipit de mine (presupun că a &amp;icirc;nţelege o propoziţie din trei, şi respectiv treizeci, nu mă face vorbitor fluent al vreuneia din aceste limbi). Lucrurile sunt cu at&amp;acirc;t mai interesante &amp;icirc;n Europa, unde trebuie să alegi &amp;icirc;ntre germană, franceză şi spaniolă. Cel puţin &amp;icirc;n SUA, cu spaniola şi engleza te descurci cam peste tot.&lt;/p&gt;&lt;p&gt;Schimbăm iarăşi puţin vitezele şi ajungem la un aspect pe care l-am neglijat sistematic p&amp;acirc;nă recent, dar pentru care niciodată nu e prea t&amp;acirc;rziu: &lt;strong&gt;sportul&lt;/strong&gt;. Privind &amp;icirc;n urmă, găsesc cel puţin două motive pentru care ar fi trebuit să acord mai multă atenţie formei fizice:&lt;/p&gt;&lt;p&gt;&amp;Icirc;n primul r&amp;acirc;nd, oric&amp;acirc;t de banal ar suna, nu am fost construiţi pentru stilul de viaţă pe care &amp;icirc;l avem &amp;icirc;n prezent, iar alimentaţia, sedentarismul şi ritmul dezordonat de viaţă &amp;icirc;şi pun amprenta foarte rapid asupra fiecăruia, chiar dacă efectele nu sunt vizibile de la o zi la alta. O oră de mişcare &amp;icirc;n fiecare zi, &amp;icirc;mpreună cu o nutriţie controlată puţin şi cu un ritm de viaţă stabil au efecte vizibile asupra stării fizice şi psihice.&lt;/p&gt;&lt;p&gt;Al doilea motiv pentru care am &amp;icirc;nvăţat să apreciez sportul se leagă de răbdare, perseverenţă şi moral. Dacă vreţi, puşi &amp;icirc;n faţa unei provocări fizice, nu mai avem cum să ne minţim - lucrurile sunt albe sau negre - poţi sau nu poţi face faţă solicitării - aşa că un prim efect este că &amp;icirc;nveţi să &amp;icirc;ţi admiţi limitele, oric&amp;acirc;t de neplăcut ar fi acest lucru. Al doilea efect este că descoperi destul de repede că unele din limite pot fi &amp;icirc;mpinse mai departe, cu condiţia să nu renunţi, şi să &amp;icirc;nţelegi că rezultatele pozitive nu apar peste noapte. Al treilea efect este că după un timp, devii din ce &amp;icirc;n ce mai greu de descurajat de eşecuri, pentru că de multe ori ceea ce era imposibil acum o vreme este prezent acum, datorită antrenamentelor. &amp;Icirc;n fine, atunci c&amp;acirc;nd &amp;icirc;n cele din urmă te apropii de limitele reale ale organismului, ai cel puţin satisfacţia că exploatezi la maxim ceea ce ţi-a fost dat.&lt;/p&gt;&lt;p&gt;Apropo de sport, un alt domeniu pe care &amp;icirc;l redescopăr cu interes este cel al anatomiei şi fiziologiei. &amp;Icirc;ncercaţi să răsfoiţi un articol scurt despre hormoni, chimia s&amp;acirc;ngelui sau a muşchilor, despre metabolism sau sistemul nervos şi reflectaţi puţin la c&amp;acirc;t de complexă este fiinţa umană pe plan fizic. Eu unul, pus &amp;icirc;n faţa unui astfel de sistem, mă simt aproape neputincios şi mă mir &amp;icirc;ntr-un fel de tentativa naivă a medicinei moderne care &amp;icirc;ncă mai crede că poate &amp;icirc;nţelege interacţiunile interne ale organismului, şi că le poate repara atunci c&amp;acirc;nd deviază de la normalitate. &amp;Icirc;n particular mi se pare amuzant modul liniar &amp;icirc;n care privim lucrurile, crez&amp;acirc;nd că este suficient să modificăm una-două variabile pentru a obţine efectul scontat.&lt;/p&gt;&lt;p&gt;Cred că am &amp;icirc;ncheiat lista de lucruri pe care le-aş fi schimbat mai devreme &amp;icirc;n viaţa mea. Nu am ajuns chiar la zece, aşa că voi lăsa deschisă o secţiune pe care o voi numi &amp;icirc;n mod original &amp;quot;şi altele&amp;quot;.&lt;/p&gt;&lt;p&gt;&amp;Icirc;n concluzie, o să spun doar că &amp;icirc;mi doresc să fi &amp;icirc;nţeles mai devreme că este important să ştii să sprintezi, dar că viaţa este totuşi un maraton &amp;icirc;n care răbdarea şi perseverenţa joacă un rol critic. &amp;Icirc;n afară de asta, chiar dacă multe probleme pot fi rezolvate din mers, pe măsură ce apar, şi chiar dacă suntem permanent supuşi neprevăzutului, mi se pare util să cultivăm şi aspecte importante pe termen lung. Ne place sau nu, &amp;icirc;n fiecare zi trebuie să lucrăm, să ne odihnim, să facem ceva pentru noi &amp;icirc;nşine, pe plan fizic şi psihic, şi să ne &amp;icirc;ngirjim şi de relaţia cu cei apropiaţi. Nu sunt lucruri pe care le putem face pe r&amp;acirc;nd, c&amp;acirc;te unul pe zi. Am ajuns să-mi dau seama de asta doar de c&amp;acirc;nd timpul meu nu-mi mai aparţine.&lt;/p&gt;&lt;p&gt;Care sunt lucrurile pe care le-aţi face mai des şi de ce nu le faceţi?&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13553" width="1" height="1"&gt;</description></item><item><title>Develop Without Borders</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/08/17/13422.aspx</link><pubDate>Thu, 17 Aug 2006 00:59:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13422</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13422.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13422</wfw:commentRss><description>&lt;P&gt;Probabil ştiţi deja de la &lt;A HREF="/todi/"&gt;Todi&lt;/A&gt; despre rezultatele impresionante obţinute de studenţi români la Windows Embedded Student Challenge şi Imagine Cup. Am aflat acum câteva momente de încă o oportunitate de acest fel, de data aceasta deschisă tuturor.&lt;/P&gt;
&lt;P&gt;Concursul se numeşte "Develop without Borders", este organizat de Microsoft în parteneriat cu HP&amp;nbsp;şi este adresat programatorilor şi arhitecţilor de soluţii. Conceptul este următorul: Participanţii aleg o organizaţie de caritate pe care ar dori să o ajute, pătrund în activităţile pe care le desfăşoară această organizaţie şi înţeleg provocările pe care le întâlneşte, după care dezvoltă o soluţie bazată pe Office 2007 care rezolvă una sau mai multe din problemele descoperite.&lt;/P&gt;
&lt;P&gt;Soluţia cu impactul cel mai semnificativ asupra unei astfel de organizaţii poate câştiga până la $50.000 pentru a dezvolta soluţia pilot sau pentru a o implementa.&lt;/P&gt;
&lt;P&gt;Detalii la &lt;A href="http://www.developwithoutborders.com"&gt;www.developwithoutborders.com&lt;/A&gt;.&lt;/P&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Flash+Update" rel="tag"&gt;Flash Update&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13422" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Flash+Update/default.aspx">Flash Update</category></item><item><title>ADO.NET August CTP</title><link>http://weblogs.studentclub.ro/ovidiupl/archive/2006/08/16/13413.aspx</link><pubDate>Wed, 16 Aug 2006 00:15:00 GMT</pubDate><guid isPermaLink="false">599975c8-d3bf-4331-b715-0230e9d36be4:13413</guid><dc:creator>ovidiupl</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.studentclub.ro/ovidiupl/comments/13413.aspx</comments><wfw:commentRss>http://weblogs.studentclub.ro/ovidiupl/commentrss.aspx?PostID=13413</wfw:commentRss><description>&lt;P&gt;Tocmai am aflat că a apărut ediţia august 2006 a CTP-ului de ADO.NET vNext. Dacă v-au plăcut demo-urile de LINQ şi v-aţi jucat cu unul din CTP-urile anterioare, probabil veţi dori să citiţi anunţul de la &lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/15/701479.aspx"&gt;http://blogs.msdn.com/adonet/archive/2006/08/15/701479.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Dacă aveţi nevoie de şi mai multe informaţii, echipa ADO.NET a adunat deja o colecţie destul de mare de resurse:&lt;/P&gt;
&lt;P&gt;Whitepapers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/nxtgenda.asp"&gt;&lt;U&gt;Next-Generation Data Access: Making the Conceptual Level Real&lt;/U&gt;&lt;/A&gt; - José Blakeley, David Campbell, Jim Gray, S. Muralidhar, Anil Nori&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/ADONETEnFrmOvw.asp"&gt;&lt;U&gt;The ADO.NET Entity Framework Overview&lt;/U&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/ADONET_EDM.asp"&gt;&lt;U&gt;ADO.NET Tech Preview: Entity Data Model&lt;/U&gt;&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Channel 9&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://channel9.msdn.com/Showpost.aspx?postid=202138"&gt;&lt;U&gt;Chatting about LINQ and ADO.NET Entities&lt;/U&gt;&lt;/A&gt;&amp;nbsp;- Anders Hejlsberg and Sam Druker&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/07/19/671805.aspx"&gt;&lt;U&gt;ADO.NET Entity Framework on Channel 9&lt;/U&gt;&lt;/A&gt;&amp;nbsp;- Pablo Castro, Mike Pizzo and Britt Johnston &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Screencasts&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;U&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/15/701499.aspx"&gt;ADO.NET vNext CTP - tools and screencast&lt;/A&gt;&lt;/U&gt;, Sanjay Nagamangalam&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/07/11/662454.aspx"&gt;&lt;U&gt;ADO.NET vNext screencast&lt;/U&gt;&lt;/A&gt;, Shyam Pather &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Blogs:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet"&gt;&lt;U&gt;ADO.NET Team Blog&lt;/U&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/data"&gt;&lt;U&gt;Data blog&lt;/U&gt;&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Blog posts (sunt sigur că lista e deja veche în câteva minute de acum)&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/15/701479.aspx"&gt;&lt;U&gt;Announcing: The ADO.NET vNext August CTP&lt;/U&gt;&lt;/A&gt;, by Pablo Castro&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/data/archive/2006/08/15/701713.aspx"&gt;&lt;U&gt;Incremental Improvement, Important Milestones, and Complementary Goals&lt;/U&gt;&lt;/A&gt;, by Britt Johnston&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/07/11/662447.aspx"&gt;&lt;U&gt;ADO.NET vNext: The Entity Framework, LINQ and more&lt;/U&gt;&lt;/A&gt; by Pablo Castro &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/data/archive/2006/07/19/671919.aspx"&gt;&lt;U&gt;Entities in Olympus and Channel 9...&lt;/U&gt;&lt;/A&gt; by Britt Johnston &lt;/LI&gt;
&lt;LI&gt;&lt;A title=http://blogs.msdn.com/data/archive/2006/07/14/665780.aspx href="http://blogs.msdn.com/data/archive/2006/07/14/665780.aspx"&gt;&lt;U&gt;Conceptual Schema&lt;/U&gt;&lt;/A&gt; by Britt Johnston &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/adonet/archive/2006/07/11/662485.aspx"&gt;&lt;U&gt;ADO.NET vNext - feedback so far&lt;/U&gt;&lt;/A&gt;, by Alex Barnett &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/somasegar/archive/2006/06/21/641795.aspx"&gt;&lt;U&gt;LINQ and ADO.NET innovations&lt;/U&gt;&lt;/A&gt;, by Somasegar &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;MSDN Forums&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=533&amp;amp;SiteID=1"&gt;&lt;U&gt;ADO.NET Technical Preview Forum&lt;/U&gt;&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;p&gt;Technorati tags: &lt;a href="http://www.technorati.com/tag/Flash+Update" rel="tag"&gt;Flash Update&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.studentclub.ro/aggbug.aspx?PostID=13413" width="1" height="1"&gt;</description><category domain="http://weblogs.studentclub.ro/ovidiupl/archive/tags/Flash+Update/default.aspx">Flash Update</category></item></channel></rss>
