Jiří Hradil blog

o software


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

Jakarta POI: Práce s Excel a Word dokumenty v Javě

Práci s MS Office soubory v Javě nám jistě usnadní framework Jakarta POI.

POI obsahuje tyto komponenty:

POIFS - port OLE 2 Compound Document format, na tomto portu jsou založeny všechny následující komponenty.
HSSF - port MS Excel 97-2002 do Javy. Podporuje čtení souborů a jejich zápis.
HWPF - port MS Word 97-2002. Podporuje čtení a zápis. Tato komponenta je v ranné fázi vývoje a je zpřístupěna jen přes CVS.
HPSF - port pro nastavení vlastností souborů (jméno dokumentu, autor, datum poslední modifikace). Zatím podporuje pouze čtení těchto vlastností.

Pro ukázku možností si jednoduše vygenerujeme MS Excel soubor:


import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;

/**
 * Vytvoreni testovaciho MS Excel souboru pomoci Jakarta POI
 * (http://jakarta.apache.org/poi/)
 * @author  Jirka Hradil
 */
public class TestExcelSouboru {

    /**
     * @param args ignorovano
     */
    public static void main(String[] args) throws Exception {
        HSSFWorkbook sesit = new HSSFWorkbook(); //novy MS Excel sesit
        HSSFCellStyle styl = sesit.createCellStyle(); //novy styl
        HSSFSheet list = sesit.createSheet(); //novy list v sesitu
        HSSFRow prvniRadek = list.createRow(0); //vytvorime radek
        HSSFCell prvniBunka = prvniRadek.createCell((short) 0); //a v radku bunku

        //nastavime kodovani bunky na UTF
        prvniBunka.setEncoding(HSSFCell.ENCODING_UTF_16);
        //pojmenujeme prvni list
        sesit.setSheetName(0, "žluťoučký kůň", HSSFWorkbook.ENCODING_UTF_16);

        //pridame text do bunky
        prvniBunka.setCellValue("Příliš žluťoučký kůň úpěl ďábelské ódy!");

        //stylu nastavime pattern-jednolita barva
        styl.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        //nastavime barvu stylu, zluta barva
        styl.setFillForegroundColor(HSSFColor.YELLOW.index);

        prvniBunka.setCellStyle(styl); //a priradime styl bunce

        //stream pro vystup
        FileOutputStream vystup = new FileOutputStream("c:/vystup.xls");

        sesit.write(vystup); //zapiseme vystup do souboru
    }
}

ODKAZY:
Jakarta POI
Jakarta POI HSSF: Excell-ové tabulky v kostce
Jakarta POI 2.0 FINAL

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

Opera a Java Web Start

Jen taková drobnost-jak nastavíme Operu, aby spustila Java Web Start aplikaci po nakliknutí na odkaz *.jnlp?

Tools/Preferences/File types/New/předvyplníme údaje

Pak zbývá jen Operu restartovat a vše funguje, jak má.

Publikoval Jiří Hradil • 15.05.2004 v 00:05 • pod kategorií NezařazenéŽádné komentáře

Blogger: změny k lepšímu?

Již několik dní si uživatelé služby Blogger mohou vyzkoušet novou verzi systému, která přináší změny a vylepšení pro všechny, kdo chtějí blogovat-rychle a s minimálním úsilím.
Nová verze je opět o krok blíž dokonalosti, avšak nevyhnula se ani několika nedostatkům, které, (alespoň doufám) budou brzy opraveny.

Nejdříve zmíním největší pozitiva (nového/starého) Bloggeru:

Nenáročnost na cílové platformě
Jediný požadavek pro plnohodnotnou práci se systémem je místo na WWW serveru (Blogger nabízí virtuální server pro ty, kteří nemají vlastní, něco jako sweb.cz, centrum.cz, aj.). Žádný scriptovací jazyk, či databáze není třeba. Zadávání příspěvků probíhá přes browser, který poté vygeneruje dokonale provázané HTML stránky a uploaduje je přes (S)FTP na server.

Komentování příspěvků
I přes “absenci” dynamických stránek lze jednotlivé příspěvky komentovat-Blogger po zadání příspěvku na serveru automaticky statické stránky přegeneruje.

UPDATE 23.5.2004: Přešel jsem zpátky k HaloScan. Komentování přes Blogger vyžaduje navíc přihlášení a není možné komentáře zpřístupnit přes RSS.

Blogování přes mail
Zřídíme si adresu uzivatel.tajnyretezec@blogger.com a cokoli na tuto adresu pošleme, může být vystaveno (nebo odloženo pro pozdější publikování) na blog. I čeština funguje perfektně.

Blogovat může více uživatelů najednou
Tuto možnost využívá třeba Roman Pichlík.

