Jiří Hradil blog

o software


IBM kupuje Sun? Co bude s Javou?

Že je Sun na prodej, je všeobecně známá informace. Stejně tak i varianta, že Sun bude koupen IBM.

Dopady na některé technologie Sunu v případě, že kupcem bude IBM, mohou být následující:

Servery a zálohovací řešení (HW) - IBM měl poslední rok podíl na trhu serverů 31.4%, největší rival HP 29.5%, zatímco Sun 10.6% (zdroj: The Wall Street Journal: IBM in Talks to Buy Sun in Bid to Add to Web Heft ). IBM by si připsal podíl Sunu na trhu a získal by jednoznačný náskok. Servery by se prodávaly pod značkou IBM, dělit produktovou řadu je zbytečnou investicí do marketingu. Sbohem SunFire a SunStorage, zákazníkům je to jedno, uvnitř je to stejně všechno na jedno brdo.

Aplikační servery - Sun má Glassfish Enterprise Server (dříve Sun Application Server),  postavený na open-source Glassfish Application Server, IBM má WebSphere Application Server (WAS). Tříštit síly jak vývojářů, tak technologie nemá z pohledu IBM smysl. Předpokládám, že IBM se pokusí zákazníky přemigrovat na WAS  a open-source Glassfish ponechá svému osudu. Pokud nebude existovat komerční podpora pro Glassfish, tento server z dlouhodobého pohledu zanikne, protože svěřit jej (pouze) do rukou komunity znamená pomalu jej odsoudit k smrti. Velcí, ani normální zákazníci si Glassfish bez podpory nenaimplementují. Vývojáři, používající Glassfish pro Javu, přemigrují na jiný aplikační server. Pokud se drží standardů, změn by nemělo být moc (až na nějaké ty špeky, viď Dagi :) ).

Vývojové nástroje - Sun má NetBeans, IBM má mj.  IBM Websphere Studio Application Developer, který jede nad Eclipse. Z mého pohledu nemá NetBeans nic revolučního, co by Eclipse chybělo a domnívám se, že vývoj NetBeans bude pozastaven. Pro vývojáře, kteří používají NetBeans to bude znamenat několik dnů zkoušení jiného IDE, ale dopad na jejich vývoj bude minimální.

Databáze - Sun koupil MySQL a vlastní tak nejpopulárnější open-source databázi na světě, IBM má DB2. Jakkoli může být DB2 vnímána jako “enterprise” databáze, dnešním trendem je za základní software (databáze nevyjímaje) neplatit. MySQL nezanikne, není to soupeř DB2, IBM bude MySQL brát spíše jako “vstupní” databázi pro menší projekty, či firmy, které chtějí ušetřit (a kdo nechce).  A samozřejmě nabídne k MySQL, jak jinak, placenou podporu.

Java (platforma) - nejdůležitější nakonec. IBM má svou Javu, IBM Developer Kit, který prochází TCK a je tak ověřeno, že splňuje specifikace JSR, tedy měla by to být plnohodnotná, kompatibilní Java. Javu od IBM jsem nikdy nezkoušel, držel jsem se vždy Javy od Sunu, takže praktické zkušenosti rád přenechám zasvěcenějším. V budoucnu tak bude jen jedna Java a pár další, naprosto nevýrazných a nepoužívaných komunitních implementací. Udržovat a rozšiřovat jazyk a platformu, jako je Java, která je snad jediným konkurentem Microsoftích technologií, si může dovolit jen velká společnost a IBM by se toho mohla ujmout dobře.

O Javu jako platformu strach nemám. Tato technologie je natolik používaná a zaběhnutá, že její pád je v krátkodobém a střednědobém období nepravděpodobný. Alternativ k Javě moc není, napadá mě Microsoftí .NET Framework, případně multiplatformní Mono. Hromadný přepis již existujícího Java software je nemožný, existující projekty musí minimálně dožít a ty nové se stejně staví v aktuálních technologiích. A tam už je jedno, jestli je to Java verze 1.6,  1.7 nebo třeba .NET, či jiný, lesklejší a radostnější jazyk.

Publikoval Jiří Hradil • 31.03.2009 v 23:03 • pod kategorií javaŽádné komentáře

O marketingu a šeptandě

Bez marketingu nemůže existovat žádný produkt, softwarový nevyjímaje. Jednou z velmi efektivních a dnes používaných forem marketingu je word of mouth, čili “šeptanda”.

