miercuri, noiembrie 30, 2005

Pentru pasionatii de lectura

Măi, ghiduşă cărticică,
Chiar de eşti aşa de mică,
Draga mea, cum reuşeşti
Să ne bucuri cu poveşti,
Poezii nenumărate
Cu versuri frumos rimate?
De poveşti ce să mai spun?
N-am văzut ceva mai bun!
Ce pe mine mă inspiră
Să desenez din natură.
Multe lucruri ne înveţi,
Cum să fim copii isteţi...

In ultimul timp am facut o multime de upload-uri de carti pentru diversi pasionati. Le dedic si o poezie. Mai multe poezii asemanatoare la carticica.ro

luni, noiembrie 28, 2005

Merge WebWork in to Struts

Incredibil. Cele doua framework-uri vor fuziona. Mai multe informatii aici. E vorba de un nou Struts -> Ti.

Patrick Lightbody, in "WebWork joining Struts," has announced that WebWork is going to merge into Struts, becoming the "Struts Action Framework 2.0." The main benefit for WebWork, he says, is the Struts community, while Ted Husted says that the intention for Struts Ti was to use WebWork as the core for the action framework.


miercuri, noiembrie 23, 2005

Acesta este un experiment
Un banner realizat in cateva minute. Sunt disponibile o multime de alte efecte pentru text si pentru background.





marți, noiembrie 22, 2005

ANUNT

Va informez pe aceasta cale ca am renuntat la serviciile ZappMobile.

Noua mea adresa de e-mail este colaru@gmail.com (vechea adresa colaru@zappmobile.ro va expira in curand). Ma puteti contacta de asemenea si pe o adresa mai veche colaru22@yahoo.com.

Noul meu numar de telefon este 0743163039 (reteaua Orange). Vechiul meu numar 0788235594 din reteaua Zapp nu va mai fi in curand disponibil.

luni, noiembrie 21, 2005

Third party versus in house

In primul rand sa lamurim notiunile:
third party - insemana un produs care este folosit de cineva dar el este realizat de catre altcineva
in house - insemna un produs realizat local si folosit pe plan local

Explicatii

Prin produs in acest caz vom intelege o librarie, un framework, o componenta, etc. Trebuie facuta o distinctie intre produse ca atare pe care le folosesti ca utilizator final, si produse pe care le folosesti drept cod pe care il integrezi in aplicatia ta (mai explicit, integrare la nivel de surse). Anterior ma refeream la a doua categorie. Spre exemplu e una sa folosesti OpenOfice si alta sa folosesti Struts. Struts este un framework (nu ii vom spune API prin faptul ca framework-ul are controlul fluxului aplicatiei si difera prina sta de un API - librarie) care este folosit de aplicatii la nivel de cod. OpenOfice e un produs care se adreseaza utilizatorilor finali.

Drept exemplu, o firma poate realiza in house un framework Web de tip MVC in loc sa foloseasca Struts care este un framework third party care are acelasi scop.

Drept alt exemplu clasic vor face referire la Spring. Spring este un framework de middleware. E un container usor bazat pe pattern-ul dependicy injection care permite J2EE without EJB. De asemena, serviciile sunt oferite componetelor gestionate de container prin AOP. Pentru a realiza J2EE without EJB, multe firme au dezvoltat propriile lor librarii care sa-i ajute in dezvoltare. In general librarii de servicii generice: pentru securitate, gestiunea tranzactiilor, etc.

Diferente
E mai greu sa intelegi ceva ce au facut altii. Este asa zisa curba a invatarii care in de la caz la caz poate fi extrem de abrupta. Ai destul timp sa intelegi ce au facut altii? Dar ceea ce au facut altii poate fi mai bun decat poti face tu. Ei au facut asta inainte ca tu sa te gandesti cum se face. Si poate s-au specializat chiar, in asta!?

