Am avut plăcerea şi bucuria de a îmi petrece încă o vară în campusul Microsoft din Redmond. Știu că anul trecut nu am scris nimic despre lucrul acesta, însă acum, mă simt mai îndreptățit decât atunci să-mi spun impresiile pentru că în aceste două veri am făcut parte din grupuri diferite iar proiectele la care am lucrat aveau de asemenea diferențe fundamentale în scopul şi abordarea lor.

Deşi internii europenii sunt păsări rare în campus, noi romanii puteam forma o echipa de fotbal şi anul acesta, dar nu pentru un teren mare ca anul trecut ci de sală. Cei 7 interni au fost, în ordinea apariţiei lor pe scara avionului Silviu Niculiţă, Tiberiu Chiorean, Alexandru Calotoiu, Cornel Raţ, Victor Paraschiv, Andrei Iacob şi Bogdan Hobeanu. Nu trebuie uitat nici Geo care, politehnist eminent până acum 3 ani, a venit şi el sa îngroaşe numărul internilor romani tocmai din Canada de la McGill University.

Anul acesta am fost SDE ( Software Developer Engineer) în Connected Framework, echipa care dezvolta WCF, WF si Biztalk Server. Am avut de lucrat la două proiecte foarte solicitante pentru care era necesar un timp de cercetare şi studiere a anumitor tehnologii, protocoale şi arhitecturi (un ramp-up time cum îl numeau ei). Proiectele trebuiau finalizate în 12 săptămâni, motiv pentru care toate etapele dezvoltării lor au fost atent planificate de mine alături de mentor, în primele zile ale internship-ului. Mentorul era tăticul meu. Dacă aveam vreo durere el era persoana la care mă duceam sa cer ajutor. Mentorul mă ajuta să mă integrez în echipă, mă îndrepta către persoanele care au scris anumite librarii, API-uri, mă ajuta cu problemele legate de infrastructura internă, cu review-ul design-ului aplicaţiei, debugging-ul şi orice alte aspecte profesionale din viaţa mea de intern.

Primul mare şoc pe care îl ai atunci când lucrezi în Microsoft este că nu poţi lăsa nimic la voia întâmplării. Nu ai voie să dai copy/paste la orice cod de pe net, nu poţi pune întrebări pe forum-uri, nu poţi folosi aplicaţii scrise de alţi programatori, algoritmii pe care îi foloseşti trebuie să nu conţină nici un fel de patent şi să nu aibă asociate cu ei drepturi de utilizare. Chiar şi unele sarcini care sunt relativ banale îţi pot lua ceva timp încercând să eviţi anumite idei deja patentate sau folosite în algoritmi 3rd party.

Gândindu-mă la experienţa din vara trecută am fost surprins să remarc spectrul larg de cunoştinţe, idei şi trick-uri folosite în realizarea aplicaţiei mele. Fiecare zi este intensă chiar dacă uneori nu scrii nici o linie de cod. Atunci cauţi noi abordări, noi algoritmi, posibile îmbunătăţiri, arhitecturi ale unor componente care să evite probleme greu de rezolvat. Anul acesta m-am aplecat mai mult asupra framework-ului şi designului aplicaţiilor ce îl folosesc.

Connected Framework este o echipă care dezvoltă un framework şi principala ei preocupare este găsirea pattern-urilor de folosire cele mai larg răspândite dar, în același timp, păstrarea versatilității platformei şi bineînțeles performanţă, scalabilitate, ușurință în utilizare şi dimensiuni reduse ale livrabilelor. Acum eram la un nivel la care se cerea un grad mare de abstractizare a funcţionalităţilor şi realizarea unor componente generice dar uşor extensibile. Din afară poate părea treabă uşoara însă după ce participi la câteva şedinţe şi întâlniri cu arhitecţii din echipă începi să simţi presiunea, dificultăţile şi problemele cu care se confruntă.