Nové šablony
Pro nás kdysidávnowebdesignéry je jistě příjemné zvolit si existující šablonu a nestarat se tak o návrh blogu. Současná tvář tohoto blogu jednu z těchto nových šablon využívá.
UPDATE 23.5.2004: Nyní používám vlastní šablonu, mám více místa na text a vylepšené CSS (např. zobrazení zdrojového kódu Javy exportuji přímo z NetBeans IDE).

Profil uživatele
Ano, ten rámeček s fotkou vpravo, to jsem já :). Po nakliknutí jsou k dispozici předvyplněné údaje a pokud má uživatel více blogů, může se rozhodnout, u kterého z nich profil nechá zobrazit.
UPDATE 23.5.2004: Zobrazení profilu jsem zrušil. Zabírá místo a není až tak důležitý.

Nyní se podíváme na nedostatky:

Samovolné přegenerování uložené šablony
Zřejmě na Bloggeru fungují nějaké pozdní replikace uložených dat. Jednou se mi stalo, že systém se po přegenerování příspěvků vrátil k několik hodin staré šabloně a vesele mi tak změnil uloženou šablonu novou. Podruhé to samé zopakoval při komentování mého příspěvku. Protože jsou stránky na serveru statické HTML, tak po každém nově vystaveném příspěvku se provede nový upload stránky na web server. A právě pro šablonu aktualizované stránky sáhnul Blogger jinam než měl a web měl rázem starou tvář.

Pracné přidávání komentářů ke starým příspěvkům
Pokud chceme využívat komentovací systém, je nutno editovat postupně každý příspěvek, povolit možnost komentování samostatně a pak každou stránku zvlášť přegenerovat na cílovém serveru. Proč nejde u příspěvků změny pouze uložit a pak vše publikovat najednou?

Nedostatečné možnosti parametrizace
Přes veškerou snahu nelze některé texty přenastavit. Jedna z nich je profil (tak rád bych přepsal “About Me” na něco líbivějšího :), pak třeba v komentářích volba “Post a Comment”.

Přes všechny trable však zůstávám Bloggeru věrný a pevně věřím, že všechny zmíněné nedostatky budou postupně odstraněny.

Některá další pozitiva/negativa můžeme najít v následujích odkazech.

ODKAZY:
The Great Blogger Relaunch
Nový Blogger.com - ošklivé káčátko?
Blogger.com v novém - a lepším!
Blogger.com - výborný systém od Google!

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

Téma: ukládání dokumentů na serveru

Představme si následující situaci. Máme vlastní informační systém, který běží na straně serveru (na Javě, PHP…) a klientům zasílá vygenerované HTML či XHTML stránky.
Hlavní komunikaci klienta se serverem zprostředkovávají formuláře.
Systém by měl fungovat jako datový sklad pro dokumenty, uploadované na server společně s připojením popisných údajů-vlastní název souboru, poznámky, propojení s nabídnutým číselníkem, atd.
Popisná data dokumentu budeme ukládat do databáze, ale co se samotnými dokumenty, které můžou být také binární data-obrázky, mp3, všemožné doc, xls?

Nabízí se několik možností:

Popisná data uložíme do databáze (DB) a dokument přímo do filesystému (FS) na serveru. Součástí popisných dat v DB bude odkaz na tento dokument ve FS.

  • + Dokumenty ve FS je možné sdílet a přistupovat k nim i jinak, než jen přes rozhraní systému. Třeba jen pro čtení. V Linuxu lze nastavit sdílení složky s dokumenty např. přes Sambu a klienti mají možnost otevírat soubory přímo ze serveru, což může být někdy rychlejší, než přistupovat přes browser.
  • + Dokážeme tak ukládat i velké objemy dat (mnoho velkých dokumentů). Protože databáze uchovává pouze popisná data, mohla by být menší a rychlejší.
  • +/- Data na dvou místech - pokud spadne DB, dokumenty máme jinde (řeší kvalitní záloha). Avšak musíme se starat o zálohu dvojí.
  • - Obtížná implementace fulltextového prohledávání dokumentů. Pokud umíme pracovat s určitým typem dokumentu, pak výsledky vyhledávání zřejmě budeme muset taky ukládat do databáze. Pak by v DB byla popisná data a výsledky fulltextu. Odkaz na dokument ve FS.
  • - Neustále je třeba kontrolovat konzistenci dat, pokud se smaže dokument v DB, musí se smazat i ve FS a naopak. Tohle je asi největší problém.

Vše uložíme do DB. Binární data dokumentu budou jako datový typ blob, bytea, large object, apod.

  • + Vše na jednom místě. Vyřešíme tím dokonale provázání popisných dat a dat dokumentu.
  • + Fulltextové prohledávání (pokud umíme s daty dokumentu nějak pracovat) bude řešit DB.
  • ? Rychlost a náročnost DB. Tady opravdu netuším, jaké bude mít DB odezvy, pokud v ní budeme mít několik GB dokumentů.