Ce au facut altii poate sa se suprapuna doar peartial peste ceea ce vrei tu. Cea ce au facut altii se poate personaliza pe nevoile tale? sau e mai usor sa consstruiesti totul de la inceput, doar inspirandu-te din ce au facut altii?

Tu ar trebui sa te abati de la lucrul tau pentru a implementa asta. In general un produs este o generalizare a unor experiente. Spre exemplu tu dezvolti un framework de autentificare care e o incercare de a standardizare si fixare a problemelor de securitate intalnite. Cand implementezi prima oara securitatea tu nu ai avut astfel de experiente. A implementa acest aspect poate reprezenta un lucru in sine. Esti dispus sa pierzi acest timp?

Daca produsul este unul third party si open source in acelasi timp, in jurul lui se va aduna o comunitate de dezvoltatori, care vor contribui la cresterea lui. Produsul va avea o lista de discutii, o arhiva de email-uri, un forum, un inssue tracker, un site de prezentare, un wiki, etc. Deci si o documentatie bogata, bazata pe experientele celor care il folosesc.

Un exemplu fericit de firma (australiana) care a avut succes folosind doar produse open source third party este Attlasian care a dezvoltat si inca mai dezvolta doua produse JIRA si CONFLUENCE, folosite de gigantii IT gen IBM, etc. Jira este un bug tracker, poate cel mai complex realizat in Java. Confluence este un sistem de lucru distribuit bazat pe wiki pages. Aceste produse sunt realizate exclusiv cu librarii, componente, framework-uri open source. Atlassian ofera Jira si Confluence free pentru comunitatile open source. Un astfel de exemplu este OpenSymphony .

vineri, noiembrie 18, 2005

Checked exceptions versus unchecked exceptions

Intrebare? De ce au ales cei de la SUN sa creeze o clasa de exceptii necheck-abile in compilare si anume clasa RuntimeExceptions? De ce nu au lasat obligatoriu ceck-area sau aruncarea lor asa cum e cazul celorlalte categorii de exceptii? Excludem din discutie clasele din Error care tin de viata interna a masinii virtuale. Dar exceptii?

Acest lucru ar parea in contradictie cu unele aspecte extrem de riguroase din Java. Sa luam de exemplu urmatorul aspect: Java este un limbaj puternic tipizat. Ideea este cat se poate de buna, pentru ca detectarea cat mai multor erori direct din faza de compilare aduce numai beneficii. In runtime nu mai porti grija unor eventuale exceptii prin faptul ca acestea sunt blocate direct din faza de compilare. Cum pot fi lasate exceptiile din RuntimeExceptions sa opreasca anormal programul chiar in timp ce el ruleaza?

Deci de ce RuntimeExceptions? Singurul raspuns plauzibil la care am ajuns este urmatorul care sa nu fie tratate? Avantajul propagarii lor spre metodele superioare fara a trata in cod acest lucru. Faptul ca ele nu sunt tratate prin check nu insemana ca ele nu se produc. Dovada ca e asa este faptul ca opresc executia programului. Ce e interesant in autopropagarea lor este faptul ca intreaga categorie de exceptii de tip RuntimeExceptions poate fi prinsa undeva mai sus, intr-o metoda apelanta. Si se poate presupune ca sunt multe si au o tratare asemanatoare: un ecran de eroare in care sa li se afiseze codul.

Sa consideram spre exemplu o arhitectura clasica J2EE. Avem spre exemplu un Action Struts care apeleaza un Manager din stratul de servicii care apelaza la randul lui un DOA. Apelul este de forma: Action->Manager->DAO. In DAO se vor produce o multime de exceptii sa zicem de tip SQLExceptions. Ele nu sunt erori de business ci eroari de sistem, produse sa spunem din caderea serverul de baze de date. Prin transformarea lor in erori de tip RuntimeExceptions, ele vor parcurge fara a fi tratate drumul pana la Action unde pot fi preluate de mecanismul generic pe care Struts il pune la dispozitie in acest sens. Ramane ca la nivelul de servicii sa fie aruncate exceptii de business care sa fie prinse si tratate de Action-uri prin modificarea corespunzatoare a fluxului de control al aplicatiei.