Poate din ce v-am spus până acum regimul de viaţă din campus pare foarte sever şi riguros. Nu este deloc aşa. Deşi task-urile şi funcţionalităţile la care lucrezi necesită concentrare şi atenţie sporită, viaţa acolo este destul de relaxată. Când eşti blocat de un bug, o bucata de cod care nu vrea să meargă cum trebuie, te ridici şi faci o plimbare scurtă prin grădinile clădirilor, îţi goleşti mintea de problemele curente şi te relaxezi. Uneori merge :-) . In lounge-uri (fiecare etaj al unei clădiri are câteva) există diferite jocuri cu care să îţi umpli pauza de masă: mese de fussbal, biliard, ping-pong, trenuleţe din lego, Surface, Xbox si altele. Daca nu ai ghinionul sa fie vre-un meeting acolo, poţi sa te întinzi pe canapele/fotolii şi să citeşti o carte, să îţi savurezi cafeaua sau să stai la discuţii cu un coleg. Fiecare clădire Microsoft are în jurul ei un spaţiu verde destul de mare, caracteristic ei. Poţi întâlni chiar şi un mic iaz cu caraşi japonezi, păduri de conifere sau de bambus, diferite specii rare de copaci, multe flori, izvoare si mici cascade.

Campusul Microsoft din Redmond este foarte geeky aşa cum bănuiţi. Clădirile în care dezvoltă anumite produse sunt marcate specific, pe străzile din jurul clădirilor vezi tot felul de afişe cu produse, evenimente interne. Pentru a facilita accesul angajaţilor de la o clădire la alta există un sistem propriu de transport numit Shuttle Service care foloseşte în general maşini hibride şi pe care îl poţi solicita oricând ai nevoie să te mişti în campus. Tot în campus există şi un teren imens pentru sport pe care poţi juca de la volei, fotbal, la cricket şi softball. Tot aici se desfăşoară din când în când diferite evenimente interne.

Majoritatea oamenilor discută despre probleme tehnice chiar şi la cantina unde îţi iei prânzul, în shuttle sau la țigară. Algoritmi, protocoale, arhitecturi, design patterns si multe altele. Anul acesta am stat in clădire cu o mulțime de personalităţi. Oricând putem da nas în nas la cafeteria, bucătărie sau baie cu un tehnical fellow, distinguished engineer, vice president sau un general manager. Nimic din comportamentul lor nu te anunţă cine este persoana care tocmai trece pe lângă tine sau care iţi dă bună dimineaţa în bucătărie.

Care a fost valoarea pe care mi-a adus-o mie acest internship? 3 luni de zile pot părea foarte mult timp dacă te gândeşti ca la o călătorie în care poţi vizita, cunoaşte locuri şi oameni noi. Totuşi este un timp foarte scurt când vine vorba despre o perioada în care tu încerci să înveţi cât de mult se poate. În 3 luni ai timp să te familiarizezi cu tehnologii noi, să îţi încolţească în cap noi idei şi abordări, ţi se deschid în faţă mult mai uşor anumite domenii. Dacă anumite concepte păreau complicate sau incoerente, odată ajuns acolo totul se luminează, atât datorita bazei de cunoştinţe pe care o ai la picioare cât şi oamenilor remarcabili care sunt lângă tine în fiecare zi. Tot în 3 luni ai timp să înţelegi arhitectura şi codul produsului Microsoft la care lucrezi, să vezi unde se doreşte ajunge, tehnologia curenta, problemele actuale, cerinţele clienţilor dar şi soluţiile care se propun. Vezi strategia pe care o aplică Microsoft, punctele de rezistenţă ale viitoarelor produse cât şi platformele care vor susţine generaţiile viitoare de produse.

Zoon Fest 

Poza originala aici.

Daca nu eşti prea geek ca să trăieşti tot timpul în birou poţi face destule lucruri ca să te distrezi. Unde mai pui că Microsoft are o echipă specială care se ocupă de distracţia internilor. În prima săptămână am fost luaţi cu toţii ( vreo 800 de interni ) pe sus in 22 de autocare şi relocaţi pentru o după-amiază la gradina zoologică din Seattle unde a fost organizată o mică petrecere în cinstea noastră. Imaginaţi-vă cum pot ajunge vinerea la ora 16.30 la gradina zoologică, 22 de elefanţi prin traficul din Seattle fără să întârzie. Cum altfel decât cu ajutorul poliţiei care a făcut un lock(Freeway_SR520) pentru câteva zeci de minute cât a luat întregii caravane să ajungă la destinaţie. Am fost cu toţii la Mount Rainier, un munte vulcanic de 4,392m care se vede în zilele senine chiar şi din Seattle. Această excursie tradiţională este organizată o dată in fiecare an atunci când aproape toţi internii sunt în campus. Meciuri de baseball ale formaţiei locale Seattle Mariners, Product Fair şi cuvântarea lui Steve Ballmer, Company Meeting, BBQs si multe alte evenimente te scot din munca de birou si îţi oferă ocazia să socializezi cu ceilalţi interni dar şi cu alţi angajaţi veterani în Microsoft.