Placená reklama je drahá a krátkodobá.  Lepší je mít produkt tak vyčnívající z řady, že si na něj reference předají uživatelé sami. Kromě vlastní zkušenosti neexistuje důvěryhodnější zdroj, než spokojený kamarád, který software doporučil. Třeba Google, v době uvedení služby Gmail, šokoval velikostí schránky 1 GB a také systémem pozvánek, kterých bylo omezené množství. Google si tak otestoval postupné škálování celého systému a zároveň vzbudil u uživatelů, vlastnících účet, dojem exkluzivity. O Gmailu se hodně mluvilo, sám jsem o něm v počátcích psal. Samotné datum uvedení - 1.4.2004, tedy na apríla, je dalším výborným tahem, který zajistil, že byl Gmail chápán jako vtip (tak velká schránka přece neexistuje) a o to víc se o něm mluvilo a psalo. Stejně tak označení Beta (po 5 letech v produkci) je  nejen omluvou za případné potíže, ale i potvrzením, že používáte čerstvý software, který ještě nevychladnul a jste “in”.

Gmail však přežil hlavně díky tomu, že byl a stále je jednoduchý. Dobře se používá a prostě funguje. Rozbořil zažité koncepty (nepotřebujete složky, atd.). Je jiný a proto uspěl.

A závěr tohoto příspěvku pro vývojáře software? Odlišujte se. Přemýšlejte, čím váš software vybočuje z řady. Uniformních řešení jsou dnes stovky. Vy píšete software, který si zaslouží být jiný.  Mějte však na zřeteli, že software píšete pro lidi, ne pro technologii samotnou. Protože jedině v případě, že se váš software používá a koncoví uživatelé jsou s ním spokojeni, jste jako vývojáři uspěli.

Publikoval Jiří Hradil • 30.03.2009 v 18:03 • pod kategorií NezařazenéŽádné komentáře

Přednáška Apache Wicket na CZJUG

V rámci březnového setkání české Java User Group (CZJUG) na téma “webové frameworky“  jsem připravil a odprezentoval přednášku o webovém frameworku Apache Wicket.

Abstrakt:

Cílem prezentace je uvedení frameworku Apache Wicket pro tvorbu web aplikací, založených na platformě Java. Apache Wicket nabízí srozumitelný komponentový model, umožňující tvořit aplikaci pomocí běžných, http protokolem nezatížených javovských tříd, podporuje jednoduchou tvorbu prezentační části pomocí standardního HTML a přebírá odpovědnost za řízení konverzace mezi klientem a serverem. Wicket se snaží vycházet ze známých, ověřených principů a nenutí vývojáře učit se novou syntaxi, kterou jinde nelze použít. Prezentace je ve znamení jednoduchosti, která se prolíná celým frameworkem a ukazuje, že pro tvorbu komplexních web aplikací je Apache Wicket správnou volbou.

Průběh přednášky byl z mého pohledu velmi zajímavý a příjemně mě překvapily velmi dobře mířené dotazy od aktivních posluchačů. Doufám, že jsem o Wicket vzbudil zájem, který si tento framework určitě zaslouží.

Prezentace v PDF

Kompletní zdroje k prezentaci včetně zdrojových kódů

Publikoval Jiří Hradil • 27.03.2009 v 23:03 • pod kategorií wicketŽádné komentáře

EJB - potřebujeme střílet vrabce “kanónem”?

Tímto chci všem zůčastněným poděkovat za podnětné připomínky k mým EJB příspěvkům.
Rád bych reagoval především na jAbLoK spot “EJB 3.0 aneb Proč že tu mrtvolu stále resuscitují?“od Pavla Kolešnikova, který jsem pochopil jako vyčítání komplikovanosti specifikace EJB 2.x pro jejich nutná rozhraní, záznam v DD, či vyhazovaní vyjímek. Pavel staví rovněž otázku, zda jsou EJB vhodné pro triviální webové aplikace.
Ale co když nechceme psát “jednoduchou” webovou aplikaci, ale skutečně systém, který musí být škálovatelný a robustní, kde musíme používat clustering a load balancing a kde uvítáme, že se pro vyžadovanou spolehlivost a složitost rádi soustředíme hlavně na business implementaci?

EJB přece ví a počítají s tím, že budou použity pro rozsáhlé projekty a zastřešují hlavní potřeby vývojářů tím, že se na sebe snaží převzít do maximální možné míry tolik potřebný “background”. IDE díky jasným pravidlům umožňují tvořit komponenty velmi rychle a celý návrh tak minimalizuje množství chyb. Že jsou třeba k beanu minimálně 2 další rozhraní (pominu-li message-driven beans)? No a? Pravidla jsou tak dána, umožňují nám pak určitou funkčnost a je na každém, zda mu tato vyhovuje, či ne.

