čtvrtek 31. července 2008

Hibernate a One-to-One (ne)lazy loading

Vztahy jedna ku jedné nepoužívám příliš často (aspoň co se databázových aplikací týče), takže mě zarazila následující věc: ve výchozím nastavení totiž Hibernate po vytažení jedné entity selectem ihned dalším selectem natáhne i druhou entitu ze vztahu. To by nebylo tak zlé, horší je, že po jednom dotazu na 1000 entit provede ihned dalších 1000 dotazů na vázané entity.
K pochopení proč to tak je a jak z toho ven je potřeba udělat úkrok stranou a uvědomit si, jak funguje lazy loading (líné načítání) ve vztazích Many-to-One. V něm je entita, obsahující kolekci (set, list,...) dalších entit. Při načtení "hlavní" entity nejsou prvky kolekce ihned načteny, ale na místo kolekce vloží Hibernate svůj speciální proxy objekt, který umí podřízené entity načíst z databáze teprve až při prvním přístupu k prvkům. Důležité je, že kolekce jako taková nikdy není null -- pokud vztah na straně Many má nulový počet prvků, má kolekce velikost nula.
U vztahu One-to-One ale takové řešení není možné proto, že nejde nasimulovat hodnotu null: Hibernate nemůže vložit "svůj speciální proxy objekt" a při prvním přístupu ho načíst, protože pokud by entita v databází chyběla, není způsob, jak proxy vyměnit za null. A právě z tohoto důvodu se musí jít do databáze zjistit, jestli objekt je nebo není. (Tady bych poněkud čekal, že bude aspoň možné objekty načítat nastavením BatchSize po větších kusech než po jednom, ale to se mi nepodařilo rozchodit).
V případě, že máme opravdový vztah One-to-One (tj. obě strany jsou vždy přítomné), nejjednoduším řešením je přidat k anotaci parametr optional=false (případně v mapovacím souboru uvést constrained="true") a lazy loading bude fungovat tak, jak člověk čeká.
Some explanations on lazy loading

pondělí 21. července 2008

KML - formát pro geografická data

KML je formát souborů pro přenos geografických dat, používaný hlavně v programech Google Maps, Google Earth a Google Mobile. Zkratka KML znamená Keyhole Markup Language (Keyhole je název firmy původně vyrábějící dnešní program Google Earth) a jeho podporu najdeme dnes už ve většině geoprogramů.

KML se tedy dá s výhodou použít k přenosu dat mezi různými geosoftwary, a protože jsou to obyčejné XML soubory s nepříliš složitou strukturou, dají se i ručně upravovat. Tak se dá například vyřešit problém v Google My Maps spočívající v nemožnosti změnit pořadí bodů na mapě. Řešení (poněkud sekernickou metodou) je jednoduché: mapu z Google Maps stáhnout v KML formátu (zkopírovat odkaz "Zobrazit v Google Earth" a v adrese přepsat output=kml), pak upravit KML soubor a v Google Maps v editaci mapy dát Import, ze souboru, nahradit. (Mno, teď jsem byl upozorněn, že v My Maps jde měnit pořadí bodů přetahováním... Ale to určitě dřív nešlo!)

Zobrazení KML souboru na Google Maps je poměrně jednoduché: URL souboru vložíme do vyhledávacího políčka a Google Maps zobrazí obsah. Takto se dá udělat i odkaz ve formátu http://maps.google.com/?q=URL
Podrobnosti na Google Maps API blogu: KML on Google Maps. Tímto způsobem se dá zobrazit v Google Maps i např. export z Picasy.

KML soubor může být zobrazen i pomocí Google Maps API (tj. vložení mapy do vašich stránek), stačí soubor načíst do objektu GGeoXml a přidat ho do mapy jako overlay:
var gx = new GGeoXml("URL");
map.addOverlay(gx);
Pozor při vkládání KML souborů přímo ze serverů Googlu, když není v url zadaný parametr oe=UTF8, nefungují KML, ve kterých jsou neanglické znaky.
Podrobnosti má Google Maps API blog: KML and GeoRSS Support včetně ukázky. Ke GGeoXml se můžou hodit pomocné funkce.

gekmllib je javovská knihovna pro manipulaci (čtení, vytváření a manipulace s KML), která ač je teprve verzi 0.3, vypadá (až na pár drobností) poměrně použitelně. Dalšími knihovnami jsou kmlframework a XStreamKML.

Nevím jak vy, ale já dneškem končím s uchováváním svých geo dat v Excelech a CSV souborech... :)

neděle 20. července 2008

Zimbabwe uvádí 100 miliardovou bankovku

Zimbabwská centrální banka vydala 100 miliardovou bankovku, aby pomohla ekonomice, ve které díky astronomické inflaci zoufale chybí peníze. Bankovka, která přijde do oběhu v pondělí, má hodnotu jednoho amerického dolaru. Banka začala s vydáváním bankovek takto vysokých hodnot v prosinci (250.000), v lednu následovaly další (1, 5 a 10 milionů) a od května vydala hodnoty od 25 a 50 milionů až k 25 a 50 miliardám.
Tyto bankovky ovšem jsou šeky na doručitele, protože od roku 2003 Zimbabwe nemá formální měnu. Platnost těchto šeků je omezena do konce letošního prosince, ale je nepravděpodobné, že do té doby se situace stabilizuje, protože recept na potlačení inflace nevede přes vydávání bankovek stále větších hodnot.

Pokud budeme "inflace" říkat té inflaci, kterou známe z naší a dalších běžných ekonomik, tak ta zimbabwská je přesným názvem "hyperinflace". Dopředu ji žene snaha zimbabwské centrální banky vyřešit nedostatek hotovosti, ale vytištěním dalších bankovek se sníží cena těch stávajících. Ale nedostatek hotovosti se nevyřeší bez zastavení inflace. Zimbabwskou centrální banku řídí regulérní blázen Gideon Gono, který odmítá základní ekonomické poučky o tom, že množství peněz v ekonomice je možné zvyšovat jen se zvyšujícím se množstvím věcí, které se za ně dají koupit, a ostentativně tvrdí, že "jeho kroky vede Bůh".
Via CNN.

čtvrtek 17. července 2008

Zimbabwská inflace na 2 200 000%

Meziroční inflace v Zimbabwe se vyšplhala na neuvěřitelných 2 200 000%, což je pořádný skok z únorových 165 000% (v červenci 2007 činila 7 634%).
V obchodech, které zdražují několikrát denně se platí desetimilionovými bankovkami a v květnu byla dokonce vydána bankovka v hodnotě 500 milionů zimbabwských dolarů, která v době vydání odpovídala dvěma dolarům americkým (v roce 1980 byl zimbabwský dolar k dostání za víc než dolar americký).
Via BBC News.