Mount Rainier 

Poza originala aici.

Technorati tags: , , , , , ,

Cu ocazia lansării Windows Server 2008, SQL Server 2008 şi Visual Studio 2008, Microsoft Romania organizează în data de 16 şi 17 ianuarie, la Grand Rin Hotel, în Bucureşti o serie de evenimente speciale dedicate dezvoltatorilor şi administratorilor. Pe 16 ianuarie va avea loc MSDN Briefing unde se vor discuta noile funcţionalităţi şi îmbunătăţiri aduse .Net Framework-ului (LINQ, Entity Framework) acum la versiunea 3.5, C# 3.0 şi Visual Studio-ului iar pe 17 ianuarie, la TechNET Briefing, vor fi sub lumina reflectoarelor Windows Server 2008 cu noile funcţionalităţi în securitate, acces, management, Active Directory, Remote Desktop Protocol şi nu în ultimul rând noua platforma pentru virtualizare Windows Server Virtualization WSv. Începând cu aceste evenimente, accesul nu mai este gratuit, taxa de participare fiind de 40$. Studenții se pot considera însă privilegiați pentru că ei au acces la evenimente pe baza carnetului de student vizat şi după înregistrarea pe site, fără a mai plăti taxa de participare.

Pentru MSDN Briefing studenţii se pot înregistra aici folosind codul MSDN_Stud .

Pentru TechNET Briefing studenţii se pot înregistra aici folosind codul TechNet_Stud .

Atentie : Pentru a intra la eveniment trebuie să fiţi înregistraţi pe site şi să vă prezentaţi cu carnetul de student în momentul înregistrării participanţilor ( vezi programul ). Nu sunt tolerate, sub nici o forma, abateri de la aceste reguli !

Technorati tags: , ,

Vă mai aduceți aminte de acele stilouri cu cerneală invizibilă, în mod obișnuit, dar care totuși devenea lizibila daca o afumai sau o expuneai unei anumite lumini etc.? Eu cred ca este cool şi acum. Având în minte acest lucru şi făcând o legătura cu un post anterior în care am deschis, în mod indirect, o discuție legata de modul în care pot face editare de imagini în C#, m-am gândit să încerc o implementare digitală a acestei jucării. Scopul exercițiului? Just fun! Daca vă mai aduceți aminte codul dat ca exemplu atunci făcea o transformare a unei imagini reprezentată pe 24bpp în grayscale.

Înainte de a începe, atrag totuși atenția că această metoda nu este o soluție alternativă de criptare, transmitere sau securizare a datelor. Codul nu prezintă nici o garanție iar cei ce îl vor implementa în aplicațiile proprii sunt singurii răspunzători pentru efectele ulterioare ale acestora.

Ce vrem exact ? Răspuns : Dorim să facem o aplicație care să ascundă într-o fotografie un text, astfel încât imaginea să fie afectată cât mai puțin posibil iar textul să nu fie lizibil cu ochiul liber.

Vom considera, pentru simplificarea problemei, că vom folosi doar caractere ASCII. Un caracter ASCII este reprezentat in mod binar pe 8 biți. În mod obișnuit, un mesaj este format din litere, cifre şi semne de punctuație. Tot pentru simplificarea problemei vom considera că avem de ascuns textul în spatele unor fotografii reprezentate pe 24bpp (24 Bits Per Pixel ) ( adică fotografii obișnuite si „colorate” ). Acest lucru înseamnă că fiecare culoarea este formată din combinații diferite ale culorilor de baza roșu ( Red), verde (Green), albastru ( Blue) adică RGB. Dacă avem în total 24 de biți pentru o culoare iar o culoare este formată din combinațiile a 3 culori de bază diferite, înseamnă că fiecărei culori de baza îi revin 24/3 = 8 biți adică exact un byte. Ideea este să folosim ultimul bit (cel mai puțin semnificativ) al fiecărei culori de bază, ce descrie o culoare pentru stoca 1 bit dintre cei 8 ce reprezintă un caracter în formatul binar. În acest mod, pentru a putea „ascunde” un caracter vom avea nevoie de 2 pixeli si 2 biți ai culorilor de bază de la pixelul vecin. Deci pentru 3 caractere vom avea nevoie, în mod evident, de 8 pixeli.