Technologií pro Javu je velmi mnoho a nelze jednoznačně říct, že EJB jsou všelékem na veškeré problémy, které musíme řešit. Místo porovnávání “kdo z koho” je rozumných východiskem zvážit, čím může být konkrétní technologie přínosem pro náš projekt. Pokud se najde vhodnější kandidát pro naše potřeby, bylo by hříchem jej nepoužít. Právě volnost rozhodování nám dává prostor pro další zdokonalování a psaní kvalitnějšího software. A pro mě jsou EJB vhodnou technologií.

Publikoval Jiří Hradil • 08.01.2005 v 02:01 • pod kategorií ejbŽádné komentáře

Studujeme EJB

Pro studium Enterprise Java Beans je nezbytně nutná vhodná literatura, která nás provede všemi zákoutími této technologie. Musí nás přesvědčit o tom, že Sun měl ty nejlepší úmysly a skutečně se nám snažil usnadnit náš nelehký vývojářský život.
Zdrojů ke studiu je mnoho a podle dotazů a zdůvodnění, proč EJB nepoužívat mám spíše dojem, že to spousta zvědavců vzdala už na začátku a vůbec se nesnaží pochopit podstatu této skvělé technologie. Vůbec se jim nedivím, pokud studovali podle J2EE tutorialu. Jsou ale mnohem jednodušší cesty.

Head First EJB (EJB 2.0) je vysněnou knihou, která nám jasně ukazuje, jak má vypadat správný a srozumitelný výklad. Musím rovnou říct, že nenávidím zbytečně složité věci a pokud mám něco dobře pochopit, musím si to nakreslit. Právě tento způsob používají autoři Kathy Sierra a Bert Bates a celá kniha je koncipována jako co nejjednodušší (a zároveň velmi kvalitní) příprava na certifikaci Sun Certified Business Component Developer (SCBCD). Témata jsou do hloubky probírána, perfektně rozkreslena a jsou podána velmi nenásilným způsobem. Čtenář pochopí koncepci EJB rozhraní, typy beanů, životní cyklus beanu a vůbec všechno, co potřebuje, aby mohl začít psát skutečné SW komponenty.
Dostupnost: v ČR jsem ji ještě neviděl, objednával jsem přímo z Amazon.
Hodnocení: jedna z nejlepších investicí, které jsem kdy udělal. Pokud potřebujete dokonale vysvětlit EJB, tak není důvod váhat. Nic lepšího se mi zatím do rukou nedostalo (ne, nemám procenta z prodeje ;).

Mastering EJB II (EJB 2.0) je další hutná kniha, kterou si lze zdarma stáhnout ze serveru TheServerSide. Méně srozumitelná, než HF EJB, ale v některých případech jde více do hloubky (patterns, load balancing, clustering). Má několik chyb a není tak úplná jako HF EJB (a book errata mail není funkční), ale nabízí prostě jiný pohled a rozhodně rozšíří vědomosti.
Dostupnost: volně ke stažení po registraci.
Závěr: Velmi dobrý zdroj, doporučuji číst až po zvládnutí základů.

J2EE Tutorial 1.4 (EJB 2.1) nabízí úvod do technologie EJB (společně se servlety, jsp a jsf), ale nějak mi tento způsob výkladu nepadnul do oka. Prostě vysvětlují jednoduché věci složitě a nemají tolik obrázků :). Chybí motivace, proč je třeba technologii používat určeným způsobem. Pak se nedivím, že vývojáři po shlédnutí EJB zavrhnou pro jejich příllišnou “složitost”.
Dostupnost: volně ke stažení
Závěr: Od Sunu, stačí jen prolétnout, není nutno studovat :)

EJB 2.0 Specification je prostě základ, na kterém staví všichni ostatní. Sem si chodím pro radu, když něco potřebuji vysvětlit dokonale a do hloubky “doladit”.
Dostupnost: volně ke stažení
Závěr: Pokud neznáte EJB, je zbytečné začínat tady, opět směruji dychtivé studenty na HF EJB. Co není v této specifikaci, není ani v certifikačním testu SCBCD.

Na konec se ještě zmíním, proč se nyní učím EJB 2.0 (a ne 2.1, či 3.0):

  • studijní materiály jsou psané většinou pro 2.0
  • Sun certifikuje opět pouze 2.0
  • pokud zvládnu základy 2.0, pak nebude problém přejít na novější technologii
