duminică, 11 ianuarie 2009

jQuery, interfete web la superlativ

De ce avem nevoie de o librarie JavaScript?
- browser-ele nu interpreteaza toate la fel "portia" HTML + CSS + Javascript pe care o "servesc"; un layer de abstractie care sa ascunda de noi acest crud adevar, ar fi numai bun
- primitivele JavaScript sunt suficient de rudimentare cat sa nu-ti permita sa faci mai nimic usor

jQuery e una din solutiile pentru aceste probleme:
- este mic (varianta "minima" are 15kb)
- este rapid (l-am folosit in productie, si se comporta extrem de bine)
- este compatibil cu CSS1-CSS3 si cross-browser

Pentru niste exemple "live", va recomand:
- un tutorial cu exemple, la http://docs.jquery.com/Tutorials:Live_Examples_of_jQuery
- documentatia jQuery: langa fiecare functie se regaseste si un exemplu de folosire al ei

Sa trecem acum la treburi mai tehnice. Iata cum arata un hello world in jQuery:
 $(document).ready(function(){
alert("Hello, world!");
});
In primul rand, nu va speriati de semnul dolar ($) - este un nume de functie permis in JavaScript. In al doilea rand, va invit sa observati faptul ca jQuery implementeaza concepte din programarea functionala, in exemplul nostru fiind transmisa ca parametru o functie anonima. Daca doriti un articol introductiv usurel despre programare functionala, va recomand cu caldura: Can your programming language do this?, de Joel Spolski.

jQuery se bazeaza pe cateva principii de programare sanatoase, care fac codul mult mai clar si mai scurt:
  • filtrare: principala functionalitate a functiei $() este de a filtra elementele din arborele DOM. Sintaxa este usor de invatat si este asemanatoare cu altele de care v-ati mai lovit
  • chaining: ati observat probabil constructia $(document).ready(): orice functie jQuery intoarce obiectul asupra careia a actionat functia, modificat; aceasta este o constructie standard in multe framework-uri, precum Hibernate
  • manipulation: chiar daca rezultatul filtrarii este format dintr-unul sau mai multe elemente, toate pot fi modificate in acelasi stil; operatii standard: adaugare/stergere clasa CSS, modificarea textului nodului, ascunderea elementelor; daca nu va ajung functionalitatile predefinite, nu-i nici o problema, puteti defini propria: $(criteriu filtrare).each(function(node) { /* cod aici */ });
  • suporta plugin-uri: permite definirea de plugin-uri, si gasiti de toate pentru toti, de la elemente grafice construite peste aceasta librarie (exista chiar jQuery UI). Printre cele mai folositoare, enumar: tree-uri si tabele
Sperand ca v-am convins sa-l incercati, va urez spor la programat!

vineri, 9 ianuarie 2009

Tag cloud pe blogger

Ce este un tag cloud? O metoda simpla si placuta de a vizualiza frecventa tag-urilor asociate cu post-urile dvs. Amintindu-mi de acest concept web2.0-ish, m-am hotarat sa-l implementez pe blog-ul nostru. Am cautat un widget folosind tool-ul de la blogger pentru editarea layout-ului paginii, dar nu am gasit nimic care sa:
  • arate frumos, "clean"
  • sa nu aiba reclame asociate
Dupa ce am cautat putin pe google, am dat peste aur: http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html. Gasiti acolo explicatii pas cu pas despre cum se face, iar rezultatul il puteti vedea chiar la noi pe site. Imi pare rau daca nu va plac culorile, dar eu nu prea am simt artistic :)

Spor la blog-arit!

joi, 8 ianuarie 2009

Profiling-ul aplicatiilor web in Java

"4% din cod ocupa 50% din timpul de rulare al unui program" - Donald Knuth

Deci se merita sa gasim cei 4% pentru ca optimizarea lor va avea efecte substantiale. Jamon este un tool care ne permite monitorizarea operatiilor dintr-o aplicatie web Java, si una din metodele de a se integra intr-o aplicatie web este sub forma unui filtru. Standardul J2EE specifica prezenta unor filtre intr-o aplicatie web, care permit interceptarea tuturor request-urilor si efectuarea unor actiuni la interceptare. Sunt necesare doar cateva linii de cod (in afara de plasarea jar-ului Jamon la locatia potrivita), si le puteti gasi la sfarsitul articolului. Frumusetea solutiei oferite de el este ca nu este nevoie sa schimbati codul aplicatiei deja scrise, are performante foarte bune (pot spune ca l-am vazut implementat in productie cu succes) si este de un real ajutor!

Ce stie sa monitorizeze? Timpul de rulare, exceptiile aruncate, si diverse statistici matematice legate de acestea, pentru:
  • request-uri HTTP
  • accesul la baza de date, printr-un driver JDBC de tip proxy, care are rolul de a intercepta apelurile catre baza de date, sa le dea mai departe catre driver-ul care trebuie sa le execute, si sa monitorizeze timpul de acces
  • apelurile catre metodele oricarei interfete Java: creaza un proxy dinamic la runtime, care monitorizeaza apelurile dvs. si le da mai departe; o metoda de a implementa acest lucru este folosind API-ul Dynamic Proxy, care are suport nativ in JVM-urile recente
