Nesimtire

Ieri, în pauza de masă, am fost cu doi colegi la Kaufland să ne cumpărăm ceva de mâncare.

Mare, dar nu mare, imensă chiar, mi-a fost mirarea când am văzut scris pe perete ca orice client va fi premiat cu 1 RON dacă va găsit un produs expirat. Asta se numeşte cică "garanţia prospeţimii". Nu umblu cu aparatul foto după mine, dar promit că revin cu o poză.

Ce concluzie tragem de aici?

1. Kaufland oferă garanţia prospeţimii, însă nu riscă mai mult de 1 RON pe produs expirat. Dacă ar fi într-adevăr o garanţie a prospeţimii, dar nu o garanţie neaparat, pentru că aşa e legea, Kaufland ar trebui să ofere un premiu de câteva sute de RON.

2. Ca şi client, dacă voi găsi un produs expirat, îl voi cumpăra, voi lua bonul, voi trage o fugă până la OPC, şi Kaufland va "premia" OPC-ul cu o amendă.

Nesimţire? Da. Pentru că by default, produsele de pe raft nu trebuie să fie expirate, pentru că dacă oferi "garanţia prospeţimii", nici nu s-ar putea pune problema să-ţi permiţi să "premiezi" un client cu 1 RON dacă te prinde cu probleme. Deci, stimaţi clienţi, nu vă lăsaţi premiaţi cu 1 RON, pentru că e josnic. Lipsă de respect faţă de client.

(de ce am scris pe Studentclub?)
 

Posted by Iacob Andrei | 7 Comments

September goodies