Publikoval Jiří Hradil • 06.01.2005 v 17:01 • pod kategorií ejbŽádné komentáře

Objevujeme EJB

Jsou technologie, které jsou všeobecně známé a používané a technologie všeobecně známé a nepoužívané. Po několika měsících experimentování s Hibernate jsem došel k názoru, že to ještě není to pravé ořechové a začal jsem se učit a zkoušet Enterprise Java Beans (EJB). Po nastudování několika knih mám pocit, že je tato technologie přímo zrozená k tomu, aby byla objevena a masivně používána. Nebudu tady popisovat, o čem jsou EJB (to už udělali lépe jiní), jen vypíchnu, co se mi na nich líbí a co ne:

Líbí:

  • Striktně komponentový přístup
  • Definice home/remote (local/local-home) rozhraní k beanu (fakt, mě se tato logika velmi líbí, když pochopíte, o čem to je, nedáte na to dopustit)
  • Striktní definice v názvech metod (ejbCreate, ejbHome…) a vůbec držení vývojáře maximálně zkrátka (řeči o volnosti neberu, když se na projektu střídá hafo lidí, tak někdy ani jmenné konvence nestačí)
  • Container Managed Persistence (CMP) (při deploy create table, atd.) a relationships
  • DD ejb-jar.xml
  • Miluju Sun a tohle dělá Sun :)

Nelíbí:

  • Specifikace EJB je místy příliš obecná (i když, zase vendoři serverů mají volnější ruce, např. load balancing, clustering, generace PK…)
  • EJB-QL je dost chudý (např. 2.0 nemají ani ORDER BY)
  • Složitá technologie, ale jen na začátku. Když pochopíte, jak vše funguje a hlavně proč je to tak uděláno, nedáte na EJB dopustit. Chce to dobrou literaturu a hned musím říct, že J2EE tutorial od SUNu dobrý zdroj není (v dalším příspěvku uvedu lepší materiály ke studiu).

Jak tak procházím java konferenci, či různé příspěvky, mám z nich pocit, že EJB se nepoužívají jednoduše proto, že spoustě lidí připadají příliš složité (což nejsou). Možná je ale pravda jinde-prostě je všichni používají, ale nepíšou o tom :).

Publikoval Jiří Hradil • 06.01.2005 v 01:01 • pod kategorií ejbŽádné komentáře

Java Server Faces a Custom Converter

Problematika vytváření vlastních konverterů v Java Server Faces je nedostatečně zdokumentovaná a začátečníka pronikajícího do této skvělé technologie může stát zbytečně mnoho času.
V J2EE tutoriálu je ukázka jednoduchého konverteru pro úpravu čísel kreditních karet, avšak jedná se o převod String->String. V některých případech bychom však potřebovali převést String na náš vlastní objekt.
Proto se pojďme podívat, jak takový konverter vytvoříme. Předpokládejme, že chceme vytvořit select menu s výběrem našich objektů a tyto postoupit do backing beanu:

Nejdříve vytvoříme objekt Postava, který chceme nabízet k výběru v selectOneMenu. Důležité je překrytí metody equals() - tak, abychom dokázali porovnat objekt Postava podle parametrů (i když se bude jednat o 2 různé instance). Pokud equals() nepřekryjeme, nebude konverter fungovat, protože seznam objektů nabízených v selectOneMenu nebude stejný jako objekt, který v konverteru předáme podle předaného String argument (viz. konverter):

Postava.java (objekt, který chceme konvertovat):

/*
 * Vytvoreno 23.11.2004
 */
package cz.hradil.blog;

/**
 * Trida pro vytvareni objektu Postava. Kazda postava ma sve ID a jmeno.
 *
 * @author Jirka Hradil
 */
public class Postava {

    private Short idcko;

    private String jmeno;

    /**
     * Vytvori novou postavu.
     *
     * @param noveIdcko - ID postavy
     * @param noveJmeno - jeji jmeno
     */
    public Postava(Short noveIdcko, String noveJmeno) {
        this.idcko = noveIdcko;
        this.jmeno = noveJmeno;
    }

    /**
     * @return Vrati ID postavy.
     */
    public Short getIdcko() {
        return idcko;
    }

    /**
     * @return Vrati jmeno postavy.
     */
    public String getJmeno() {
        return jmeno;
    }

    /**
     * @param idcko
     *            Nastavi ID postavy.
     */
    public void setIdcko(Short idcko) {
        this.idcko = idcko;
    }

    /**
     * @param jmeno
     *            Nastavi jmeno postavy.
     */
    public void setJmeno(String jmeno) {
        this.jmeno = jmeno;
    }