Cum arata monitorizarea unui cod folosind Jamon? Foarte simplu!
Monitor mon = MonitorFactory.start(opName);
/* Code being timed */
mon.stop();

miercuri, 7 ianuarie 2009

Utility computing

Azi m-am dus sa platesc chiria la garsoniera, intretinerea, curentul, si factura pentru puterea de calcul inchiriata de la Amazon luna asta. Ceeeeeee?? Da, ati citit bine. Puterea de calcul se poate inchiria si ea cu ora, dupa nevoi. Amazon a lansat EC2, Elastic Compute Cloud, o infrastructura cu foarte multa putere de calcul din care puteti inchiria o bucatica (sau mai mult, dupa nevoi), contra unui tarif orar.

Daca vreti ca urmatoarea data cand un site serios publica un link catre site-ul dvs., server-ul web din sufragerie cu 512 MB RAM si un Apache antic si exploit-abil la maxim sa nu ia foc pentru ca a incercat sa serveasca 10 clienti simultan, aveti nevoie de conceptul de "elastic computing". Si Amazon, pentru ca nu-i sta gandul numai la vandut carti, va arata viitorul internetului si al interfetelor web. Care este mult mai mult decat HTML/CSS/Javascript..

Configurezi o masina virtuala, iti instalezi pe ea ce soft-uri vrei, o uploadezi la Amazon. Controlezi prin intermediul unui web-service pe cate "instante" sa ruleze, si ai controlul individual asupra instantelor (via un shell, unde ai acces root, sau prin web-service, din care pot fi chiar si resetate!). Instantele sunt de mai multe tipuri, cea mai ieftina fiind: Small Instance (Default) 1.7 GB of memory, 1 EC2 Compute Unit (1 virtual core with 1 EC2 Compute Unit), 160 GB of instance storage, 32-bit platform. Asta te costa $0.10/h pentru Linux si $0.125/h pentru Windows.

Vrei ca atunci cand ai oprit instanta datele tale sa ramana inregistrate pentru posteritate? Nimic mai simplu, exista Elastic Block Store care este un storage expus ca un block device catre instante, caruia i se poate face back-up si replicare automat. Practic, nu te intereseaza unde sunt stocate datele tale, dar sunt accesibile din toate instantele la modicul pret de $0.1 / GB / luna (da, nu ti le tin la nesfarsit decat daca platesti :D). Mai platesti si $0.1 pentru fiecare milion de request-uri I/O asupra "discului" respectiv.

Accesarea unei instante se traduce in trafic pe internet. Nimic mai simplu, esti taxat si pentru asta. $0.10/GB pentru trafic incoming si $0.17/GB pentru trafic outgoing. Ai nevoie si de adrese IP? Bani sa ai, ca Amazon ti le da si pe-alea... Iti mai cumperi si domeniu, introduci intrarea DNS care mapeaza host-ul catre IP-urile date de Amazon si ai un hosting de toata frumusetea.. platit cu ora! Si cu disponibilitate 99.95%.

Nu va speriati de numere. Daca faceti un calcul simplu, o sa vedeti ca iesiti mult mai ieftin daca cumparati aceste servicii de la ei, decat sa:
  • cumparati propriile server-e
  • aveti grija sa le ventilati (deja de la cateva calculatoare incolo trebuie o instalatie de aer conditionat mai serioasa)
  • platiti un om care sa le "monitorizeze" - sysadmin-ul (nu uitati ca la noi taxele reprezinta peste 50% din costurile salariale)
  • platiti omul suficient de bine a.i. sa fie dispus sa se trezeasca noaptea ca sa nu aveti downtime prea mare..
Sigur, puteti sa cumparati servicii de hosting obisnuite. Dar ele nu sunt facute pentru site-uri web care scaleaza. Si nu beneficiaza de suport tehnic 24/7 profesionist. E o solutie care s-a demonstrat ca functioneaza, nu trebuie sa faceti experimente. Nu e timp de asta.

..si e nemaipomenit pentru start-up-uri, pentru ca nu presupune o investitie initiala mare. Spor la facut website-uri scalabile si de succes!

sâmbătă, 3 ianuarie 2009

MD5 a cazut

La multi ani, 2009!