I was so busy these days with trying to take some certification exams (the test center is either closed or they don't like me) and a job interview, that I didn't have time to take a look at the latest Blend 2 release.

Blend 2 September CTP comes with a lot of great new features like:

-  the XAML/design split view. This was the first thing that I noticed. Take a look at the screenshot.

- Visual Studio 2008 support. I don't have it installed, so don't ask me about it.
- A storyboard picker. A great way of managing (duplicating, reversing, deleting) storyboards. No need for annoying little picky work for managing them.
- keyspline editor for animations. This is big. Check out the screenshot. You can manipulate animations from the properties bar and also you gain access to some fine tuning of your storyboard.



-  Until now,  if you tried to animate a point on a line (in animation mode, modifying let's say it' position) the original shape of the object would be altered. Now, there is the Vertex animation, that solves the problem.

Other features are:

  • making controls from existing objects
  • a breadcrum bar, for when you're editing a template, to see where you are in the hierarchy
  • font embedding inside the project
  • build options (this can be very useful for let's say when you want to change the way the build is made when you are in development and not ready for release)
  • scaling, moving, duplicating of (multiple) objects (just like you're used to from stuff like Powerpoint)
You can read more about this here.

Also, I remembered that when I was at Breaza, in the QA session after my presentation, someone from the audience asked me for some examples where Silverlight is used in real world business scenarios. I responded with AOL and The Major League Baseball. Now, there is Quicksilver, the most popular brand in surf and winter sports clothing. Their new website uses Silverlight (and ASP.NET, Sharepoint 2007, Commerce 2007, BluePortal kit for User Generated Content connected to Silverlight Streaming,, Windows Live ID, Live Alerts & communication through Live Messenger with custom video Activity) and you can check it out here.

Oh yes, and Lee Brimelow joined Adobe as a Platform Evangelist.

In other news, this is the penultimate post in this blog. I will move to a .ro domain (I just have to buy it, as I've already found hosting provided by a friend of mine) I think until the end of the month.

Technorati tags:

Posted by Iacob Andrei | 9 Comments
Filed under:

Directly from Charles Petzold, USA

I have a new wpf book! 3D Programming for Windows, the latest title from Charles Petzold was just brought to me by the mailman. The other book about WPF (Applications=code+markup) I bought it with money made from Rentacoder (a Firefox extension and a CRUD Php application) but this one I got for free AND with an autograph and a good thought from Charles Petzold on the first page. This is because of the blog you are reading right now.

 

A while ago, when the book was printed, the author called the wpf bloggers for their home addresses to get the book. I sent the email, it was confirmed and yesterday I had the book in my hands, directly from Charles Petzold, USA. This book is all I wanted after I’ve read the Applications=code+markup (that didn’t have a printed chapter about WPF 3D, but was available here). The book comes in very handy, as I’m really tired of learning from blog posts, sample applications, codeproject or the msdn. I already started reading it, although I have the driver’s license exam next week (I think I’m the only person over 20 in my town without a driver’s license) and some MCTS exams two weeks from now. Hope I don’t mess up.

 

This is great. Mostly because it inspired me to start a small project, a month-long project, I guess in October or November. It’s a surprise (I think Lucian is the only person who knows about it), so stay tuned. Oh, and it’s going to be in English.

Technorati tags: ,

Posted by Iacob Andrei | 4 Comments
Filed under: ,

se-radio.net listener survey

I'm sure some of the readers of this blog listen to Software Engineering Radio, but If you don't I'm positive that you noticed the little (big) image on the left that takes you to the website. The SE-Radio team has set up a survey to study the listeners of this podcast. It would be nice if you're a listener to complete the survey. They will give away books, you know.. The survey.

Technorati tags:

Posted by Iacob Andrei | 5 Comments
Filed under:

me@Tabara ForumIT - "bonuleţ"

 

 

Nu vii la prezentare, nu mănânci. 

Technorati tags:

Posted by Iacob Andrei | 9 Comments
Filed under:

Mă bucur că am admiratori

Sincer, chiar îmi place când sunt copiat. Înseamnă conţinut de valoare.

http://itboard.ro/blogs/stefan_-_gabriels_blog_-_it_pro/archive/2007/08/01/avem-silverlight-de-la-microsoft.aspx 

http://studentclub.ro/andrei_iacob/archive/2007/05/10/silverlight-architecture-overview.aspx

În detalii, el:

 

eu:

 

Fiţi atenţi, mai pregătesc încă două articole, unul despre un proiect OSS şi altul despre Silverlight şi Greasemonkey. COME AND GET IT!!! 

Summer movies/tv-series

Timpul este de partea mea, cel puţin până la mijlocul lunii septembrie. Internetul este ca de obicei o dată pe zi, iar plictiseala caracteristică unui oraş mic m-a împins la demararea a două proiecte personale open-source (asupra cărora voi reveni cu detalii) şi instruirii pentru permisul de conducere (în sfărşit, după ce am amânat timp de 4 ani).

În Iaşi, în cămin, nu aveam televizor şi nici nu simţeam nevoia. Acum, după ce am vizionat câteva dintre aberaţiile televiziunilor româneşti am observat mai bine de ce. Cam de vreo lună mi s-a stricat televizorul. Cred că şi el s-a săturat de gradul de incultură şi de prostie care se găseşte pe micul ecran. Filme cu Bruce-Lee şi cu Van Damme, emisiuni cu neveste de sportivi, emisiuni cu Porumbeanu şi cu Tanti Miţa protectoarea câinilor, etc. Nici ştirile nu sunt de calitate. Numai prostii, manipulare, reclame, ştiri deprimante, politică murdară şi multă multă  vorbă goală. De asemenea, există şi un post de televiziune la care se adună în fiecare seară câţiva oameni cu nasul maro şi ne arată la toţi cum îţi poţi hrani familia aberând în faţa camerei de luat vederi. Ce mai, conţinut apreciat doar de cei care consideră berea la PET cea mai tare invenţie din ultimii ani, şi care se întreabă în clipele de luciditate dacă "micul gigant" e pleonasm (caz real), deci generaţia "Ciau Darvin".

De aceea, am recurs, pentru a-mi bucura mintea şi ochii, la the good old movies, unele care voiam să le vâd de mai multă vreme, însă nu am avut timp ori chef. Singurele emisiuni la care ar merita televizorul ar fi cele de pe National Geographic sau Discovery (cu toate că ar trebui să se cheme The Motor Channel, având în vedere cantitatea copleşitoare de emisiuni despre motoare în general). Chiar asta mi-a adus aminte de un chestionar de pe site la IEEE, dacă te potriveşti în postura de membru IEEE. Una dintre întrebări era ceva de genul "On the same time, on TV, there is Desperate Housewives, Jerry Springer (sau ceva de genul) and a WW2 Documentary on the History Channel. What is your choice?".

 

Brazil. Excelent. Voiam să-l văd de multă vreme şi am avut plăcuta surpriză să-mi aduc aminte mici secvenţe din film. Mi-am adus aminte că îl mai văzusem la o vârstă foarte mică împreună cu tatăl meu. Însă pe atunci nu ştiam ce înseamnă birocraţie.

 

 

 

 

A Clockwork Orange. Trebuie să recunosc, filmul acesta l-am văzut prima dată la TVR acum vreo doi ani.  Oricum, la a doua vizionare am mai observat nişte referinţe în cultura contemporană şi, bineînţeles, cine n-ar vrea să mai vadă "a bit of the old ultra violence" pe muzica lui "Ludwig van".

 

 

 

 

 

Monty Python's Flying Circus. Eggs, sausage, spam, spam, spam, and spam.

 

 

 

 

 

 

Solaris. Ăla vechi, de Tarkovsky. Tot a doua vizionare.

 

 

 

 

 

 

Mr. Bean's Holiday. Nu m-a mai amuzat Mr. Bean cum făcea pe vremea copilăriei mele, însă totuşi o modalitate mai bună de a pierde o oră şi jumătate decât dacă te-ai uita la "tembelizor".

 

 

 

 

 

Casino Royale. Mi l-au recomandat mulţi. De aceea cred că ar trebui să mai fac curat prin lista de messenger. Cred totuşi că e filmul cu James Bond care mi-a plăcut cel mai mult (la nivelul la care aş aprecia totuşi un film cu James Bond). Aş prefera oricând un film din seria lui Austin Powers, chiar dacă le-am văzut de câteva ori.

 

 

 

 

Office Space. Cred că pentru a patra oară. Dar e ceva profesional aici, deci nu vă băgaţi. "I deal with the god damn customers so the engineers don't have to. I have people skills; I am good at dealing with people. Can't you understand that? What the hell is wrong with you people? ".

 

 

 

 

 

PI. M-a impresionat foarte mult când l-am văzut prima dată. Nu mai ţin minte cine mi l-a recomandat, dar bine a făcut. Şi aici e ceva ce ţine oarecum de profesie, deci nu mai comentăm. Dar totuşi, la a doua vizionare, în perioada în care ascultam şi Gothic Kabbalah de la Therion, parcă a avut altă aromă.

 

 

 

The Sopranos. După mulţi ani de la primul episod, în sfărşit m-am uitat şi eu la Sopranos (colegul meu de cameră era mare fan). Impresia este bună, destul de plictisitor pe alocuri, însă compensează prin alte lucruri. De asemenea, momentele de umor negru mi-au plăcut foarte mult.

 

 

 

Şi acum intrăm într-o chestie aparte. Serialele "medicale". Au fost de-a lungul anilor, un fel de gen al serialelor, cele cu teme medicale. Primul (care l-am văzut) a fost M.A.S.H., apoi E.R., Chicago Hope, Scrubs, Grey's Anatomy. N-am ce spune, trebuie să recunosc, multe mi-au plăcut.

M.A.S.H. Aş putea spune că mi-a marcat copilăria, când mă uitam pe la 10-11 ani. Se pot învăţa multe din acest serial, umorul gen fraţii Marx (chiar este şi o referinţa la ei într-un episod), situaţii moralizatoare, etc (păcat că după aia m-am uitat la Married with Children şi Al Bundy ne-a stricat educaţia la toţi). Filmul a fost mai bun, parcă mai dur, şi ca orice lung metraj care precede un serial, cu actori mai cunoscuţi. M.A.S.H. ar fi trebuit să se cheme Hawkeye in Korea după ce Alan Alda a ajuns regizor, atenţia fiind tot timpul orientată spre acest personaj. Partea proastă este că acum, după vreo 30 de ani de la primul episod, nu mai este amuzant, nu mai este actual, nu mai este nimic (dar tot este mai bun decât dejecţiile de la televiziunile româneşti). Am încercat să ma uit la câteva episoade acum, dar m-am plictisit foarte repede.

E.R. şi Chicago Hope. Nu mai ţin minte nimic din ele şi nici nu aş vrea să-mi aduc aminte.

 Scrubs. Amuzant. Foarte amuzant. "Listen Super Girl, I'm gonna break you down into so many little pieces that my grandmother, who can do a thousand piece puzzle of clear blue sky in less than an hour will never be able to finish putting you back together again, even if she does go back in time to when her vision was perfect."

 

Grey's Anatomy. Urmănd modelul din Scrubs (cu stagiarii conduşi de un doctor exigent, sarcastic, etc + o poveste de dragoste), dar fără partea amuzantă. Tentative sunt, dar poate sunt eclipsate de alte chestii. Cum ar fi tumorile. Orice în acest serial este o tumoare. Cele mai cunoscute replici sunt "You have a tumour", "We found a tumour in your X", "Look, see the tumour?". 80% cred, din toate cazurile prezentate aici, sunt de tumori. Vine cineva cu o erecţie care nu-i trece de două zile, are tumoare la coloană. Altul se loveşte la cap şi face un cheag, doctorii îi găsesc şi o tumoare, normal. Alta vine cu nu ştiu ce boală şi doctorii observă că e prea fericită şi îi găsesc, aţi ghicit, o tumoare care îi creştea nivelul endorfinelor în corp. De asemenea, devine previzibil, pentru că aproximativ 70% dintre pacienţii de care se ataşează unul dintre aceşti medici, mor în timpul operaţiei.  Mda, deci Grey's Anatomy cade din playlist, încă de la primele sezoane. Cine s-a mai uitat la el, poate să-mi spună şi mie dacă până la sfărşit, nu cumva îi găsesc aştia o tumoare şi lui Grey? Asta ca explicaţie pentru stările emo şi Ally McBeal-ish.

Dar s-au terminat şi astea. Revenim la cărţi.

Technorati tags:

Posted by Iacob Andrei | 2 Comments
Filed under:

Linda coordination language

“Coordination is managing dependencies between activities.”
(From Coordination Theory)

“Coordination is the process of building programs by gluing together active pieces.”
(Carriero and Gelernter, Linda creators)



I recently started research for my BSc dissertation project that I will have to finish until the next year.

Doing so, I wanted to learn more about the ideas behind the Linda coordination language, ideas that will be in a certain amount, present in the final application in my project. Also, I started gaining interest in Erlang, a programming language designed especially for distributed systems by the telecom industry. But the ideas in Erlang and the language are a little bit too complicated for discussions at this time.

Digging through Sourceforge and other websites alike, I didn't really find anything that would connect Linda and .NET. So I decided that there is no better way to understand the concept than to implement it.

A fun fact is (this is from Wikipedia) that the name of the language is after Linda Lovelace (a classic actress), like Ada is for Ada Lovelace.


Linda is a coordination language with implementations based on C (C-Linda) and Fortran (Fortran-Linda). It was developed by David Gelernter and Nicholas Carriero at Yale University. Now, Scientific Computing Associates Inc. (founded by David Gelernter) has a commercial implementation named TCP-Linda.

C-Linda and Fortran-Linda are programming languages. The code I wrapped up is an implementation of the Linda language in C# using threads and running on .NET (I would propose a program like this at school for a homework). To make an analogy, C#-Linda, which doesn't exist, would be a different compiler.

Linda is used primarily for parallel programs, being based on a global associative object memory called tuple space. The tuple space is the center of the Linda language, providing IPC and sync independent of the underlying platform or run-time.

As it is not a complete language, Linda is actually a set of objects and operations. Therefore, the existing implementations are new languages that have been injected with the Linda concept.

 

The Linda Objects

There are two fundamental objects in Linda. The tuples and the tuple space.

  • The tuple is a collection of fields, each with a fixed type (that is borrowed from the language in which Linda is implemented. The fields in the tuple can be either formal (like a variable) or actual (like a constant). It is important to state that Linda does not specify anything about the types of the fields in the tuples, and that the tuples may have any number of fields. This makes me conclude that the fields can contain anything the underlying language can offer, new classes defined in the program, or other tuples.

  • The tuple space is a collection of tuples. It's not a set, so there can be copies of the same tuple in the same tuple space.


All the IPC in Linda is made using this tuple space, processes accessing this medium.

I would extend the fact that there are no specifications about the types of the tuple fields (with the thought in mind that I may be wrong) by considering that a tuple space can be a field in a tuple. That is why, from an OOP perspective, I've defined the operators in Linda as methods to tuple spaces, not to a main Linda class (as i've seen in other implementations). But I'll take this into consideration for the implementation in a future release, after I find some deeper specs of Linda, because with these, the matching of tuple spaces is not defined, but also, there is nothing in the specification that tells me that Linda can have only one tuple space. As I said, I might be wrong, so the discussion is bookmarked. Also, I'm still digging the www for a concrete, formal language specification of Linda, in any form. If I won't find it untill autumn, I think i'll compile what I've found already into a PI-Calculus description of the concepts involved. If there is someone out there reading this that has such a document, please email me using the contact form on the left.

 

 

The Linda Operators

The original Linda specifies four operations on the tuples and tuple spaces.

The in operator:
Extracts a tuple from the tuple space by matching it to its arguments. It also consumes it, so the tuple is no longer in the tuple space,

The rd operator:
The same as the in operator, only that the process does not consume the tuple, it leaves it in the tuple space.

The out operator:
Produces and then inserts a tuple into the tuple space.

The eval operator:
Can be used to fork processes that evaluate tuple fields, produce a tuple and insert it into the tuple space.

A visual representation of how these operators work is the following:

 


An important aspect here is the matching problem for the in and rd operator. These operators search for a tuple T that matches a template M supplied as a parameter. T and M match if:
- M and T have the same number of fields
- the fields have the same types
- each pair of fields match. They match only if either they are both actual and have equal values or one of them is formal and the other is actual.

If template matches, then all the formals in the template are replaced by the actuals in the tuple.
An interesting thing is that in the original Linda, the in and rd operator are blocking, so if there is no tuple in the tuple space, the process bloks until the tuple appears. This can be used for synchronization. Also, there are the non-blocking operators, inp and rdp, but from my readings they were not in the original Linda specs (I may be wrong).

In this implementation, the tuple space is a class that holds a dictionary of lists that contain tuples. The dictionary has the first key a hash of the tuples, computed after the types of the fields. By using a recursive matching function, I took into consideration nested tuples. The complexity for the tuple matching isn't brilliant, but is better than the sequential search. I'm positive that there is always a much better idea, but that's beyond the scope of this post. In a future release, I will implement a much better data structure for the tuple space.

 

 

Example of usage

 

Linda.universe.in_("1st field", 2, 1.2, Linda.formal,X); //Linda.formal means that the next parameter is not actual, it's formal

Linda.universe.eval_(1,2,work);//Work must implement the IActiveTuple interface. In the eval method, a separate thread is started for each of these instances.

Now, the thing is that for this to be related to a distributed system, the processes that work with the tuple space must be (as much as possible) managed by other computing entities rather than the original caller of the Linda program. In a "real world" situation, when we can talk about a true distributed system, the Worker class would be instantiated in a different .NET Runtime, on a different machine, or on the same machine, but using a different processor than the base class. There, on a multi-computer runtime, the project must expand on using Web Services, or any other means of network IPC.



References:
- Coordination Models and Languages - George A. Papadopoulos - http://www.cs.ucy.ac.cy/courses/EPL441/2-Linda.ppt
- CS-551 / Fall 1994 Parallel Computing: Models, Languages, and Architectures http://www.cs.bu.edu/~best/courses/cs551
- http://en.wikipedia.org/wiki/Linda_(coordination_language)

Technorati tags: , ,

Posted by Iacob Andrei | 0 Comments
Filed under: , ,

Attachment(s): LindaSharp.zip

Abstractizare


Anul trecut, în Bootcamp, într-o prezentare, Ciprian Jichici ne zicea că programatorii adevăraţi sunt cei care pe vremea calculatoarelor din prima generaţie, programau shimbând poziţiile unor comutatoare. De altfel, pe acea vreme, nu numai că nu aveai acces, dar nu avea calificarea necesară să lucrezi la aşa ceva dacă nu făceai studii superioare de electronică sau de matematică (mi-am adus aminte de asta când citeam cartea de maşini virtuale unde autorul aducea vorba de "galaxii îndepărtate").

Şcolile de matematică în general (cu eventualele înjurături de rigoare, aici aş include şi pe cele de informatică) tind să formeze cursanţilor o gândire abstractă. De ce? Pentru că tot ce mişcă în acest domeniu este o abstractizare a unor concepte reale sau la rândul lor abstracte.
O maşină de calcul înţelege un anumit cod maşină, un cod binar. Nu ar fi productiv să lucrăm aşa, astfel că avem opţiunea de a lucra în assembly (Scott Rosenberg face o analogie frumoasă. El spune că a programa în cod maşină este a lucra direct cu mintea calculatorului, iar a scrie cod asm este a-i şopti la ureche). Dar nici în această zonă nu putem spune că am fi prea rapizi în a dezvolta software. Şi de altfel, aici intervine şi problema portabilităţii. În "Dreaming in code" (care poate servi foarte uşor şi ca o scurtă introducere în istoria software-ului) am citit despre compilatorul de Fortran care apăruse prin anii '60 (nu mai zic ce făcea, că toată lumea ştie ce face un compilator) şi cercetătorii erau sceptici, pentru că pe acea vreme "timpul de calculator" costa bani mulţi şi compilatorul rula mai greu. Până nu a fost rafinat compilatorul şi programatorii au aflat că rentează mai mult să scrie cod Fortran în timp mult mai scurt decât să scrie direct în limbaj de ansamblare, compilatorul nu a fost adoptat pe deplin. Plus că acel compilator ajunsese destul de performant şi fusese foarte optimizat la capitolul generare eficientă de cod încât de multe ori un program în Fortran rula mai repede decât unul scris "the hard way". Programarea "la scară largă" zic eu, inspirat din lecturile mele a apărut odată cu limbajul C (care este nemuritor în părerea mea) şi sistemul de operare UNIX, fapt datorat pătrunderii acestuia în mediul academic (trageţi ce concluzie vreţi). Peste ani, s-a dezvoltat conceptul de maşină virtuală, cu avantajele şi dezavantajele sale. Să nu zicem neapărat maşină virtuală. Mai degrabă run-time. Pentru că orice maşină virtuală este un run-time dar nu şi invers. Şi trecerea s-a făcut mai mult de la limbaj interpretat la run-time. Aşa numitele limbaje atât compilate cât şi interpretate. Maşina virtuală a apărut mai târziu, odată cu limbaje gen Java sau C#. Cu alte cuvinte, la fiecare pas înainte, s-a mai adăugat un nivel de abstractizare care a ajutat programatorul să scrie cod mai repede şi mai uşor, software-ul fiind scos pe piaţă mai rapid şi teoretic rezolvă probleme reale în timp mai scurt.

Aici apare o mică mare problemă. În "Grid Computing - A Practical Guide to Technology and Applications" se dedică un capitol întreg aşa numitului Productivity Paradox. Despre ce este vorba? Se zice că TFP (Total Factor Productivity) adică rata de creştere a productivităţii datorată tehnologiei în SUA, definită de economiştii de la Federal Reserve Bank (pe ce baze nu-mi pot da seama, dar nici economist nu sunt) a scăzut de la 1.9% în 1948 la 0.2% din 1973 până în 1997. După cum se poate observa, aceasta este perioada în care calculatoarele (de fapt microcalculatoarele) au invadat industria şi au ajuns pe biroul fiecăruia. În 1987, profesorul de la MIT (laureat Nobel) Robert Solow a zis că “We see the computer age everywhere except in the productivity statistics.” (să vă aduc aminte că şi Bill Gates a zis că "No one will need more than 637 kb of memory for a personal computer"). Asta a rămas cunoscută ca "The Computer Paradox". În ultimii ani, totuşi, a fost un boom al acestui TFP, unii spun că se datorează investiţiilor în tehnologie din anii anteriori, alţii spun că este datorat "efectului de concentrare", adică productivitate crescută doar în domeniul IT. Oricum, este firesc să crească, având în vedere nivelul de utilizare din ziua de azi, dar este firesc să fie şi probleme datorate inovaţiilor şi valurilor de tehnologii. Aici fac o proiecţie a problemei în programare, când fiecare tehnologie "salvatoare" ridică la rândul ei probleme, câteodată chiar mai mari, şi beneficiile ei se cunosc târziu şi investiţia se amortizează mai greu, chiar în momentul în care apare altă tehnologie "salvatoare".

Revenind la subiect, care ar fi următorul nivel de abstractizare? Sau va mai fi unul?

Auzisem prin anul II despre nişte ruşi care au făcut o maşină ce rula nativ cod MSIL. Interesant. Inovativ? Nu. Evoluat? Da. Pe moment am rămas un pic pe gânduri să înţeleg cum se poate aşa ceva, având în vedere framework-ul, etc.. dar mi-am revenit în scurt timp. De altfel citisem pe undeva că orice software poate fi programat şi hardware doar că aici intervine duşmanul (costul).

Undeva, parcă pe Channel9 se discuta despre un sistem de operare scris în C# (în modul caracteristic, ceva gen "An OS written in C#! How cool is that?" Depinde. S-ar putea să nu fie aşa de cool, de aceea deocamdată este în research). Ăsta este următorul nivel de abstractizare? Maşină virtuală (rulând o maşină virtuală)*n sau o maşină virtuală evoluată care să înţeleagă cod din ce în ce mai apropiat de limbajul natural şi care să lucreze cu "bucăţi" atât de mari încât intervenţia programatorului să fie cât mai mică? Încât să nu mai ai nevoie de vestitul "computer science degree" să fii programator (oricum nu ai nevoie, cu toate că şi "Codul muncii" nu e de acord. Dar cu o licenţă în informatică eşti "computer scientist".. sau aşa îmi place mie să cred şi aşa am auzit că se practică prin străinătate)?

Acum, în Silverlight, s-a introdus un Dynamic Language Runtime care rulează pe un mini Common Language Runtime. Programatorii care au lucrat la el (printre care se numără şi John Lam care a făcut RubyCLR) spun că este doar un bridge între limbajul dinamic şi CLR (asemănând programarea în limbaje dinamice ca fiind "flower power" şi cea pe un limbaj static ca fiind comunistă.. în fine.. asta e flame-seed), dar pare a fi încă un nivel de abstractizare.

Revenind la partea introductivă, s-ar putea spune că programatorii din prezent (generaţia din care fac parte şi eu) sunt programatori de maşini virtuale în primul rând, şi de calculatoare în al doilea rând. Dar tot adevăraţi.

Technorati tags: ,

Posted by Iacob Andrei | 3 Comments
Filed under: ,

Summer reading/listening

O serie de evenimente nefericite au dus la şederea mea în Fălticeni pe perioada verii.

În ciuda presiunilor mele la adresa unui ISP care se ocupă de cartierul meu, tot nu am reuşit să trag un cablu UTP pe geam (cum face toată lumea aici) pe motiv că nu este destulă bandă. Asta este unul dintre factorii care îmi transformă prezenţa pe internet în absenţă. Astfel că, încă o vară, voi plânge după internetul oferit de RoeduNET în cămine.

Rămâne un singur lucru de făcut. Să valorific ultima vacanţă din studenţie cât mai pot.

Deocamdată citesc.

Dintre titlurile epuizate:

A Mathematician’s Apology - G. H. Hardy - am auzit de ea de pe blogul lui Aaron Swartz (cel care a fost coautor al RSS-ul la 14 ani). Mă face să-mi pară rău că nu am învăţat destulă matematică în "tinereţe".

Programming Pearls, Second Edition - Jon Bentley (pentru a doua oară, însă de data asta am făcut şi o bună parte din exerciţiile de la sfârşitul fiecărei "istorioare")

Dreaming in Code - Scott Rosenberg - sună frumos, şi chiar este, însă e genul de beletristică pe care numai un programator o poate aprecia (deci e super geek). Asta dacă are timp să o citească. "A book about why software is hard". La fel ca Hacknot.info (doar că nu la fel de fun), e genul de lectură potrivită pentru momentele alea în care n-ai chef să lucrezi, dar vrei să faci ceva pentru "dezvoltare personală". A, da, este şi un pic anti-Microsoft deci în funcţie de modul în care priveşti lucrurile, s-ar putea să devină enervantă, tema cărţii este Chandler, un soft open source. Mie mi-a plăcut pentru că se pot învăţa multe din experienţele descrise acolo.

Grid Computing - Joshy Joseph, Craig Fellenstein - licenţă.

Grid Computing: A Practical Guide to Technology and Applications - Ahmar Abbas - licenţă (mi-a plăcut mai mult decăt cea de mai sus)

Deocamdată mă lupt cu:
MCTS .NET Framework 2.0 Distributed Application Development - încă o linie în CV, încă un cuvânt în semnătură la email şi sper eu alte avantaje pe viitor. Am speranţe să ajung MCTS până în toamnă, de când nu se mai dau în Iaşi examenele (din ce am auzit). Apropos de asta, am primit un mail de la Cisco Academy, ca nu se mai dau examenele cu Thomson Prometric. Să fie acelaşi lucru şi aici?

Virtual Machine Design and Implementation in C/C++ - Bill Blunden - unul dintre hobby-urile mele "secrete". După review-uri, o carte destul de slabă pentru acest subiect, însă nici eu nu sunt prea "gras" în materie, deci ar fi ok. Ce îmi place mult este simţul umorului întâlnit peste tot. De exemplu: "A long time ago in a galaxy far, far away the size of a byte varied from one hardware platform to the next." sau "C.A.R. Hoare is like Dijkstra; he tends to pop up everywhere in computer science".


Partea interesantă este că de fiecare dată când citesc îmi vin idei de proiecte. Partea proastă este că nu aş avea timp să le fac, însă voi avea o tentativă, presupun că după Bootcamp.

Cam de când mi-am cumpărat mp3 player, ascult destul de multe podcasturi, toate pe teme de tehnologie/programare. Am ascultat destule în ultima perioadă încât să separ vorba goală de chestiuni concrete şi am rămas abonat la 3 podcasturi destul de populare (am rămas abonat şi la alea de la universităţi unde sunt postate cursuri audio, însă nu sunt atât de plăcut la ascultat pe tramvai în drum spre şcoală).

.NET Rocks - pro: interesant, consacrat, cu simţul umorului, se vorbeşte despre noutăţi, contra: dacă .NET Rocks cum rocks melodia de la început, atunci eu mă apuc serios de Java. Aia e un fel de.. nu ştiu ce e.. cultura mea muzicală despre rock nu mă ajută să o clasific. Plin de reclame, mai ales au una fix în mijlocul podcast-ului, când în mijlocul discuţiei, unul dintre ei mai bagă un "yeah, well, you know, this is the same like when you want to reuse the X component. But with Z.com - delivering the best.. " bla bla bla. Bine că am FFWD la mp3 player.  Dar cu toate acestea rămâne cel mai popular, cel mai vechi şi cel mai bun podcast pentru programatorii în .NET.

Hanselminutes - super. Scott Hanselman rocks. Subiecte extrem de interesante şi practice, variind de la Windows Home Server, la how to interview a software engineer, la life hacking  şi la building your own MicroISV. Are şi asta reclame, dar numai la început. Contra: prea scurt şi ultimul podcast m-a enervat enorm, când am auzit că el şi-a luat doi elevi (da, elevi de liceu) ca interni pe vară :) . Unul pe asp.net şi altul pe powershell. Ca să vezi treabă... Acum, de duminică, Scott Hanselman a acceptat un post la Microsoft. El spune că podcast-ul şi blogul nu se vor schimba.

Software Engineering Radio - La ora actuală preferatul meu. Dacă reuşeşti să treci peste accentul personajelor (majoritatea sunt europeni) este excelent. Este total independent de tehnologii sau firme, nu au reclame deloc, şi au subiecte foarte interesante, despre software engineering în general, dar şi despre limbaje de programare interesante dar nepopulare, etc... Dintre subiecte: limbajul Scala, Internals of GCC, Refactoring, Dynamic languages for static minds, interviu cu Dragoş Manolescu etc.. Plus că, spre deosebire de .NET Rocks, melodia de la început chiar rocks. Adica e chiar rock. De fapt e destul de metal. Se vede că europenii scot cea mai bună muzică :). Şi după părerea mea unul dintre cele mai bune podcast-uri. Contra: calitatea înregistrării câteodată lasă de dorit. Dar pentru mine, compensează cu un conţinut de calitate şi prin lipsa reclamelor (dacă ar avea reclame, cred că s-ar auzi mai bine).

De asemenea, mai ascult şi de pe Channel9, dar numai despre subiecte care mă interesează în mod special (Silverlight, WPF, WCF, etc).

Acum, în mod offline, am reuşit să fac şi ceva ce nu am avut timp de multă vreme: curăţenie prin feed reader. Ajunsesem lejer la peste vreo 200 de feed-uri, dar cum o "sesiune" Snarfer dura maxim 10 minute, am zis să le mai filtrez un pic. Nu că nu mi-ar plăcea "The gentle art of making enemies" dar nu am de gând să numesc aici blogurile care au zburat din reader. Oricum, printre ele se numără şi a-list-ul românesc (care după calitatea post-urilor raportată la numărul de vizitatori, tind să-i dau dreptate lui Alexandru Lăpuşneanu). Mai aveam pe un individ care scria lucruri interesante dar a început să scrie despre religie, deci... Despre altul am observat (destul de târziu) că toată prezenţa lui pe net face parte din ditamai maşina de marketing, deci... Dar, după cum am zis, fără nume. Culmea a mai fost cineva, fost angajat Microsoft, mare blogger, care într-un exces de profesionalism a dat cu pietre în protocolul BitTorrent zicând că este folosit doar pentru a scoate filme piratate de pe net şi apoi a început să fie lupul moralist. Într-adevăr într-o oarecare măsură, dar un programator ar trebui să aibă o abordare de genul ăsta. Another one bites the dust. Nu a plecat în schimb nici slashdot şi nici reddit, cu toate că de la ele vin articole foarte multe. Rămân de asemenea abonamentele la podcasturi, la chestiuni de profil şi blogurile cunoscuţilor. A long story short, din 242 de feed-uri, am mai aplicat un filtru de bullshit şi am rămas cu the lucky number 113. Nu am să fac share la opml (şi nici nu folosesc Google Reader) pentru că.

Sper că până data viitoare voi avea ceva palpabil şi cu un director src în el, să pot posta ceva bun în blog.

Technorati tags:

Posted by Iacob Andrei | 2 Comments
Filed under:

Networking micro-quiz [now with answers]

Astăzi am susţinut un examen foarte interesant la Reţele de Calculatoare şi pentru pregătirea lui am citit ceva.. (semestrele de CCNA nu prea m-au ajutat). Acel ceva este cartea dl-ui Tanenbaum, Computer Networks 4th Ed (de la acelaşi autor, în anul I, Modern Operating Systems, m-a ajutat foarte mult şi încă mă mai inspiră în diverse activităţi).

Viziunea mea despre examen a fost greşită (am aflat când am văzut subiectele), însă pentru a ajuta procesul de învăţare, la 2 a.m. noaptea trecută, am încercat să răspund la câteva întrebări din cartea respectivă.

Vă invit să vă daţi cu părerea. Doar acestea mi le mai aduc aminte.

1.(asta am auzit-o din altă parte, nu din carte) Cum aţi modifica protocolul TFTP pentru a permite transferul fişierelor mai mari de 33 mega.


Problema cu limita impusă de protocolul TFTP este relativ clasică. Mărimea fiecărui bloc de date trimis este de 512 octeţi, astfel, limita este verificată de un contor care reprezintă singura metodă de limitare în protocol (având în vedere că lungimea fişierului nu este transmisă). Întrebarea (părerea mea) se referă la cum se poate modifica protocolul în limita bunului simţ, adică fără a modifica dinamica protocolului, ci doar a-l extinde într-un anume fel. Cu alte cuvinte construcţia unui protocol de tip "wrap" peste TFTP care ar sparge un fişier în unităţi transmisibile şi le-ar trimite folosind TFTP nemodificat, nu ar fi un răspuns corect.

Deci după cum se poate observa, pot fi modificate ori mărimea blocului ori contorul. Şi acestea să fie în spiritul "negocierii" între client şi server. Dacă de exemplu mărim block-size-ul la mărimea MTU-ului suportat de mediul de transmisie, am mări fişierele destul de mult (Ethernet are un MTU de 1500, deci aproape am tripla mărimea). Dar dacă vrem să exagerăm, putem mări tipul de date al contorului, astfel reuşind să transmitem fişiere cu un ordin de mărime considerabil mai mare.

Dar dacă am face toate acestea, am reinventa roata. Metoda 1 şi metoda 2 sunt deja în stadiul RFC de aproape 10 ani.


2. De ce să folosim UDP, n-ar fi ok doar să trimitem pachete IP raw?

O întrebare care la prima vedere pare legitimă. Chiar. De ce să folosim UDP şi nu pachete IP raw? Că doar oricum nu avem control de transport, conexiuni, etc? Plus că sockeţii raw sunt l337 prin definiţie :). Când discutam despre asta cu Alex Burciu, el a spus printre altele că pentru a folosi sockets raw, programul trebuie să ruleze sub privilegii de root. Aceasta ar fi un motiv foarte bun care ne-ar putea împiedica, prin condiţia de portabilitate. Pe deasupra, de la Windows XP SP2 încoace, pentru a limita numărul de atacuri lansate de pe staţiile Windows, accesul la sockets raw a fost limitat (de tot). Avem un workaround, dar soluţia nu merită încercată doar pentru acest context.

Destul despre argumentele ce ţin de user-access (că totuşi ar fi şi ele nişte argumente). Răspunsul cel mai bun, cred eu, este că pachetele IP funcţionează la nivelul reţea, iar datagramele UDP la nivelul transport (în ISO/OSI). Ce "nu ştie" protocolul IP? Nu ştie port-uri. Astfel că dacă am putea implementa un sistem echivalent port-urilor la nivelul pachetelor IP, am îngreuna sistemul de operare, care ar trebui să ştie în funcţie de conţinutul pachetelor la ce proces să le trimită.

3. (banală) DNS foloseşte UDP. Ce se întâmplă dacă se pierd datagrame?

O întrebare foarte uşoară. Când un client face o cerere DNS, porneşte un timer. Dacă acesta expiră înainte de a primi un răspuns (să zicem că răspunsul "s-a pierdut pe drum"), pur şi simplu mai întreabă o dată.

4. Ce s-ar putea întâmpla dacă TCP ar folosi un two-way handshake în loc de three way?

Răspunsul simplu, "s-ar întoarce internetul cu fundul în sus".
Întrebarea aceasta este foarte potrivită pentru studenţii care încearcă să înţeleagă problemele de proiectare care au dus la actuala implementare a conexiunii TCP. În primul rând, este evident că ar putea apărea o mulţime de cazuri de deadlock. De exemplu: să zicem că host A ar primi un pachet de la B şi îl confirmă. Confirmarea este pierdută, iar B nu ştie ce s-a întâmplat. Acelaşi lucru i se întâmplă lui B, şi stau amândouă host-uri deschse, dar aşteptând altceva.

Acum, din punct de vedere al securităţii, gândiţi-vă cât de uşor s-ar face TCP/IP spoofing.


5. Aţi auzi de silly window syndrome (eu unul nu auzisem)

Presupun că aţi dat deja un search. În puţine cuvinte, silly window syndrome are loc atunci când datele sunt transmise în blocuri mari, dar aplicaţia care le primeşte le citeşte octet cu octet.

6. (Din cursul dl-ui Buraga, titularul cursului de Reţele) Dacă avem o reţea p2p bazată pe o arhitectură parţial centralizată (ex. Bittorrent), iar două noduri din această reţea folosesc NAT şi vor să comunice. Cum se poate stabili comunicarea?

O problemă clasică, şi rezolvarea ei stă la baza unor reţele p2p. Metodele de rezolvare sunt mai multe, însă importantă este nevoia de alt host care să aibă IP rutabil care "să le facă cunoştiinţă" celor doi clienţi. Tehnici ar fi UDP hole punching sau STUN (Simple Traversal of UDP Through NATs). Am găsit şi un articol care tratează problema chiar în contextul reţelelor p2p: NAT Traversal Techniques and Peer-to-Peer Applications.


V-au plăcut? Mai am, dacă mai vreţi Smile 

P.S. Am luat examenul.

Technorati tags:

Posted by Iacob Andrei | 2 Comments
Filed under:

last.fm a fost cumpărat

Aţi observat deja (mă refer la cititorii care se întorc) imaginea aia mică şi roşie din stânga pe care scrie last.fm şi care duce la "profilul meu muzical". Nu obişnuiesc să pun ştiri în blog, însă de această dată nu mă pot abţine. Compania respectivă tocmai a fost cumpărată de CBS cu suma de $280.000.000 (adica 140.000.000 de lire, având în vedere că last.fm este în Londra).

sursa: http://business.guardian.co.uk/story/0,,2091412,00.html

O sumă frumoasă, dar nu se compară cu restul tranzacţiilor populare, gen youtube sau skype.
Însă trebuie gândit şi la faptul că băieţii au pornit la drum în perioada în care lumea nu prea voia să bage bani în muzica online datorită faptului că Napster era purtat prin tribunale şi mai ales datorită faptului că "They struggled to raise funding in the early days and unable to pay the rent on their own flats, the team lived in tents on the roof of their office. Last.fm took donations from sympathetic observers and friends to stay afloat while it looked around for bigger investors."

Până la urmă vor trăi fericiţi până la adânci bătrâneţi. Sper totuşi ca CBS să nu-şi bată joc de munca lor şi să nu dezamăgească utilizatorii fericiţi (ca mine, de altfel).

Vă recomand la acest serviciu "Recommendations Radio" si "Friends Radio", două metode prin care am făcut cunoştiinţă cu formaţii noi, despre care nu ştiam că imi plac (sună cunoscut?)

Technorati tags:

Posted by Iacob Andrei | 4 Comments
Filed under:

Andrei's 0-day brands

Se pare că am fost tag-uit. Sunt foarte emoţionat. Nu mi s-a mai întâmplat niciodata. Here you go:

 

(trist, ştiu) 

Stai un moment. Chestiile astea-s pe bune? Chiar trebuie să fiu serios? Eu credeam că glumiţi. Spuneţi-mi că e o glumă, pentru că eu am glumit. Mie mi se pare a fi un fel de Maggi la geam in varianta blog Stick out tongue. Dar poate aşa sunt eu mai no-fun.

Şi la mine se va opri tagging-ul. Nu dau mai departe mesaje spam Stick out tongue

Technorati tags:

Posted by Iacob Andrei | 8 Comments
Filed under:

Small updates

Aţi auzit de Moonlight? Va fi Silverlight pe mono.

Proiectul este detaliat aici. Deja s-a depus un pic de efort pentru înţelegerea tehnologiei Microsoft şi pentru o mică planificare. Discuţii despre development aici. Foarte tentant..

Electric Rain, compania care dezvoltă ZAM3D, o unealtă de modelare 3D pentru WPF, şi care va dezvolta StandOut, a anunţat alt produs, Harmony, care va ieşi cam la vară de pe linia de producţie, şi care va face conversia din SWF în XAML pentru SIlverlight. Ştirea o am de aici. Şi autorul zice ceva de genul:

"They do mention that some of the actionscript animations from Flash might not convert well but it's interesting all the same."

Gee, I Wonder Why...

Nu este neapărat un lucru nou, Mike Swanson a făcut deja un convertor între SWF şi XAML, însă nu pentru subsetul WPF din Silverlight.

Intraţi un pic pe microsoft.com şi uitaţi-vă la reclama la xbox din stânga. E făcută în Silverlight. Smile

Eu tot aştept mai multe detalii despre Silverlight pe Windows Mobile dar văd că acestea se lasă aşteptate mai mult.

Posted by Iacob Andrei | 0 Comments

WPF vs. Flash animations

Astăzi, la prezentarea mea de la Summer Web a avut loc o mică neînţelegere între speaker şi cineva din public pe baza animaţiilor din Flash şi WPF. Eu am susţinut că animaţiile în Flash sunt bazate pe frame-uri, pe când în WPF sunt bazate pe timp.

Nu am fost destul de convingător pe loc, aşa că pentru a clarifica situaţia, cu documentaţia şi cu soft-ul în faţă, vreau înca o dată să-mi susţin afirmaţia (pentru că am fost şi mustrat că nu am fost pregătit pentru prezentare dacă zic astfel de lucruri despre tehnologii pe care nu le cunosc)

Voi fi foarte rapid şi mai mult voi cita din documentaţii

Animaţiile în WPF

"This overview provides an introduction to the WPF animation and timing system. It focuses on the animation of WPF objects by using storyboards."

WPF Animation Overview

"Timeline Class 
Defines a segment of time."

Timeline class

Numerele de pe timeline sunt secunde.

Animaţiile în Flash

"You have several options when creating tweened animations. You can create traditional frame-by-frame animations (see the section, Creating Frame-by-Frame Animations), motion tweens (see Creating Motion Tweens), or shape tweens (see Creating Shape Tweens)."

Flash animation learning guide - Adobe.com

"If you apply a motion tween and then change the number of frames between the two keyframes, or move the group or symbol in either keyframe, Flash automatically tweens the frames again."

http://www.adobe.com/devnet/flash/articles/animation_guide_05.html

Şi cred eu cel mai concludent:

"The frame rate, the speed at which an animation is played, is measured in number of frames per second. A frame rate that's too slow causes the animation to appear jerky; a frame rate that's too fast might negatively affect the animation or use too much of the user's computer processing power. The complexity of the animation and the speed of the computer on which the animation is being played affect the smoothness of the playback. Test your animations on a variety of machines to determine optimum frame rates.

You need to think about frame rate when working with animations because it can affect the performance of your SWF file and the computer that plays it. Setting a frame rate too high can lead to processor problems, especially when you use many assets or use ActionScript to create your animation. However, you also need to consider the frame rate setting because it affects how smoothly your animation plays. "

About Frame Rate and animation

 

Şi imaginea, sper la fel de concludentă. Numerele din timeline sunt numere de frame-uri.

De asemenea,

"Pentru a anima bila trebuie mai intai sa facem o setare generala: numarul de frameuri care trec intr-o secunda."

"Mergeti pe "Timeline" la frame-ul 60 si apasati click dreapta si alegeti optiunea "Insert keyframe". Aici vom defini pozitia finala a bilei."

http://thor.info.uaic.ro/~flash/wiki/index.php?title=Tutoriale:MiscareaBila

Se pot face adaptări. Între timp şi frame. Şi eu am avut 500 şi ceva de imagini care trebuiau să fie o animaţie în WPF. Ce am făcut? O animaţie custom care împărţea secunda în 24 şi schimba imaginea. Deci am ajuns la frame-uri. Dar nativ este time-based.

Da, se poate baza pe timp şi în Flash, dacă definim un număr de frame-uri pe secundă, însă cel puţin mie, mi se pare frame based şi toţi developer-ii flash pe care îi cunosc mi-au confirmat asta, inclusiv însemnările lui Lee Brimelow:

"Most code-controlled animation in Flash is accomplished using the onEnterFrame event which is fired every time the Flash player hits a new frame. But in WPF animation there is no concept of frames. It animates using timers and is similar to the way that After Effects does animation. So how can we replicate the onEnterFrame event in WPF? Well luckily there is the Rendering event which gets fired whenever the screen is re-rendered."

Şi "cireaşa de pe tort",

"Workshop Chapter 12. Developing Time-Based Animations

Flash is a frame-based animation tool. As you know, just because you set the frame rate to 120 frames per second, that doesn't mean Flash will really display that many frames in one second. The frame rate you specify is more of a top end that Flash will not exceed. Even if you keep your frame rate down in the normal range of 20 fps, there's a good chance that Flash will occasionally take longer than one-twentieth of a second to display a frame. The standard practice is to just make sure that your movie performs adequately on a slow machine, although there's still no guarantee." 

Luat de aici: http://safari.oreilly.com/0735712956/ch28

Acum, sper că nu este nici o curiozitate pentru nimeni de ce am facut asocierea WPF-Time Flash-Frame. 

Presupun că audienţa nu a înţeles mesajul pe care am vrut să-l transmit. Eu nu vând nimic. Eu nu încerc să fac lumea să adopte o tehnologie, etc. Nu mă interesează. La fel cum m-a întrebat un coleg ce să folosească. SVG sau XAML? I-am răspuns să folosească ce vrea. Nu am vrut decât să prezint o tehnologie pe care eu o consider interesantă cu care am încercat să lucrez cu ea de mult, chiar înainte de a fi lansată. Nu am prezentat-o ca o tehnologie Flash-Killer cum mai apare pe net, dar văd că în momentul în care am făcut comparaţia între modelele de animaţie, mesajul a ajuns distorsionat şi nu asta a fost intenţia mea şi nu cred că pentru aceasta merit să fiu apostrofat că nu m-am documentat înainte să vin să prezint.

 

 

Technorati tags: , ,

Posted by Iacob Andrei | 16 Comments
Filed under: , ,

Silverlight Architecture Overview

Încă sunt uimit de numărul de blog post-uri de la Microsoft care menţionează de Silverlight. Aseară am văzut un lucru foarte bun. Silverlight va fi suportat în curând şi de Opera (care este pe departe browser-ul meu preferat). Am citit aici anunţul şi apoi am şi văzut O-ul de la Opera pe deja celebra hartă de development pe Silverlight cu o notă mică pe care scrie "soon".

Lucian mi-a luat-o înainte prin anunţarea promisiunii lui Miguel de Icaza despre Silverlight-ului pe Mono (şi nici nu a ezitat să mă anunţe pe IM).Ce trebuie înţeles de aici? Că Lucian ştia dinaintea mea?Big Smile Nu. Trebuie înţeles că Miguel de Icaza a rămas impresionat de Silverlight după prezentările de la MIX.

Vreau astăzi să scriu câte ceva despre detaliile tehnologiei Silverlight, pentru că în primul meu post despre WPF/E am promis că voi face asta mai târziu.

Ok, să vorbim despre partea de arhitectură.

Primul lucru este această hartă. Aici este concentrat tot ceea ce am eu de gând să scriu.

În linii mari, Silverlight este formată din două mari părţi (+ installer-ul şi componenta de update, care apropos face update automat):

  1. Core Presentation Framework. Aceasta este aşa numitul stripped WPF, deci conţine componente şi servicii orientate UI şi interacţiune. Adică: input, controale lightweight pentru web, componente media, digital rights management ( Wink ), text, animaţii, etc.. Şi un DOM API pentru XAML (ţineţi minte când încărcam dinamic un obiect XAML?).
  2. Un subset al .NET Framework-ului, care conţine librării şi componente de bază, dynamic language compilation şi un CLR (şi un DLR).
  3. Installer-ul şi componenta de update.

O diagramă mai sugestivă:

 

Ce este cu galben aparţine Silverlight 1.1 (celebru pentru DLR).

Principiul pe care fucţionează este acelaşi (pe care l-am menţionat de la bun început). XAML-ul reprezintă legătura dintre partea de prezentare şi .NET Framework. XAML-ul poate fi manipulat folosind acest DOM API din JavaScript sau din orice limbaj (adică C#, Managed JScript, IronPython, Ruby) în versiunea 1.1.

Despre ce nu am zis aproape nimic este de .NET Framework în Silverlight.

  1. Partea de date. Avem integrat LINQ si XLinq pentru acces la date, plus este şi suport de serializare şi XML (normal)
  2. Base Class Library. Un set de clase de bază în .NET Framework, incluzând manipulare de string-uri, expresii regulate, reflection, colecţii, etc...
  3. Networking. Suport pentru servicii web, un obiect de tip Browser, acces la RSS, un obiect HTTP request şi response
  4. Common Language Runtime. The usual... garbage collection, management de memorie, excepţii şi type safety
  5. Dynamic Language Runtime. This is big. Avem suport pentru compilarea dinamică şi execuţie a scripturilor scrise în limbaje gen Phyton şi, cel mai tare, suport gen plug-in pentru extinderea Framework-ului în a suporta şi alte limbaje.

Alte facilităţi interesante ar fi Isolated Storage, safe file management pentru upload de fişiere. Un lucru foarte util şi care chiar l-am folosit este HTML interaction, care permite acces la HTML DOM-ul paginii curente. Merge şi invers, când un script poate accesa obiecte publice and stuff din aplicaţia noastră (Greasemonkey anyone?).

Alte lucruri ar mai fi JavaScript Object Notation care permite apelarea serviciilor web ASP.NET din JavaScript şi POX, care permite apelarea serviciilor web simple XML.

Cei interesaţi de DLR, pot asculta acest podcast de pe Channel9. Are jumătate de oră, şi este un "interviu" la telefon cu John Lam, care a lucrat mult în Ruby înainte să lucreze la Microsoft (şi aicolo tot în Ruby lucrează Big Smile).

Cam atât.

Referinţele sunt whitepaper-urile de pe silverlight.net

În loc de încheiere, cu dedicaţie pentru cei care au fost la prezentările mele de la Academic Tour şi se mirau de ce puneam atât de mult accent pe Media Integration Layer şi tot menţionam de Don Box la WCF, fiţi atenţi ce zice Don Box:

"In Indigo (WCF), the rocket science is in IChannel and Message.

 In Avalon (WPF), the rocket science is in the Media Integration Layer (MIL)."

Big Smile 

Later Edit:

Am trecut de 10.000 de vizitatori (unici?). YEY!! Yes 

Technorati tags: ,

Posted by Iacob Andrei | 2 Comments
Filed under: ,

Silverlight on Windows Mobile

Tocmai am citit în blogul Mobile and Embedded Devices Group despre demo-ul lui Scott Holden de la MIX cu Windows Mobile care rula o aplicaţie Silverlight.

Video.

Foarte tare. Apoi am găsit nişte imagini pe Flickr referitoare la subiect.

 

După ce am lucrat un pic cu .NET Compact Framework 2.0 anul trecut, parcă nu mi-ar părea rău dacă m-aş juca un pic cu aşa ceva. Chestia asta o aşteptam de vara trecută. Atunci începeau discuţiile despre WPF/E şi despre cum ar merge şi pe mobile. Discuţiile erau întărite şi de:

"Empower people through great software at any time, at any place, on any device." (Bill Gates, 2000)

Posted by Iacob Andrei | 0 Comments

Light up the web

De când nu am mai scris în blog, multe s-au mai întâmplat. Academic Tour 3.0, o excursie de două zile în afara graniţelor, etc.. Şi după cum zicea şi Lucian, Academic Tour-ul a fost singurul lucru din ultima perioada care a reînviat în mine nişte sentimente de mult adormite.

 

Însă în exact în ziua prezentărilor din Galaţi, s-a întâmplat un lucru important pentru dezvoltatorii atraşi de WPF/E. Noul release de WPF/E (deja în versiune BETA) a fost botezat Microsoft Silverlight, sub sloganul "Light up the web". (de asemenea, a fost şi un poster, despre care acum nu prea se mai vorbeşte. Lee Brimelow a scos post-ul, dar poza a rămas). Toate blogurile (adică multitudinea de bloguri citite de mine) vuiesc de noul concurent al tehnologiei deţinute acuma de Adobe.

Lucrurile de bază referitoare la crearea aplicaţiilor Silverlight nu s-au schimbat major de la ultimul meu post despre acest subiect. Însă valul de capabilităţi adăugate şi de servicii oferite de Microsoft este absolut copleşitor.

Am să vorbesc astăzi desper Silverlight Streaming. Pentru cititorii mei care au fost şi la prezentările de la Academic Tour, mai ţineţi minte ce zicea Todi şi (la unele prezentări) cu mine despre serviciile care acompaniază şi completează un soft? Exact despre asta este vorba.

Windows Live oferă acum un serviciu de hosting al aplicaţiilor multimedia bogate într-un mod cross-platform (Windows - Mac, nu vă impacientaţi, eventual lasaţi un mail lui Miguel de Icaza ), bazat pe streaming.De asemenea, oferă şi un mod elegant de management al acestor aplicaţii, atât printr-un admin panel în mod web, cât şi printr-un API destul de uşor de digerat. Pe deasupra, se mai aruncă în joc şi 4 giga spaţiu gratuit pentru acest lucru (da, PATRU GIGA, plus streaming de până la 700 Kbps).

Haideţi să vedem despre ce e vorba într-un mod hands-on.

În primul rând, pentru a beneficia de acest serviciu, trebuie să aveţi un Live ID. Sper că nu este asta o problemă. După nişte formalităţi, avem un cont de Silverlight Streaming. Ce înseamnă asta? Înseamnă un account ID, şi un account key. Care-i faza? Account ID este public, account key este private (şi poate fi regenerat oricând). Sună cunoscut? Avem nevoie de aceste două valori în invocarea aplicaţiilor noastre folosind API-ul pus la dispoziţie. 

Voi încerca să fac o mică aplicaţie care rulează un film, o voi pune pe Silverlight Streaming şi voi încerca să explic pas cu pas despre ce este vorba.

1. Naşterea unei aplicaţii Silverlight

O voi lua de la capăt cu un tutorial despre cum se face o aplicaţie Silverlight.
Prima dată scriem un fişier html. Gol. Adică să aibă head şi body.
Acum vom adăuga referinţe la Silverlight.js şi createSilverlight.js. Primul fişier poate fi găsit aici, şi este la fel la toate proiectele. De menţionat este că dacă aruncaţi o privire în codul javascript, veţi vedea că acesta se ocupă cu partea de cross-platform. Al doilea fişier poate fi creat şi apoi lăsat gol. Vom reveni mai târziu asupra lui. Adăugarea acestor două referinţe face ca fişierul HTML să arate cam aşa:

<html>
<
head>
    <
title>Salut LuminaArgintie</title>
           <
script type="text/javascript" src="Silverlight.js"></script>
           <
script type="text/javascript" src="createSilverlight.js"></script>
</
head>
<
body>

</body>
</
html>


Apoi, în body, se introduc referinţele la controrul Silverlight în sine:

<div id="mySilverlightControlHost">
</
div>

şi

<script type="text/javascript">
  var parentElement = document.getElementById("mySilverlightControlHost");
  createMySilverlightControl();
</script>

Acum, revenim la fişierul createSilverlight.js şi scriem în el funcţia următoare:

function createMySilverlightControl()
{
  Sys.Silverlight.createObject(
 
"myxaml.xaml", // Source property value.
 
parentElement, // DOM reference to hosting DIV tag.
 
"mySilverlightControl", // Unique control ID value.
 
{ // Control properties.
   
width:'300', // Width of rectangular region of
   
// control in pixels.
   
height:'300', // Height of rectangular region of
   
// control in pixels.
   
inplaceInstallPrompt:false, // Determines whether to display
   
// in-place install prompt if
   
// invalid version detected.
   
background:'#D6D6D6', // Background color of control.
   
isWindowless:'false', // Determines whether to display control
   
// in Windowless mode.
   
framerate:'24', // MaxFrameRate property value.
   
version:'0.9' // Control version to use.
 
},
  {
    onError:
null, // OnError property value --
   
// event handler function name.
   
onLoad:null // OnLoad property value --
   
// event handler function name.
 
},
 
null); // Context value -- event handler function name.
}

Cred că este destul de bine comentat şi nu are rost să detaliez.

Scriem (în Blend, normal) un fişiser XAML care să conţină un canvas cu un control media şi 3 butoane pentru controlul playblack-ului. Fişierul se poate găsi aici. Apoi, se scriu funcţiile care fac handling pe evenimentele definite în acest xaml (tot în fişierul createSilverlight.js):

function media_stop(sender, args) {
   sender.findName(
"media").stop();
}

function media_pause(sender, args) {
   sender.findName(
"media").pause();
}

function media_begin(sender, args) {
   sender.findName(
"media").play();
}

Eu am pus acolo un filmuleţ cu un hamster. De fapt e hamsterul prietenei mele. Îl cheamă "hamster" dar răspunde la orice.

2. Împachetarea

Trebuie rearanjate fişierele în directoare, ca şi cum ar fi pe un webserver. Adică:

SampleProject.xaml
clips\hamster.wmv
js\SampleProject.js
js\Silverlight.js

Bineînţeles, cu modificările de câi corespunzătoare în fişierele anterior create.

Acum, scriem un manifest. Acesta arată ceva de genul:

<SilverlightApp>
<
source>SampleProject.xaml</source>
<
width>400</width>
<
height>300</height>
<
jsOrder>
<
js>js\Silverlight.js</js>
<
js>js\SampleProject.js</js>
</
jsOrder>
 <onLoad>
  createMySilverlightControl
 </onLoad>

</
SilverlightApp>

Partea cu jsOrder nu prea contează decât în cazul în care avem vreo dependenţă între fişiere.
Chestia importantă este că renunţăm la fişierul html care hosta aplicaţia, şi mutăm funcţia de creare a obiectului Silverlight în manifest în tag-ul onLoad.

Acum împachetăm totul (înafară de fişierul html) într-o arhivă .zip şi facem un upload aici.

Şi nu mai rămâne decât să...

şi să ne uităm la hamsterul meu/prietenei mele cum aleargă pe pat. În mod streaming. Proiectul (.zip-ul) se află aici. Încercaţi şi voi (4 GIGA!!!!).
 

Şi acuma ca un feedback extrem de negativ celor din echipa Internet Explorer, take a look at this:

În Firefox merge, în IE nu. Pentru că IE are o problemă mai veche referitoare la oleaca de js. Ca să vezi treabă.

 

 

Mda..

3. References

Bineînţeles, serviciul poate fi apelat şi programatic, documentaţie aici.
Detaliile serviciilor puse la dispoziţie aici, plus condiţii, licenţiere, drepturi, etc....
Pentru cei care nu au înţeles nimic de aici, şi vor să ştie de ce Silverlight, read this.
FAQ.
Avem şi o comunitate (ce repede se mişcă unii oameni).
Şi pentru ca lucrurile să se mişte cu o viteză ameţitoare, citesc acum că la MIX s-a discutat despre Silverlight Alpha 1.1 (Jesus) care suportă un fel de Dynamic Language Runtime ce permite utilizarea unor limbaje gen Phyton, Java şi Ruby. Slow down, guys. Acestă versiune de Silverlight este exact ce ziceam eu mai demult despre subsetul .NET Framework... etc.. managed.. packaging.. ştiţi voi. Documentaţie aici.
Şi cireaşa de pe tort este o versiune de Blend pentru Silverlight: Blend 2, care arată este exact ceea ce menţionam eu că trebuie într-un post anterior când editam un xaml în Blend şi apoi trebuia să sap prin el să elimin elementele care nu erau suportate de WPF/E pe vremea aia. Acum avem un IDE pentru Silverlight.

Şi în sfârşit, ca să ne mai descreţim frunţile, să vedem cum a ajuns Microsoft la aşa un nume (Silverlight):

10. GrayLuminosity (close, but there was just something not quite right about it)
9. AJAX - Asynchronous JavaScript And XAML (turns out that acronym was already taken)
8. David (Bill Gates vetoed that one himself)
7. non-Windows Presentation Foundation
6. Windows Technology Foundation (usually shortened to WTF, of course)
5. MicroMedia Player (a lightweight web alternative to Media Player)
4. Microsoft Light New User Experience (shortened to LINUX)
3. Microsoft 2.0 (big 800lb gorilla? Us? No, we’re your friendly neighborhood Web 2.0 startup)
2. Redlight (“Roxanne… …you don’t have to wear that dress tonight…”)
1. Microsoft Windows Presentation Foundation Live Rich Client ActiveX Player R2 Ultimate Edition Service Pack 1 CTP (or WPFLRCAPR2UESP1CTP for short)

Prea tare. De aici le-am luat.

 

Pe final, aş vrea să vă invit la Summer <Web /> 2.007, pe 12-13 mai, unde voi ţine o prezentare despre Silverlight.

Technorati tags: , ,

Posted by Iacob Andrei | 2 Comments
Filed under: , ,

WPF/E february CTP released

După o pauză de o lună, echipa WPF/E a făcut public noul release, February CTP. Am vrut azi dimineaţă să ma apuc de gadgetul ăla de care ziceam ieri, şi am dat peste:



După o raită prin blogurile corespunzătoare, am revenit şi cu detalii. Runtime-ul poate fi scos de aici. Dacă aveţi deja ceva făcut în december CTP, este (incă) o compatibilitate cu noua versiune, trebuie doar schimbat fişierul agHost.js, care îl puteţi lua de aici (după cum puteţi vedea din adresă, sample-urile de pe channel9 sunt deja updatate).

Din blogul lui Joe Stegman (lead program manager WPF/E) putem vedea ce aduce noul CTP:
  • Keyboard Input (KeyUp/KeyDown)
  • MP3 Support (yey!)
  • Mouse cursor support (ziceam eu mai demult...)
  • Async downloader
  • Simple text metrics
  • Full screen mode
  • Lots of performance work
  • Improved JavaScript APIs

Am să revin după ce termin gadgetul.


Technorati tags: ,

Posted by Iacob Andrei | 1 Comments
Filed under: ,

Code Project competition(s)

Tocmai am văzut o iniţiativă destul de tentantă din partea site-ului The Code Project.
Un concurs de articole pentru Windows Vista.









The Code Project Vista API Competition

Aici, se cere un articol care arată o aplicaţie specifică Windows Vista, nu doar .NET Framework 3.0, ci toate tehnologiile şi API-urile puse la dispoziţie în acest context (de exemplu TxF şi TxR). Premiile sunt în valoare de 1000$ şi se acordă lunar autorului celui mai bun articol. Deci dacă aveţi chemare pentru technical writing, go ahead. Concursul se desfăşoară până pe data de 31 mai. Regulamentul concursului este foarte de bun simţ, mai ales pentru o astfel de comunitate ("No cheating, lying, stealing code, or biting." Big Smile ).









De asemenea, cum gadgeturile din Vista sunt un domeniu prea vast pentru primul concurs, s-a făcut şi The Code Project Vista Gadgets Competition, care se desfăşoară lunar până pe 31 martie. 
Aici am de gând să particip cu un gadget la care m-am gândit de mai multă vreme, insă am ajuns la un
impas peste care am trecut folosind 3 cuvinte (COM). Nu vedeam pădurea din cauza copacilor. 
Pentru cei care au mai lucrat, sau au încercat să dezvolte un gadget, tot ce avem la dispoziţie este un API (cam sărac) şi JavaScript. Multă baftă. Ar fi interesant dacă am avea nişte câştigători din România. De la WPFGroup anyone? Big Smile Ofer suport tehnic şi moral pentru un gadget făcut în WPF/E sau chiar un XBAP.

Technorati tags:

Posted by Iacob Andrei | 1 Comments
Filed under:

Some new stuff

După ce ieri a fost lansat Vista şi Office 2007 spre vânzare, au apărut şi căteva
download-uri şi alte chestii interesante.

  • De asemenea, cei interesaţi ASP.NET AJAX (former ATLAS) se pot uita şi prin sursele lui, aici.
  • Electric Rain, cei care au facut ZAM3D (şi Swift3D) vor lansa un produs nou numit StandOut. Un fel de Power Point făcut cu WPF, adica un fel de Grava, adică un fel de idee de-a mea de la Imagine Cup. Asta este.. back to the old drawing board.

Technorati tags:

Posted by Iacob Andrei | 0 Comments
Filed under:

Yahoo! Messenger pentru Vista

Am citit de curând că la CES; Yahoo! şi Microsoft au anunţat noul Yahoo! Messenger pentru Vista.



Acesta arată cam aşa, e făcut în WPF (Yey!) şi sper să mă convingă să nu renunţ la Yahoo! cum nu face clientul actual. Acesta este scris de la 0 şi partea de design e făcută de Frog Design (Lee Brimelow). Dacă este rescris e bine, pentru că Yahoo! Messenger 8.1 (şi cam toate versiunile de fapt) sunt printre cele mai prost realizate şi mai ineficiente aplicaţii. Sper că nu va avea reclame şi sper că i-au fost scoase toate feature-urile alea care nu le folosea nimeni şi să fie doar o aplicaţie de IM.

Avem şi un blog aici:http://blog.messenger.yahoo.com/blog/2007/01/08/introducing-yahoo-messenger-for-windows-vista/

Aştept să apară. Dacă mă dezamăgeşte, eu trec pe msn.

Technorati tags:

Posted by Iacob Andrei | 26 Comments
Filed under:

Hello 2007

 La mulţi ani tuturor. Mai ales colegilor care au acces la internet şi chiar stau pe internet în zilele acestea.

Suntem pe 1 ianuarie. Haideţi să ne uităm înapoi în timp să vedem ce s-a întamplat pe această dată:

  • 404 : The day when the sky went black; the first 404 error in history takes place
  • 666 : The end of the world doesn't occur. Many people are like "WTF!??!"
  • 1999 : The Universe is destroyed, and in nanoseconds later replaced by something infinitely more confusing
  • 9999 : Countdown starts to Year 10000 bug (Y10k). IT consultants cloned in large vasts to prepare for outcoming IT catastrophe
  • 0000 : IT consultants fail to fix Year 10000 bug
  • sursa : http://uncyclopedia.org/wiki/Main_Page (Atenţie.. este nevoie de un anumit tip de simţ al umorului pentru acest site)

Lăsând gluma la o parte, am fost plăcut surprins să vad pe http://en.wikipedia.org/wiki/Main_Page la ştiri, faptul că România şi Bulgaria au aderat la UE. Mă rog.. nu prea mă interesează chestia asta, însă de obicei mă simt bine când văd numele tării noastre scris undeva (înafară de tabloidurile britanice Embarrassed).


Am trecut în 2007 alături de prietena mea şi cu mintea împăcată de faptul că a fost un an bun cam din toate punctele de vedere. A avut loc prima mea ieşire din ţară (şi mai ales spre o ţară destul de exotică) pentru finala mondială de la Imagine Cup (aici totuşi ar mai fi fost loc de mai bine), alăturarea mea la MAP, care pot spune cp mi-a schimbat mult modul de gândire, "titlul" de "vice-studentul anului IT" Big Smile (după colegul meu, Bogdan Hobeanu din Bucureşti) şi multe alte chestii. Cu toate acestea, ca de altfel întotdeauna, este loc de mai bine. Am hotărât ca anul acesta (cum se hotărăşte de obicei de fiecare dată, dar rareori se ţine seama) să fac nişte îmbunătăţiri referitoare la mine. Ca de exemplu să citesc mai mult, să mă mişc mai mult Big Smile, să nu mai pierd timpul frecventând comunităţi online fără viitor, şi multe alte chestii despre care nu aş vrea să scriu aici (de ce? de aia Big Smile).

Am în schimb nişte proiecte destul de măreţe de care aş dori să ma ocup anul acesta. Unul dintre ele ar fi continuarea laboratorului de WPF până la sfârşitul anului şcolar (asta dacă vor studenţii), altul ar fi site-ul personal caruia aş vrea să-i dau drumul cam până îmbătrânesc cu un an (don't worry, eu am gândit site-ul meu ca fiind o sursă de "utilităţi" în format .cs .xaml .cpp şi multe articole), aş mai adăuga bineînţeles participarea la Imagine Cup (cu lucruri noi învăţate, cu altă viziune asupra lumii, cu experienţa din anul trecut şi, normal, cu un proiect nou, complicat, mare, etc.).

De asemenea, o privire asupra acestei pagini:
http://en.wikipedia.org/wiki/List_of_user_interface_markup_languages#Microsoft îmi dă nişte idei de nişte convertoare pe care aş vrea să le termin până la jumătatea anului (unul dintre ele ar fi indicat să-l termin până începe şcoala, ca să mai câştig nişte puncte la laboratorul de Java). Ar fi interesant dacă ar mai fi studenţi, mai ales dintre cei care au mai venit pe la laborator sâmbăta de la 14 care ar fi interesaţi de aşa ceva.

Oh, well.. şi cam atât. Plănuiam să fac ceva 3D spectaculos (adică un Rubik's cube) cu care să încep anul şi să-l public aici, însă am realizat că totuşi sunt un om normal. Aşa că-l voi publica într-una din zilele următoare Big Smile.

Până atunci, sper ca până mâine să pun cap la cap un mic articol despre noua metodă de a folosi controale normale în mediul 3D în WPF. De ce fac toate acestea acum? Pentru că am nişte "fantome şcolare" care mă bântuie de anul trecut şi trebuie să-mi fac timp pentru "exorcizare". Şi acestea ar fi tema la... şii tema la ... şi proiectul la .... etc.

La mulţi ani încă o dată cititorilor mei şi vă doresc un an mai bun ca precedentul.

Technorati tags:

Posted by Iacob Andrei | 1 Comments
Filed under:

Windows Multipoint

V-aţi gândit vreodată cum ar fi dacă aţi avea mai mult de un mouse conectat la calculator? Oare se poate? Da, normal, dar cum ar fi dacă fiecare mouse ar avea cursorul său specific?

De curând, Microsoft a făcut public unul dintre cele mai recente proiecte de cercetare de la Microsoft Research, şi anume, Multipoint.

Multipoint este o tehnologie ce are ca scop în primul rând educaţia. Ideea este în felul următor: folosind această tehnologie, elevii pot învăţa teamwork, cum să colaboreze mai uşor şi nu în ultimul rând să folosească simultan resursele aceluiaşi calculator.

Filmul : http://channel9.msdn.com/showpost.aspx?postid=266221

Press relase-ul : http://www.microsoft.com/presspass/features/2006/dec06/12-14MultiPoint.mspx

Detaliile : http://imaginecup.com/multipoint/default.aspx

Acum, poate vă întrebaţi de ce apar detaliile pe site-ul Imagine Cup.
Vă mai dau un indiciu:

" Attention Imagine Cup competitors in the Software Design, Embedded Development, Web Development, and Interface Design invitationals! You are already coding new education software that will benefit students around the world. Now imagine the additional impact you can make on classrooms everywhere by enabling multiple mice with unique cursors so that everyone can play. Starting in January: Instantly turn heads and increase your project’s reach with Windows MultiPoint."

Microsoft dă ca premiu un internship la Microsoft Research Laboratories în Bangalore India  Big Smile echipei care participă la secţiunile Software Design, Embedded , Web şi Interface Design, care a făcut cea mai bună implementare a acestei tehnologii. Mai multe găsiţi aici. (pariez că unor oameni care participă la Software Design deja le-au venit câteva idei)

SDK-ul va fi disponibil pentru download începând cu ianuarie 2007.

Vă daţi seama? Asta da user experience... ( de fapt users experience) Geeked
 

 

Technorati tags:

Posted by Iacob Andrei | 1 Comments
Filed under:
More Posts Next page »