    /*
     * 2 postavy jsou si rovne, pokud maji stejne ID a jmeno.
     */
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Postava)) {
            return false;
        }
        Postava postava = (Postava) obj;

        if (postava.getIdcko() == null || postava.getJmeno() == null) {
            return false;
        }

        return this.getIdcko().equals(postava.getIdcko()) &&
        this.getJmeno().equals(postava.getJmeno());
    }

    /*
     * Hashovaci kod pocitame jako: int result=17;
     * result=37*result+idcko.hashCode(); result=37*result+jmeno.hashCode();
     * Duvod: rovnomerne rozlozeni objektu v hashovacich sektorech.
     */
    public int hashCode() {
        int result = 17;
        result = 37 * result + idcko.hashCode();
        result = 37 * result + jmeno.hashCode();
        return result;
    }

    /*
     * Vraci retezec ID a jmena osoby.
     *
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return idcko.toString() + ":" + jmeno;

    }
}

Pak vytvoříme backing bean, který obsahuje get/set pro uložení zvoleného objektu Postava a rovněž nabízí List objektů SelectItem, který budeme načítat z JSP stránky (viz. view). Pro zvědavce-ano, míchám tady dohromady controller a model, v praxi bychom zřejmě načítali seznam jinak:

VyberPostavyBean.java (backing bean):

/*
 * Vytvoreno 22.11.2004
 */
package cz.hradil.blog;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.model.SelectItem;

/**
 * Controller pro vyber Postavy.
 *
 * @author Jirka Hradil
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class VyberPostavyBean {

    private Postava zvolenaPostava;

    /**
     * @return Vraci zvolenou postavu.
     */
    public Postava getZvolenaPostava() {
        return zvolenaPostava;
    }

    /**
     * @param zvolenaPostava
     *            Nastavi postavu.
     */
    public void setZvolenaPostava(Postava zvolenaPostava) {
        this.zvolenaPostava = zvolenaPostava;
    }

    /**
     * Metoda se zavola po stisknuti tlacitka pro ulozeni.
     */
    public void ulozit() {
        System.out.println("Jsem v metode ulozit(). Predany objekt: " + zvolenaPostava);
//tady si uz s objektem udelame co chceme
    }

    /**
     * @return Vraci seznam 3 vzorovych postav.
     */
    public List getSeznamPostav() {
        List seznamPostav = new ArrayList();

        Postava bugs = new Postava(new Short("1"), "Bugs Bunny");
        Postava runner = new Postava(new Short("2"), "Road Runner");
        Postava coyote = new Postava(new Short("3"), "Wile E Coyote");

        seznamPostav.add(bugs);
        seznamPostav.add(runner);
        seznamPostav.add(coyote);

        return seznamPostav;
    }

    /**
     * @return Vraci seznam postav jako List polozek SelectItem.
     */
    public List getSeznamPostavMenu() {
        List seznamPostavMenu = new ArrayList();

        for (Iterator iter = this.getSeznamPostav().iterator(); iter.hasNext();) {
            Postava el = (Postava) iter.next();

//Zde si vsimneme, ze do SelectItem musime ukladat cely objekt Postava, ktery pak chceme ziskat zpatky
            seznamPostavMenu.add(new SelectItem(el, el.getJmeno())); //2. argument je text, ktery chceme zobrazit
        }

        return seznamPostavMenu;
    }
}

Konečně se dostáváme ke konverteru. Tady je důležité, aby objekt, který chceme vrátit (převod String->Object) byl stejný jako objekt, který jsme nabízeli v selectOneMenu. A protože se nedokážeme dostat přímo na zvolený objekt v selectOneMenu, musíme na základě předaného argumentu String prohledat seznam původních objektů, vyhledat shodný objekt a vrátit jej. JSF kontrolují, abychom vrátili objekt, který byl na výběr v selectOneMenu. Proto jsme také překrývali equals-abychom zajistili, že původní objekt v selectOneMenu a námi vrácený objekt jsou stejné. Pokud bychom vrátili jiný objekt Postava, který se v selectOneMenu vůbec nenabízel, pak bychom viděli Exception :).

VyberPostavyConverter.java (konverter):

/*
 * Vytvoreno 22.11.2004
 *
 */
package cz.hradil.blog;

import java.util.Iterator;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

/**
 * Convertor String->Postava a zpet.
 *
 * @author Jirka Hradil
 */
public class VyberPostavyConverter implements Converter {