Ipotezele inițiale referitoare la formatul textului şi la proprietățile imaginii nu sunt elemente care să restrângă generalitatea soluției. În mod evident, dacă se dorește acest lucru, cu foarte mici modificări se poate particulariza soluția şi pentru fotografii reprezentate în nuanțe de gri ( fiecare nuanțe de gri va fi reprezentata pe 1 byte ) şi imagini alb/negru. Desigur, pentru a micșora şi mai mult numărul biților ce vor reprezenta un caracter, se poate folosi o codare a textului dorit folosind algoritmi precum Shannon – Fano, Huffman sau chiar unul propriu. În cazul în care considerați că modificarea tuturor nuanțelor ce definesc un pixel afectează prea mult calitatea imaginii, puteți opta doar pentru folosirea celui mai puţin semnificativ bit al canalului roșu / verde / albastru. Las aceste detalii şi preferințe în seama cititorului.

În cel mai rău caz, un pixel va avea toate cele 3 culori de bază modificate cu o nuanță. Considerând că modificarea cu o nuanță a unei culori de bază va conduce la obținerea unei noi culori ( culoarea de baza modificata + cele 2 culori nealterate), în cel mai rău caz, culoarea reală se va afla la 3 culori ( din cele 16.777.216 culori ce se pot reprezenta într-un format pe 24 bpp) distanţa de culoare ce va conține şi informația legata de textul ascuns. Ținând cont de faptul că o salvare a unei fotografii în formatul jpeg poate afecta mult mai mult calitatea imaginii decât modificarea ultimilor biți ai fiecărei culori componente, personal consider că este o abatere acceptabilă de la fotografia iniţială.

În mod evident observăm următoarele aspecte:

  • Dacă vom modifica fotografia ( să spunem că facem copy/paste într-o anumită zonă), caracterele ascunse în acea zonă vor fi distruse;
  • La o schimbare a compresiei fotografiei, majoritatea informației se va pierde deoarece algoritmul va renunța tocmai la acele detalii care fac reprezentarea textului nostru posibilă;
  • Un format bun pentru salvarea fotografiilor este PNG ( nu este lossy );
  • Daca dorim să ne asiguram într-o măsură mai mare la potențialele pierderi de date ce apar odată cu modificare fotografiei, putem creşte redundanţa textului ascuns. Va trebui să scădem lungimea textului la jumătate faţă de dimensiunea inițială şi îl vom scrie în imagine încă odată. În cazul în care un caracter extras nu va mai duce la obținerea unui caracter, unei cifre sau semn de punctuație atunci se va încerca înlocuirea lui cu cel salvat în textul redundant, daca acesta nu a fost şi el modificat. Pe măsura ce creste redundanţa textului va scădea lungimea acestuia.