Deci daca la nivelul DOA exceptiile SQL sunt transformate in RuntimeExceptions, acestea vor urca singure prin stratul de servicii si Action-uri si vor fi prinse de sistemul generic de sus. Se mai poate face o distinctie de forma: business exceptions & system exceptions. Intr-un fel exceptiile de business tin de logica aplicatiei si ele sunt in general exceptii personalizate, declarate de programator. Ele fac parte din semnatura metodei publicate si au aceeasi importanta ca si parametrii metodei. Cel care va folosi acea metoda va sti ca trebuie sa trateze exceptia pe care aceasta o arunca. Exceptiile de sistem sunt in general de tip RuntimeExceptions care circula singure prin sistem si au o tratare generica.

joi, noiembrie 17, 2005

Un val de gratuitati

In ultimul timp multi din cei mari au decis sa arunce pe piata produse de tip "Comunity Edition". probabil in scopul de a estimpa popularitatea in crestere pe care o au produsele Open Source. Printre marii jucatori:

SUN - isi scoate la rampa uneltele de dezvoltare pe care a facut atata "tam-tam" adica Java Studio Creator IDE si Java Studio Enterprise pe care le ai gratuit daca te inregistrezi pe SDN - Sun Developement Network. O prezentare interesanta pentru JCreator gasiti aici. In prezentare se demonstreaza productivitatea pe care o poti obtine folosind JSF, (JSF reprezinta un sistem de componente Web care gestioneaza singure partea de request-response - este unul din framework-urile bazate de componente si nu pe cerere-raspuns). Teoretic acceesi productivitate ca in cazul interfetelor bogate dar de data asta pentru Web. Demn de urmarit. In Eclipse nu stiu nimic asemanator. JCreator-ul este contruit peste NetBeans, IDE-ul la care Sun nu vrea sa renunte se pare asa cum au facut toti in favoarea Eclipse.

ORACLE - scoate pa piata Oracle Database 10g Express Edition de numai 150M. Este libera pentru modificari, redistribuiri, etc.

IBM - ofera Websphere Community Edition un server de aplicatii bazat pe Apache Geronimo un server de aplicatii Open Source de la apache care a trecut testele de J2EE. De asemenea IBM integreaza si produsele pe care le-a achizitionat in timp: Gluecode si Cloudscape!

marți, noiembrie 15, 2005

iBatis

IBatis este un framework care permite maparea domemiului la interogarile SQL. Se poate folosi pentru popularea automata a obiectelor valoare(domeniu). Din testele facute se pare a fi util. Am folosit cu succes Hibernate pana acum. Auzisem de iBatis in Spring ca fiind unul dintre framework-urile de persistenta cu care se integreaza. Pe langa mapare, aduce si un layer de DAO aplicatiilor abstractizand aspectele rudimentare legate de gestiunea conexiunii si de tranzactii.

Metode automate incercate pentru a obtine obiectele valoare:

* Middlegen plugin for iBatis -> netestat (am testat Middlegen cu plugin-ul de Hibernate si a mers partial - am testat mai precis MiddlegenIDE dar nu cu rezultate prea bune)
* Un script Perl facut de un rus care se bazeaza pe ceva interesant - transformarea interogarilor SQL in fisiere XML pentru iBatis. A functionat pentru exemplul dat si am folosit ActivePerl.
* JasmineIDE pare a fi o solutie buna, de mapare mai sofisticata. A mers cu MySQL dar nu cu ORACLE.
*Appgen nu a dat rezultate prea bune.
*Am folosit fara prea mare succes Hibernate extensions 2.X.

Intrebarea e daca poti sa generezi relatiile din baza de date in relatii intre obiectele valoare (obiecte domeniu ca atare). In general se pare ca nu.