    /*
     * Z predaneho String vytvori objekt Postava.
     *
     * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext,
     *      javax.faces.component.UIComponent, java.lang.String)
     */
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {

        Postava zvolenaPostava = null;

        for (Iterator iter = new VyberPostavyBean().getSeznamPostav().iterator(); iter.hasNext();) {
            Postava el = (Postava) iter.next();
            if (el.getIdcko().toString().equals(arg2)) {
                zvolenaPostava = el;
                break;
            }
        }
        return zvolenaPostava;
    }

    /*
     * Objekt Postava prevede na String.
     *
     * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext,
     *      javax.faces.component.UIComponent, java.lang.Object)
     */
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        return (((Postava) arg2).getIdcko().toString());
    }
}

Teď zaregistrujeme bean a konverter do faces-config.xml:

faces-config.xml:

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>

<!--  BEANY -->
    <managed-bean>
        <description>Vyber postavy</description>
        <managed-bean-name>VyberPostavyBean</managed-bean-name>
        <managed-bean-class>cz.hradil.blog.VyberPostavyBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

<!--  KONVERTERY -->
    <converter>
        <converter-id>VyberPostavyConverter</converter-id>
        <converter-class>cz.hradil.blog.VyberPostavyConverter</converter-class>
    </converter>

</faces-config>

A můžeme vytvořit view:

formular.jsp (view):

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<f:view>

    <h:form>
        <h:outputText value="Postava" />
        <h:selectOneMenu value="#{VyberPostavyBean.zvolenaPostava}" converter="VyberPostavyConverter">
            <f:selectItems value="#{VyberPostavyBean.seznamPostavMenu}" />
        </h:selectOneMenu>
        <h:commandButton id="ulozit" action="#{VyberPostavyBean.ulozit}" value="Ulozit" />
    </h:form>
    <h:messages />

</f:view>

A je to. Po zvolení položky v menu se nám do backing beanu přenese zvolený objekt Postava.

ODKAZY:
J2EE 1.4 Tutorial

Publikoval Jiří Hradil • 25.11.2004 v 02:11 • pod kategorií hibernate, jsfŽádné komentáře

Používáme Java Server Faces a Hibernate

Z nepřeberného množství nástrojů určených k vývoji aplikací v Javě nyní zkoušíme kombinaci Java Server Faces a Hibernate. Proč právě tyto technologie?

Java Server Faces:
+ technologie vyvíjená a podporovaná Sunem
+ perfektní oddělení view od logiky aplikace
+ jednoduchost
+ možnost tvorby vlastních komponent
- nová technologie, nedostatek tutoriálů a zkušeností při vývoji
- chybí některé základní komponenty (file upload), nicméně byly již napsány třetími stranami (Oracle ADF, MyFaces)

Hibernate:
+ výkonné řešení persistence v Javě
+ relativní jednoduchost používání
+ široká vývojářská základna - mám dojem, že všichni používají Hibernate ;)
- chabá oficiální dokumentace
- trvá dlouho, než pochopíte souvislosti mezi všemi objekty a naučíte se je efektivně používat
- není od Sunu (ano, pro mě je tato maličkost docela důležitá :)

