Přesun a změna feedu
Právě jsem Jablok přemigroval na hostovanou verzi u Wordpressu.
Prozatímní URL je http://jablok.wordpress.com/. Pokud Jablok čtete přes feed reader (čtečku krmiva? chm...), změňte si prosím adresu feedu na http://feeds.feedburner.com/jablok.
Konec hlášení, díky za pozornost. A snad budu mít čas psát trochu víc než poslední tři roky.
Záludný komparátor
Řečeno s Freudem: Kdo tvrdí, že nikdy nevytvořil SortedSet s Comparatorem, který byl nekonzistentní s equals metodou porovnávaných objektů, ten je tvoří dodnes.
A já pořád, kde se mi ty objekty ztrácejí...
re: Odháčkování
Cituji Petr Ferschmana:
Snad každý český programátor narazil na problém odstranění diakritiky z textu (tzv. odháčkování). Pro tyto účely jsem si kdysi vytvořil jednoduchou mapovací tabulku pro znaky v kódování ISO-8859-2.
Nyní jsem v Javě potřeboval něco podobného a našel jsem lepší řešení:
String decomposed = java.text.Normalizer.normalize(string, Normalizer.Form.NFD);
return decomposed.replaceAll("p{InCombiningDiacriticalMarks}+", "");
Pěkný, neznal jsem. Jen si dovolím dvě doplnění:
- java.text.Normalizer přišel až s Javou 6
- pokud ještě šestku nemáte, nemusite spoléhat na mapovací tabulky, ale můžete použít icu4j od IBM (pod proprietární, ale nerestriktivně vypadající open-source licencí). Pak můžete pro změnu psát něco jako:
String rule = "Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC";
Transliterator tr = Transliterator.getInstance(rule);
return tr.transform(src);
Potřebujeme domyšlené nástroje
Dagi ve svém dnešním elaborátu reaguje na nedávnou diskusi v konferenci@java.cz na téma, zda si má začátečník nejprve vymáchat ústa s minimem chytrých toolu či naopak, zda má začít s klikátkem, které jej odstíní od čehokoli složitého:
... jsou dnešní programy protkané různými abstrakcemi a technologiemi, které řádově zvyšují jeho složitost [...]. IDE by nám měly umožnit držet tuto komplexnost na přijatelné úrovni [...]. V případě méně zkušeného vývojáře to mohou klidně být různí průvodci (wizardy) pro vytipované případy užití (nová stránka, přechod mezi stránkami, mapování entity) a nebo vizuální editory.
Pokud si zjednodušíme vývoj na dva základní aspekty ( něco udělat a udělat to dobře ), tak citovaná úvaha bere do úvahy pouze ten první. Ano, chytré IDE usnadní začátečníkovi něco vyrobit.
Stejně tak oponenti, kteří by začátečníkovi nic neusnadňovali, logicky zastávají názor, že pokud dotyčný po velkem boji získá vzhled do základů, tak v klikacích nástrojích nebude páchat snadno naklikatelné, ale se znalostí podstaty šílené konstrukce.
Tím se nechci připojovat k ortodoxním zastáncům vrhání začátečníků do vody. Ale pár wizardů, které uživateli umožní něco bleskově splácat, nestačí. Mnohem důležitější jsou nástroje, které umožní uživateli poznat, co splácal špatně — připadně které natolik rozumí kontextu jeho práce, že mu některé možnosti budou — se stručným a srozumitelným vysvětlením — rozmlouvat.
Ale předpokládám, že tohle snad měl Dagi na mysli, když na závěr napsal:
Dnešní IDE si vzala lekci z vizuálních HTML editorů přelomu tisíciletí a nesnaží se pouze o co největší efektivitu, ale i o to, aby vývojáře částečně vedly k správnému používání dané technologie.
Tak jen aby to tak opravdu bylo.
... a nakonec malé páteční odhlehčení mimo téma: Trolling with Java Web Frameworks
Jak správně programovat
Nic popisovat nebudu, výborně blognuto u Dagiho: Deset rad jak psát kód efektivně.
Tak to prostě je.
Všechno možné jako open-source v Javě
... najdete na manageability.org.
Libo web crawler, fulltext (opravdu Lucene není jediný), analýzu grafů či třeba parsování sebehnusnějšího HTML? Nebo jste zvědavi, jestli se na persistenci dat najde ještě něco kromě všudypřítomného Hibernate či Apačího iBatisu? Stačí natáhnout ruku... ... a je tady. Ó doňo Kláro, kde se tady vzal ten lev?
Budoucnost Java Server Faces
JSF mi k srdci nepřirostly, a občas si neodpustím poznámku, že podobně jako EJB začnou být rozumně použitelné až ve verzi 3.0.
Podle návrhu JSR pro JSF 2.0 to ale vypadá, že už druhá verze této specifikace by mohla zamířit dobrým směrem.
Obzvlašť mě těší, že konečně někoho napadlo, že i v JSF by se webové aplikace mohly chovat jako webové aplikace, takže se objevil i požadavek
Allow for bookmarkable JSF pages. More broadly, if HTTP GET can be used, it should be used.
Google Guice
Pozorováním programátorů v divočině člověk snadno zjistí, že je zjevně zábavnější vytvářet obecné frameworky nežli aplikace, které něco opravdu dělají. Takže není divu, že máme další z mnoha frameworků poskytující podporu pro organizaci aplikace podle vzoru inversion of control .
Název naznačuje, proč zrovna tenhle kousek stojí za popzornost: než byl vypuštěn do světa jako open-source projekt, tak byl po několik měsíčů prakticky ověřován na Gůglích "mission critical applications" (zdroj) — nevím, které přesně, někde jsem sice v této souvislost četl o AdWords, ale už si nevybavuju, kde.
Stručná charakteristika:
- řeší jen a pouze dependency injection + integraci s servletovým kontejnerem
- vyžaduje Javu 5, a je silně postaven na generických typech a anotacích
- má být svižný (čemuž bych věřil, protože letmý pohled do zdrojáků naznačuje naprostou absenci reflection)
Jak se s Guice programuje?
Máme-li třídu závislou na implementaci nějakého rozhraní, označíme příslušný setter (nebo konstruktor) anotací @Inject:
import com.google.inject.Inject;
public class Client {
private Counter counter;
@Inject
public void setCounter(Counter counter) {
this.counter = counter;
}
public void test() {
counter.ping();
counter.ping();
System.out.println(counter.getValue());
}
}
Co nám vlastně do proměnné counter přilítne, určí programátor tak, že vyrobí, tzv. modul, tedy implementaci rozhraní com.google.inject.Module, ve většině newebových případů pak potomka com.google.inject.AbstractModule a pro webové aplikace má k dispozici rovnou com.google.inject.servlet.ServletModule.
V modulu si pak namapuje rozhraní na konkrétní implementaci a vymezí rozsah platnosti instancí, třeba takhle:
import com.google.inject.Scopes;
import com.google.inject.servlet.ServletModule;
public class MyModule extends AbstractModule {
protected void configure() {
super.configure();
bind(Counter.class)
.to(CounterImpl.class)
.in(Scopes.SINGLETON);
}
}
Výše uvedený kód říká, že do metod označených anotací com.google.inject.Inject, které přijímají parametr typu Counter se předá vždy jedna a tatáž instance (ano, to je to in(Scopes.SINGLETON)) třídy CounterImpl.
A pokud má náš kód běžet v prostředí webového kontejneru a modul vyrobíme rozšířením třídy ServletModule, pak máme — nejspíš v souladu s očekáváním — další dvě možnosti nastavení rozsahu platnosti injektovaných tříd, a to com.google.inject.servlet.ServletScopes.REQUEST a SESSION.
Pokračování příště.
Co mají společného Wayne Gretzky, David Cronenberg a James Gosling?
Všichni tři se mohou pyšnit titulem "Důstojník Řádu Kanady" (Officer of the Order of Canada). Gosling od včerejška.
Něco ze života... o Hibernate
Real-World Experiences With Hibernate — užitečné čtení, pokud Hibernate používáte či chystáte se použít a přitom se ohledně tohoto frameworku necítíte být ostřílenými mazáky.