De revelion, cercetatorii in domeniul securitatii au demonstrat ca MD5, creat de faimosul Ronald Rivest, unul din co-autorii Cormen-ului, nu este sigur pentru a fi folosit in PKI (Public Key Infrastructure). Folosind un atac bazat pe o coliziune de hash MD5, au reusit sa creeze un CA fals care sa garanteze pentru un website rauvoitor. Combinat cu DNS cache poisoning, si cu o metoda recenta descoperita de Dan Kaminski de a face acest lucru, un rau-voitor va poate fura datele cartii de credit astfel:
  1. Isi creaza un CA fals, care va garanta autenticitatea unui website fals
  2. Isi alege "tinta", sa spunem www.bcr.ro
  3. Otraveste cache-ul unui server DNS la care apelati cu un IP fals pentru hostname-ul bcr.ro
  4. Gazduieste la acel IP un webserver care livreaza o pagina foarte asemanatoare cu victima, care expune un certificat public semnat de CA-ul fals
  5. Cand deschideti o conexiune sigura criptata HTTPS pentru a introduce datele card-ului dvs., raufacatorul le va prelua si va efectua tranzactii in locul dvs.
Gasiti mai multe detalii (tehnice) mai jos.

Ce e un certificat digital si la ce foloseste? Un certificat este un fisier care contine niste date de identificare publice, si o semnatura a unui Certification Authority (prescurtat de acum CA), care garanteaza veridicitatea datelor. Daca reusesti sa strecori datele dorite de tine si sa falsifici semnatura CA-ului, poti sa te dai drept cine vrei:) Un exemplu real-life ar fi cartea de identitate: contine numele tau si niste elemente de siguranta ale Politiei Romane ca sa garanteze ca e (aproape) imposibil sa fabrici tu unul.

Ce este o pereche (cheie privata, cheie publica)? Cele doua chei sunt 2 numere folosite in algoritmii de criptare asimetrici, astfel incat:
  • data fiind cheia publica, este foarte greu de reconstituit cheia privata (necesita un efort computational enorm - vezi de exemplu problema logaritmului discret)
  • un mesaj criptat cu cheia publica poate fi decriptat doar folosind cheia privata
O analogie putin fortata cu real-life ar fi ca unui infractor ii este greu sa fabrice uneltele necesare pentru realizarea elementelor de siguranta de pe o carte de identitate, chiar daca el detine o C.I.

Ce este un rezumat al unui mesaj? Ce este MD5?
Rezumatul unui mesaj este un numar, de lungime fixata, calculat folosind un algoritm determinist pe baza unui mesaj de lungime oricat de mare. In limbaj popular, este folosit termenul "hash". MD5 este o astfel de functie de hash.

Cum poate fi folosita o astfel de pereche pentru semnarea unui mesaj?
Daca cheile au fost generate cu un algoritm potrivit, atunci cheia privata poate fi folosita pentru a calcula un numar bazat pe un rezumat al mesajului, iar cheia publica pentru a valida faptul ca cel care a semnat mesajul detine intr-adevar cheia privata. Observam ca trebuie ca algoritmul de semnare trebuie sa aiba proprietatea ca este greu de "fabricat" o semnatura dat fiind un mesaj, sau greu de fabricat un mesaj plauzibil data fiind o semnatura.

Cum folosesc browser-ele un certificat? Pentru o conexiune sigura (HTTPS), browser-ul va examina certificatul pe care il publica un site pentru a stabili ca la IP-ul de la celalalt capat al conexiunii se afla "cine trebuie". Pentru ca user-ul este interesat sa transmita date "sensibile", el le va cripta folosind cheia publica expusa in certificat, si detinatorul cheii private (si numai el!) le va putea decripta. Singura problema ramasa este asocierea cheii publice cu website-ul (hostname-ul). Aici intervine certificatul publicat de site, el fiind semnat de un CA.

Si cine imi garanteaza ca acest CA e de incredere? Exista 2 tipuri de ca: root CA si celelalte. Root CA sunt mari si cunoscute, iar certificatele lor sunt incluse in browser-e. Pentru a determina ca un CA e de incredere, un browser urmeaza algoritmul:
  • daca certificatul CA-ului curent se afla in lista mea de root CA, inseamna ca e de incredere
  • daca certificatul CA-ului curent este semnat de un alt CA, atunci ce mai am de verificat este CA-ul care a semnat, si reiau algoritmul pentru el
Bun, si pana la urma, care e problema? Pai totul se bazeaza pe sistemul CA-urilor. Tu te bazezi pe ele ca sa verifici ca un site este cine pretinde ca este. Daca cineva gaseste o metoda sa creeze un CA malitios, acesta poate garanta pentru un website care nu are certificatul corect. Algoritmul de semnare al certificatului unui CA folosea pana nu demult MD5, care este vulnerabil la atacuri de tipul "coliziune": poate fi fabricat un mesaj asemanator cu cel initial astfel incat hash-urile MD5 sa coincida. Asadar, poate fi fabricat un certificat asemanator cu cel initial, cu acelasi hash MD5, si atunci cele doua vor avea aceeasi semnatura digitala, doar ca in cel falsificat am introdus ce informatii am dorit noi. Deci fara a sti cheia privata, am semnat un mesaj in care am pus continutul dorit de noi.