Instalace JSF:
1. Stáhneme JSF 1.1 ze stránek Sunu.
2. Soubory {JSF}/lib/*.jar zkopírujeme do adresáře knihoven aplikačního serveru (viz. konfigurace Tomcatu).

Instalace JSTL:
1. Stáhneme Jakarta Taglibs Standard Library 1.1.2
2. Zkopírujeme {JSTL}/lib/*.jar do adresáře knihoven aplikačního serveru (viz. konfigurace Tomcatu).

Konfigurace Tomcatu:
$CATALINA_HOME/shared/lib - zde se nachazi sdilene knihovny, ktere budou pouzivat vsechny nase web aplikace.
$CATALINA_HOME/common/lib - knihovny umístěné sem jsou viditelné jak našim aplikacím, tak internímu kódu Tomcatu.
Pro JSF a JSTL jsem zvolil $CATALINA_HOME/shared/lib

Instalace JDBC:
1. JAR soubor s ovladači k rozhraní JDBC ( např. u PostgreSQL soubor pg74.215.jdbc2ee.jar) zkopírujeme do $CATALINA_HOME/common/lib

Instalace Hibernate:
1. Stáhneme Hibernate 2.1.6 a Hibernate-extensions 2.1.2 ze Sourceforge.
2. Hibernate vyžaduje, aby všechny jeho knihovny byly součástí WEB-INB/lib u každého projektu. Prý by pak nastaly problémy s nástroji jako Log4j, commons-logging a dalšími (ještě jsem nezkoušel) .
Znamená to, že pokud vyvíjíme Hibernate aplikaci, kterou potřebujeme opakovaně zkoušet-deployovat na vzdálený Tomcat server, tak vytvořený war archiv bude neúměrně velký právě díky těmto knihovnám :). Pokud nemáme rychlé inet připojení, je vhodné instalovat Tomcat lokálně.
Není však třeba kopírovat všechny knihovny z {HIBERNATE}/lib/, stačí jen ty, které potřebujeme. Seznam vyžadovaných a volitelných najdeme v {HIBERNATE}/lib/README.txt}
Jak řešíte instalaci Hibernate knihoven vy?

Hibernate-extensions:
Tady najdeme pomocné nástroje k Hibernate, např. hbm2java (CodeGenerator) a class2hbm (MapGenerator). Tyto knihovny většinou nepoužíváme přímo v našich aplikacích, spíše k počáteční inicializaci - vytvoření základních java souborů z hibernate mappings, nebo skeletonu hibernate mappings ze zkompilovaných tříd (pomocí reflexe)-jedná se však jen o zakladní generaci, která vyžaduje ruční doladění.

Odkazy:
Java Server Faces Technology
Hibernate
Jakarta Tomcat
JSP(tm) Standard Tag Library
Oracle ADF
MyFaces

UPDATE 24.11.2004: Doplněna instalace JSTL a zbývajících knihoven JSF.

Publikoval Jiří Hradil • 21.11.2004 v 22:11 • pod kategorií NezařazenéŽádné komentáře

Pro uživatele Blogger.com: Převod Atom do RSS

My všichni, kdo používáme blogovací systém Blogger.com a potřebujeme konvertovat Atom XML do RSS, můžeme využít služeb 2RSS.com, kde je k dispozici konverzní odkaz či formulář.

Ukázkový odkaz:

http://www.2rss.com/atom2rss.php?atom=http://hradil.cz/atom.xml

Základní služba je k dispozici zdarma, do RSS jen přidává reklamu na produkty 2RSS (jeden řádek), což se dá přežít.
Placená verze stojí $14.95/rok a reklamu neobsahuje.

Dříve jsem používal formulář na Loosely Coupled, teď mi však nefunguje. Blogger.com doporučuje službu FeedBurner, ještě jsem to však nezkoušel.

Publikoval Jiří Hradil • 01.06.2004 v 23:06 • pod kategorií NezařazenéŽádné komentáře

Školení v Javě - rychlý start pro začátečníky?

Zrovna včera uvedl Dagi svůj článek Začátky s Javou: kde, co, proč, jak zkompilovat a spustit. V naší pozdější emailové diskusi jsme nastínili otázku, zda má smysl nechat se v Javě “vyškolit” a urychlit tak typické začátečnické tápání. Dovolím si začít od píky: Chci shrnout, jak probíhalo mé první seznamování s tímto jazykem.

Java na VŠE
Mnoho začínajích programátorů se jazyk začne učit na škole. Studuji VŠE a naše Katedra informačních technologií nabízí několik kurzů Javy. Zatím jsem absoloval IT_113 Úvod do programování a IT_115 Základy softwarového inženýrství. V těchto předmětech jsou studenti seznámeni se základními principy fungování jazyka a na několika jednoduchých programech se pak snaží poznatky aplikovat v praxi. Jde skutečně jen o základní seznámení, samostudium teorie a hlavně vlastní zkoušení v praxi je naprosto nezbytné. Kurzy jsou velmi stručné a věcné, není čas zabíhat do podrobností, avšak jako základní uvedení do problému jsou dostačující.

Měl jsem jednoznačnou výhodu, že jsem již základy znal a proto mi absolování nedělalo (a nedělá) větší problém. Právě však rychlé tempo a potřeba vtěsnat X poznatků do Y hodin může být pro nováčka ubíjející a osobně se domnívám, že by tento kurz měly povinně předcházet obecné základy objektového programování. Prostě a jasně - Java není jazyk, jehož základy se může člověk bez předchozí znalosti programování naučit ovládat za půl roku při frekvenci 3 hodiny týdně.

Velmi mě překvapilo(nevím, zda je to problém i na ostatních školách), jak studenti málo komunikují. Namísto, aby využili konzultačních hodin, kde se jim velmi vstřícný vyučující bude věnovat a ochotně jim zodpoví všechny dotazy, raději něco “zmastí po večerech” a výsledek tomu pak odpovídá. Myslím však, že neochota/neschopnost komunikovat je hlavním nedostatkem naší společnosti obecně.

Java pro “neškoláky”
Další (relativně rychlou) možností, jak získat základní přehled o Javě jsou specializovaná školení. Začneme u zdroje.

Školení Sun Microsystems
Sun pořádá celé spektrum školení v Javě-sestaví plán školení a certifikace. Ceny jsou však velmi vysoké. Osobně jsem na žádném nebyl, takže nemůžu hodnotit kvalitu lektora a studijní materiály. Uvítám názor účastníka.

Školení v Amaio Technologies
Na Amaio jsem narazil díky Bruce Eckelovi a jeho Thinking in Java. Rovněž ceny za školení jsou nižší než od Sunu. Pro nováčka, za kterým nestojí firma, která mu školení zaplatí je těžké se rozhodnout pro nemalou investici do svého rozvoje.

Zde jsem absoloval 3 školení:

J100 Úvod do programování v Javě pro neprogramátory
J110 Základy programování v jazyku Java
J120 Pokračujeme s Javou

Kvalita školení je na vysoké úrovni, lektor (Rudolf Pecinovský) velmi zkušený a trpělivý. Jako podklady ke studiu používá své vlastní materiály-vše je podrobně a dobře vysvětleno.
Uvedený set školení mi dobře posloužil i jako základní příprava na certifikační zkoušku.
Tyto školení (a ani žádné jiné) v žádném případě nenahradí samostudium. Zde však má absolvent obrovskou výhodu, že zná základy-není tak zahlcen zbytečnými informace a ví, co se kdy používá. Nejde tak cestou pokus-omyl (nejhorší možná varianta).

Rudolf Pecinovský má také vlastní stránky o výuce. Na nich uveřejňuje postupně kapitoly budoucí knihy “Myslíme objektově v jazyku Java 1.5″. Nutno říci, že je tato kniha již teď kvalitou zpracování a výtečným podáním skvělým odrazovým můstkem pro nové programátory. Autorovi držím palce!

Závěrem-školení ukáže dveře, ale projít musíme sami. Vynaložené náklady nebyly malé, ale rozhodně nelituji této investice. Nejvíce si cením toho, že mě lektor vždy dokázal včas zarazit, když jsem něco interpretoval špatně, byl schopen nastínit problém z několika stran a kladl důraz na používání v praxi. Prostě se dobře vyzná a ví, jak věc vysvětlit.

Samostudium

Zdá se, že samostudium je při porovnání se školením levnější varianta. Po mých zkušenostech však nedoporučuji začínat od píky sám, pokud nemáte po ruce zkušenějšího kolegu/dobrou emailovou konferenci s velmi trpělivými programátory a hlavně spoustu času. U samostudia se velmi často aplikuje metoda pokus-omyl a strávený čas nad zbytečným “vynalézáním kola” taky něco stojí.

Přímo se nabízí uvést zdroje v češtině, se kterými jsem začínal souběžně se školeními:

Materiály od Rudolfa Pecinovkého
Již zmíněno.

Bruce Eckel-myslíme v jazyku Java.
Velmi obsáhlá kniha, bohužel příšerně přeložená (Bogdan Kishka). Doporučuji číst anglický originál, který je k dispozici zdarma. Spousta omáčky, místy román a odskakování od tématu. Avšak v čestině zatím nic lepšího nemáme (IMHO to zlomí právě Rudolf Pecinovský svou knihou). Povinným úkolem pro každého čtenáře je splnění úkolů z probíraných kapitol! Někdy je to jediná cesta, jak pochopit probíranou problematiku.

Pavel Herout: Učebnice jazyka Java
Dobrá kniha, stručná, věcná, bez omáčky. Já bych tam ale dal více úkolů pro čtenáře :).

Joshua Bloch: Java efektivně-57 zásad softwarového experta
Doporučuji přečíst až po předchozích 2/3 knížkách. Autor je jeden z autorů Javy, kniha je VELMI výživná a někdy doporučení spíše překvapí (třeba rada #37 Optimalizujte rozumně), ale autor vždy dokáže, že se v problematice dokonale vyzná a přesvědčí nevěřící. :) Překlad je velmi dobrý (Karel Voráček) a (mně) jasný.

ZÁVĚR: Jak jste začínali vy? Máte praktickou zkušenost se školením v Javě? Co literatura?

UPDATE 09.06.2004: R. Pecinovský mě informoval, že na podzim chystá Amaio první kurzy platformy J2EE.

Publikoval Jiří Hradil • 01.06.2004 v 20:06 • pod kategorií studiumŽádné komentáře