Codul aplicației:

   1: private void btnEmbedText_Click(object sender, EventArgs e)
   2: {
   3:     if (pbImage.Image == null)
   4:         return;
   5:  
   6:     if (pbImage.Image.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
   7:     {
   8:         MessageBox.Show("Pixel format must be 24bpp");
   9:         return;
  10:     }
  11:  
  12:     //obtin o copie a imaginii afisate userului in PictureBox
  13:     Bitmap bmp = (Bitmap)pbImage.Image;
  14:     int width = bmp.Width, 
  15:         height = bmp.Height;
  16:  
  17:     // fac lock pt Citire/Scriere si obtin o harta a bitilor
  18:     System.Drawing.Imaging.BitmapData bmpData =  bmp.LockBits(  new Rectangle(0,0,width,height),
  19:                                                                 System.Drawing.Imaging.ImageLockMode.ReadWrite,
  20:                                                                 System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  21:     int stride = bmpData.Stride;    // lungimea unui rand 
  22:     int BytesPerRow = 3 * width,
  23:         BytesWritten = 0;
  24:     int offset = stride - BytesPerRow;// nu intotdeauna un rand are acelasi numar cu numarul de pixeli vizibili
  25:     IntPtr start = bmpData.Scan0;   // obtin locatia primului pixel
  26:  
  27:     string str = txtText2Embed.Text;
  28:     int CharNo = txtText2Embed.Text.Length;
  29:     char ch;
  30:  
  31:     unsafe                          // folosesc contextul UNSAFE pt a avea mai usor acces la fiecare culoare de baza + viteza
  32:     {
  33:         byte* ptr = (byte*)start;
  34:  
  35:         // pentru fiecare caracter
  36:         for (int index = 0; index < CharNo; index++)
  37:         {
  38:             ch = str[index]; 
  39:  
  40:             // bitii caracterului ii scriu in ordinea MSB --> LSB (Most Significant Bit --> Least Significand Bit)
  41:             // !!! Atentie la reconstructie
  42:  
  43:             for (int bit = 0; bit < 8; bit++)// pentru fiecare bit din cei 8 ai caracterului
  44:             {//  cei mai imp 7 biti ai culorii  + 1 bit al caracterului
  45:                 ptr[0] = (byte)((ptr[0] & 0xFE) + (ch >> 7 - bit & 0x01));
  46:                 
  47:                 BytesWritten++;
  48:                 ptr++;
  49:                 if (BytesWritten == BytesPerRow)
  50:                 {
  51:                     ptr += offset;
  52:                     BytesWritten = 0;
  53:                 }
  54:             }
  55:         }
  56:     }
  57:  
  58:     bmp.UnlockBits(bmpData);        // eliberez harta de biti si fac unlock
  59:     pbImage.Image = bmp;
  60: }
  61:  
  62: private void btnExtractText_Click(object sender, EventArgs e)
  63: {
  64:     if (pbImage.Image == null)
  65:         return;
  66:  
  67:     if (pbImage.Image.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
  68:     {
  69:         MessageBox.Show("Pixel format must be 24bpp");
  70:         return;
  71:     }
  72:  
  73:     Bitmap bmp = (Bitmap)pbImage.Image;
  74:     int width = bmp.Width,
  75:         height = bmp.Height;
  76:  
  77:     // fac lock la imagine si obtin o harta de biti doar cu acces la citire
  78:     System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(   new Rectangle(0, 0, width, height),
  79:                                                                 System.Drawing.Imaging.ImageLockMode.ReadOnly, 
  80:                                                                 System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  81:     int stride = bmpData.Stride;    // lungimea unui rand
  82:     int PixelsPerRow = 3 * width,
  83:         PixelsRead = 0;
  84:     int offset = stride - PixelsPerRow;
  85:     IntPtr start = bmpData.Scan0;   // adresa primului pixel
  86:     int MaxCharNo = width * height / 8;
  87:  
  88:     // este mult mai eficient sa folosesc un string builder pentru a reconstrui textul ascuns
  89:     StringBuilder ExtractedString = new StringBuilder(MaxCharNo); 
  90:     char ch;
  91:     int index;
  92:  
  93:     unsafe
  94:     {
  95:         byte* ptr = (byte*)start;
  96:         for ( index = 0; index < MaxCharNo; index++)
  97:         {
  98:             ch = (char)0;
  99:             for (int bit = 0; bit < 8; bit++)
 100:             {
 101:                 //shiftez la stanga bitii extrasi + urmatorul bit
 102:                 //primul bit al caracterului extras = MSB
 103:                 ch = (char)(ch << 1);
 104:                 ch =(char)(ch + (ptr[0] & 0x01));
 105:  
 106:                 PixelsRead++;
 107:                 ptr++;
 108:                 if (PixelsRead == PixelsPerRow)
 109:                 {
 110:                     ptr += offset;
 111:                     PixelsRead = 0;
 112:                 }
 113:             }
 114:             ExtractedString.Append(ch);
 115:         }
 116:     }
 117:  
 118:     bmp.UnlockBits(bmpData);
 119:     txtText2Embed.Text = ExtractedString.ToString();
 121: }

Aplicaţia permite ca pentru o fotografie de dimensiunea 999x997 pixeli, de exemplu, să se „ascundă” în spatele ei 373.501 caractere. Iniţial, imaginea salvată în formatul PNG are mărimea de 383.171 bytes iar după procesarea unui text care va avea dimensiunea maximă acceptată de fotografiei, aceasta va ocupa ( in formatul PNG ) 1.070.708 bytes.

Soluția completă se găsește aici iar fisierul executabil aici .

Notă: Deoarece textul extras din fotografie este afișat într-un TextBox, acesta este interpretat ca fiind text codat în formatul Unicode. Formatul Unicode a fost gândit astfel încât caracterele alfabetice, cifrele si semnele de punctuație din codarea ASCII să aibă același cod. Exista totuși simboluri în codul ASCII care nu se regăsesc în codul Unicode. Un exemplu ar fi simbolurile de la codul ASCII 127 (0x007F) la 159(0x009F). Mai multe detalii aici.

Technorati tags: , , ,

În una din zilele aceastea, am ajuns în mod întâmplator pe un site interesant. www.ted.com

Odată pe an, oameni de calibru din toate domeniile sunt invitaţi să prezinte lucruri de interes global într-o conferinţă destul de exclusivistă în Monterey, California.

În general, speakerii sunt din rândul corpului profesorilor şi cercetătorilor de la MIT, însă aceasta nu este o regulă. Vreţi să ştiţi cum funcţionează Wikipedia, cine este www.cnx.org , ce se poate face cu un touchscreen multipoint,  care sunt cele mai grave probleme ale lumii şi în ce ordine ar trebui rezolvate, cum se poate construi un laptop de 130 de euro şi multe altele...Cred că merită să aruncati o privire!

Casturile video sunt disponibile la adresa http://www.ted.com/tedtalks/  Enjoy!

Technorati tags:

0 Comments
Filed under:

Recunosc că nu ştiu prea multe despre sistemul comunist din propria experienţă. La revoluţie eram un ţânc de numai 5 ani. Pot spune că de când mă ştiu eu, toată lumea (elevi,studenţi si parinţi deopotrivă) se plange şi se lamentează de sistemul de învăţământ din România ( condiţiile precare din facultăţi, materiile predate prost, profesorii incompetenţi, laboratoarele ce nu fac faţă nevoilor studenţilor, căminele mizere etc). Motivele de îngrijorare, delăsare şi silă de acest sistem sunt cât se poate de serioase şi întemeiate.

În acelaşi timp, auzim de la prieteni, colegi, cunoştinţe despre condiţiile de studiu din afară, despre sârguinţa cu care guvernele acestor ţărilor se ocupa de sistemul de învăţământ, investesc bani mulţi în dotari, crearea de universităţi şi susţineera acestora, cercetare şi burse. Însă întrebările nu se opresc aici. Este de-a dreptul remarcabil modul în care elevii/studenţii cu performaţe mediocre sau chiar submediocre în sistemul românesc de învaţământ dau rezultate foarte bune în facultăţi similare din alte ţări.

Vara aceasta am avut norocul şi ocazia să simt pe propria piele ce înseamnă să înveţi şi să trăieşti într-o universitate din nordul Germaniei. Baza materiala (aparatură, mobilier, securitate, caculatoare, infrastructură, biblioteci etc) era mult peste visele  oricarei facultăţi din Romania, astfel încât, în orice domeniu te-ai fi specializat era imposibil să nu găseşti într-un timp rezonabil de scurt materiale exhaustive despre orice problemă.

Ca student, pentru obţinerea unor rezultate foarte bune şi asimilarea de cunoştinţe temeinice, nu trebuia să fii înarmat decât cu dorinţa de a studia şi invata un anumit domeniu alături de seriozitate, restul ţi se puneau plocon în faţă. Studentul nu numai că are acces la informaţii, fără nici un fel de dificultate dar profesorul se mai şi străduie şă faca un curs atractiv şi şă explice studentilor pe întelesul fiecaruia. Daca nu ai înteles te poţi duce fara nici un stres şă ceri lămuriri suplimentare profesorului în orele particulare. Niciodată nu vei fi întâmpinat cu un refuz. Tot ce se asteaptă de la tine este şă fii interesat cu adevarat iar materia şă te preocupe cu adevărat. Restul, este ca şi al tău. Cu toate acestea insă, există numeroşi studenţi „de-ai lor” care nu fac faţă acestui regim şi trec prin facultate ca gâsca prin apă, există mereu locuri libere la majoritatea secţiilor iar facultaţile duc o continuă lipsă de studenţi care să manifeste interes faţă de anumite domenii.

Acestea fiind spuse, apar firesc întrebarile: „Are rost să mai fac facultatea în Romania? Mă învaţă ea ceva?”. Raspunsul si părerea mea este : „DA. Absolut!”.

Aici in Romania înveţi sa lupti, ţi se ascute instinctul de supravieţuire, înveţi „să dai din coate”, să valorifici toate resursele care iţi sunt disponibile, să improvizezi şi să obţii performanţe cu lucrurile pe care le ai. Când ajungi într-un loc unde ai acces la informaţii, esti înconjurat de resurse abundente şi ai mai puţine constrangeri în realizarea unui task, vei ieşi învingator, şi te vei ridica deasupra celorlalţi mult mai uşor.

Un principiu de baza al inginerului automatist spune că din moment ce nu ai cum să modifici caracteristicile unui proces este absolut inutil să te plângi de natura lui pentru că nu te ajuta cu nimic la rezolvarea problemei. Aşadar hai să lasam jalea, plâgerea de mila, lamentaţiile şi înjurăturile! Să nu mai dam vina unii pe alţii să aşteptam să pice para malaiaţă în gura tuturor natăfleţilor. Este timpul să actionezi! Fă tot ce îţi stă în putere să atingi un anumit ţel, deşi va fi greu vei vedea că în final vei izbândi.

Cred că prea puţină lume ştie ce vrea. Totul se leaga de ce vrei să faci cu adevarat în viaţă. Cu cât ştii acest lucru mai devreme cu atât este mai bine pentru tine. Identifică un domeniu în care vrei să te specializezi, ceva ce iţi place şi ai vrea să ai ca profesie. Dacă faci acest lucru în facultate, atunci ai şanse de reuşită, liceul ţi-a deschis mintea şi ai văzut luminiţa de la capatul tunelului din timp, atunci eşti cu un pas înaintea multora. De aici nu-ţi mai ramane de facut decât să perseverezi în aprofundarea cunoştinţelor tale din această ramură, ai la dispozitie cărţi, reviste, site-uri, blog-uri şi nu în ultimul rând profesorii. In facultate nu ai cum să nu gasesti un profesor care să te ajute acolo unde nu ştii şi care îţi poate da un sfat bun la nevoie. Aici exista laboratoare, tot felul de asociaţii studentesti, programe de cercetare sau alte activitati organizate de unii profesori pentru studenţi, nu trebuie decât să ai ochii şi mintea deschisă. Când o să fii bun in ceea ce faci atunci nici oportunităţile nu vor intarzia să apară.

Şi nu uita că „Norocul ii avantajeaza doar pe cei îndrazneti”. Mai ştim că „Berzei chioare îi face Dumnezeu cuib”. Dacă nu faci parte din nici una din cele doua categorii atunci încearcă să te încadrezi undeva, altfel nu vei avea noroc...

Technorati tags:

4 Comments
Filed under:

Nu demult timp lucram la o aplicaţie ce trebuia să transforme în grayscale un obiect de tip Bitmap, cu pixelii reprezentaţi pe 24bpp. Pentru acest lucru foloseam două for-uri pentru accesarea fiecarui pixel. Imaginea mea avea o dimensiune destul de mare (1600x1024).

            Acestă transformare o mai implementasem de 2-3 ori cu coeficienţi diferiţi iar acum doream sa încerc un nou set de parametrii. Din lene, am rescris tot codul de mana (trebuia sa deschis un alt proiect, multe linii de cod...incomod). La rulare, surpriză.

 

Cât este diferenta intre cei doi algoritmi?

 

public Bitmap Grayscale1(Bitmap srcImg)

{

        ...

        // get source image size

        int width = srcImg.Width;

        int height = srcImg.Height;

 

        // for each line

        for (int y = 0; y < height; y++)

        {

                for (int x = 0; x < width; x++, src += 3)// for each pixel

                {

                        src[0] = src[1] = src[2] = (byte)( 0.2125 * src[2] + 0.7154 * src[1] + 0.0721 * src[0]);

                }

                ...

        }

...

return srcImg;

}

 

 

public Bitmap Grayscale2(Bitmap srcImg)

{

...

        // for each line

        for (int y = 0; y < srcImg.Height; y++)

        {

                for (int x = 0; x < srcImg.Width; x++, src += 3)// for each pixel

                {

                        src[0] = src[1] = src[2] = (byte)( 0.2125 * src[2] + 0.7154 * src[1] + 0.0721 * src[0]);

                }

                ...

        }

...

return srcImg;       

}

 

Răspuns:
 

Nu întâmplător am pus întrebarea „Cât”. Răspunsul este 1.7 secunde.

Algoritmul Grayscale2 procesa imaginea mult mai greu decât Grayscale1 şi nu îmi explicam de ce din moment ce foloseam aceaşi dimensiune a pozei, aceiaşi coeficienţi, acelaşi număr de înmulţiri. Răspunsul este simplu:

 

width si height – sunt două variabile declarate local metodei Grayscale1. În momentul în care se intră în for-uri la fiecare iteraţie x şi y sunt comparaţi cu width şi height. În cazul în care cele două mărimi sunt locale metodei, ele sunt declarate ca variabile în cache-ul procesorului, timpul de acces al variabilelor fiind cu cateva ordine de mărime mai mic decât în cazul accesării proprietăţii Height sau Width a obiectului Bitmap src.Aceasta trebuie adusă la fiecare iteraţie din memoria RAM pentru a se efectua comparaţia cu x si y.

 

            Am ramas în mod plăcut surprins de această mică descoperire. Pentru a doua dată nişte cunosţinte învaţate la o materie (sisteme cu microprocesoare - SMP) în facultate au aplicabilitate in viaţa reală. Prima dată a fost reacţia (invaţată in mod serios la Teoria Sistemelor - TS) care m-a facut să observ fenomenele un pic altfel. Un algoritm care se foloseşte de reacţie pentru a fi adaptiv întotdeauna este încadrat în categoria SPECTACULOS.

Technorati tags:

10 Comments
Filed under:
Până nu demult, ne întrebam dacă există a 4-a dimensiune? Răspunsul a fost ferm : Da! Timpul. Întrebarea care a decurs în mod natural de aici este: "Există şi a 5-a dimensiune?". Dacă există, care ar putea fi aceasta?

 

Îmi aduc aminte de un banc pentru "geek" despre persoanele cu orientări ştintifice:

 

La o conferinţă internatională despre teoria super-stringurilor este invitată toată crema cercetatorilor, savantilor fizicieni, matematicieni şi informaticieni. În pauza unui discurs, un matematician renumit îi expunea dificultăţile recente prin care trece unui mare cercetator din fizică:

"Nu ştiu cum faceţi dumneavoastra insă eu nu reusesc să îmi imaginez spaţii cu mai mult de 5 dimensiuni, oricât m-aş strădui.Dumneavoastră cum reuşiti?"

„Recunosc că în prinviţă această şi eu sunt limitat. În momentele de luciditate maximă reuşesc să îmi imaginez un spaţiu cu 6 dimensiuni, însă am nevoie de multă concentrare. Cred că pentru a ne lămuri ar trebui să întrebăm un informatician. Numai aşa vom afla secretul acesta...”

Exact în acel moment trecea pe lânga ei un informatician. Întrebat fiind de către aceşti cercetatori cum reuşeste să-şi imagineze un spatiu cu 7 dimensiuni a rşspuns:

„Nimic mai simplu, imi imaginez un spatiu N dimensional iar la urmă îi dau lui N valoarea 7”

 

 

Dar ce spuneţi despre un spaţiu cu 10 dimensiuni? Verosimil ori nu, cred că merită o privire şi o clipă de reflecţie...10th Dimension (din meniu alegeti pentru prezentare --> Imagining the Ten Dimension)

Salut!!

Sunt Victor Paraschiv student al facultăţii Automatică şi Calculatoare. Prin amabilitatea lui Alex am primit acceptul de a-mi ţine blogul pe studentclub. Sper ca prin posturile mele să aduc un aport valoric acestui site şi un numar cât mai mare de utilizatori interesaţi sau pasionaţi de programare şi/sau tehnologie Microsoft. Facultatea este locul cel de toate zilele al studentilor motiv pentru care voi da, în aceste pagini, glas şi gândurilor ce se vor aduna de-a lungul anului universitar...

Dar destul cu vorba, e vemea cravaşării neuronilor...