Téma: Co si myslíte o jednotlivých řešeních? Napadá vás nějaký jiný, rozumný a pokud možno co nejjednodušší návrh?

Publikoval Jiří Hradil • 28.04.2004 v 23:04 • pod kategorií Nezařazené6 komentářů

Gmail Beta - první dojmy

Jakožto uživatel systému Blogger jsem využil nabídku být jedním z prvních uživatelů, kteří můžou vyzkoušet službu Gmail (nyní v betaverzi). Jedná se o webmail, rozšířený o řadu netradičních funkcí:

  • + Jednoduchost. Skutečně, klientské rozhraní působí velmi střídmě a přehledně.
  • + Zprávy se netřídí, ale prohledávají (velmi rychle a jednoduše). Tato funkce je pro mě jednoznačně nejužitečnější.
  • + 1 GB volného místa (bezesporu nejlákavější marketingová nabídka :)
  • + Seskupování zpráv (pokud přijde email a odpovím na něj, v detailu emailu je vidět předchozí konverzace).
  • +/- Reklama - absence vyskakovacích oken s reklamou. Systém velmi rychle pozná, odkud jsem přišel a nabízí mi statické reklamy na české stránky. Gmail by měl primárně těžit z cílené reklamy, která odpovídá charakteru textu v emailu. Toto “vylepšení” však bude zřejmě ještě upraveno. Test: poslal jsem si mail s předmětem “notebook LCD monitor” s textem “musím koupit nový hardware, software, najíst se v restauraci a vyspat v hotelu!” a Gmail mi nabídl jen reklamu na koupi luxusních bytů v Praze, o HW a SW ani zmínka :). Současný způsob reklamy však nepůsobí agresivně a dá se vydržet (možná jsem již tak otupělý reklamou ze všech možných médií, že mi tato připadá taková… neškodná :).
  • + Řazení zpráv do skupin (labels). U každé zprávy lze rozhodnout, kam obsahem zapadá a pak ji dle vytvořené a přiřazené skupiny jednodušeji filtrovat. Je to v podstatě taková obdoba složek. Klasické složky (adresáře) nelze v Gmail vytvářet. Existující složky jsou pevně dané. Docela revoluční nápad, uvidíme, jestli mi jednotlivé složky budou chybět. Myslím však, že vše dokáže nahradit účinné prohledávání (a to již dal Google Gmailu do vínku).
  • + Spolehlivost (aneb neříkej hop…). Ale je to přece jen Google, takže se dá očekávat vysoká rychlost a spolehlivost v ostrém provozu. Prostě jim věřím :)
  • + Spam filtr. Nevyžádanou zprávu lze označit ručně jako spam a systém se podle těchto informací učí.
  • + K dispozici je i nastavení filtrů po příchozí zprávy a nastavení prohledávání.
  • + Příprava pro tisk.
  • + Klávesové zkratky (jen část, seznam je dlouhý. Fungují i comba, např. g+i).
  • +/- Kontrola pravopisu, chybí však čeština. Snad jen dočasně.
  • - Adresář je jednoduchý, ale v tomto případě možná až příliš. Chci víc položek!
  • - České rozhraní chybí. Avšak čtení a odesílaní českých emailů funguje bezchybně. Google používá UTF-8. Kdo pomůže s překladem?
  • ? Externí klienti (POP3?) V budoucnu měl být systém dostupný také přes externí klienty (zdarma či za minimální částku).

Závěrem: Jsem mile překvapen, jak přehledný a jednoduchý může webmail být. Pokud se nebude zvyšovat procento agresivní reklamy a bude zachována jednoduchost, tento webmail bude u mě s přehledem nejoblíbenější.

UPDATE 28.04.2004: V komentářích reaguji na některé části příspěvku “Gmail: Nejhorší webová aplikace” z About weblogu.

UPDATE 07.05.2004: Po přihlášení mám možnost pozvat 2 kamarády, kteří si pak můžou zřídit vlastní testovací přístup. Takže prvním 2 zájemcům, kteří se mi ozvou na můj mail tuto pozvánku rád zašlu (potřebuju jen platný mail).

UPDATE 08.05.2004: Pozvánky rozeslány.

Publikoval Jiří Hradil • 26.04.2004 v 23:04 • pod kategorií Nezařazené4 komentářů

Předávání parametrů Java programům

Java Boutique popisuje několik způsobů, jakými lze předávat parametry našim Java programům:

  1. Parametry (argumenty) příkazového řádku
  2. Soubory vlastností (property files)
  3. Kombinací 1. a 2.
  4. Systémové vlastnosti (system properties)
  5. XML soubory
  6. Databáze
Publikoval Jiří Hradil • 06.04.2004 v 11:04 • pod kategorií NezařazenéŽádné komentáře