Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux

pondělí 14. dubna 2008

getClass() versus instanceof v equals()

Jak píše Dagi, použití if (getClass() != o.getClass()) return false; generuje chyby při použití Beanových frameworků (Hibernate, EntityBeans,...). Josh Bloch například zde doporučuje instanceof i s tím, že napsat equals() bude mnohem těžší. Otázka zní: jak ji vlastně správně napsat? Je potřeba zaručit symetričnost, takže
if (!(o instanceof this.getClass())) return false;
nic neřeší.
if (!(o instanceof this.getClass())
&& !(this instanceof o.getClass())) return false;

vypadá na první pohled lépe, ale pořád to neřeší vůbec nic.
Lze vůbec genericky prohlásit, že je možné v jakémkoli případě napsat equals() podle obecného algoritmu tak, aby odpovídala všem požadavkům na ni kladených? V případě Hibernate je bez debaty nutné použít instanceof. Co ale v případě, kdy potomek se liší od předka v přidání jednoho podstatného atributu? Pro příklad uvedu třídu popisující N rozměrný Euklidovský prostor. Jako potomka pak navrhnete třídu popisující Lobačevkého hyperbolický prostor, která pouze zavede patřičnou transformaci, která ovšem nemůže nikdy vrátit identitu na jiný prvek prostoru než bod. A v žádném případě nemůžete položit rovnítko mezi libovolnou instancí hyperbolického prostoru a euklidovského prostoru! Totéž by platilo pro systémy, které odpovídají Peanovské algebře a jejich potomky připravené o axiom indukce.
Uznávám, že se nejedná o zrovna zářné příklady. Uvedu jiný, učebnicový. V mnoha učebnicích je pro vysvětlení principů OOP použita hierarchie objektů: Bod->Obdélník->Kvádr. I zde je jasné, že nelze v žádném případě použít instanceof. Nebo dokážete pro Obdélník takovou smysluplnou symetrickou metodu equals() napsat? Čekám na vaše názory.
Mně teda jedno příšerné řešení napadlo. Použít Cimrmanova úkroku stranou a udělat z toho PNJ, tedy je-li to můj potomek, nechť to zařídí on. Ale nejsem si jist, zda jej lze použít v každém případě.

Nefunkční oracle-xa-ds.xml z JBoss docs

Kdo z Vás se bude snažit rozchodit konexi na Oracle z JBossu, asi v první chvíli sáhne po JBossí dokumentaci. V kapitole Other Databases mají přímo ukázkový deployment descriptor pro oráklovký datový zdroj. Leč je v něm ašíbka (alespoň pro verzi 4.2.2), a to konkrétně v definici MBeany pro formátovač chyb z Oracle plynoucích.

<mbean code="org.jboss.resource.adapter.jdbc.xa.oracle.
OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager
</depends>
</mbean>

Jenomže OracleXAExceptionFormatter není v balíku org.jboss.resource.adapter.jdbc.xa.oracle, alébrž v org.jboss.resource.adapter.jdbc.vendor. A pak se můžete divit, že vám z toho lítají CNFE: ClassLoaderNotFound.

Sláva našim výrobkům

Musím se přiznat, že článek (Ne)Qalita v běžném životě jsem napsal hlavně qůli článku tomto jako kontrast.
V sobotu jsem byl nakupovat. Nejdřív jsem si koupil stálici na trhu obuvi, české boty Prestige (tzv. prestižky). Už jsou to moje čtvrté. A nedám na ně dopustit. Lehoučké, pohodlé, kožené, na běžné nošení i na sport, do lesa a klidně i do bláta, dobře se v nich řídí, prostě úžasné boty. Navíc vyráběné v mém rodném Zlíně, bývalém městě obuvi. 889,- za takové boty opravdu není moc.
Rozradostněn touto koupí mne do malého obchůdku v Holešově se sportovním, převážně turistickým sortimentem, zavedla touha pořídit si nové gatě. A mám je. Manželka tam objevila pro mne krásné tričko (jak jinak než s tučňákem :-D ). Pěkně vypadá, perfektní materiál, kvalitní vypracování, větrací vsuvka v podpaží, prostě něco pro mě. Když jsem ho platil, nečekal jsem, že s ním doma zažiju milé překvapení.
Doma jsme totiž začali studovat visačku. Jenom mimochodem uvádím, že byla k tričku přivázaná špagátkem. První, co mne zarazilo, byl název firmy: Bemaniax. Ano, má to znamenat Be maniacs :-) . Pak jsme četli dál. Dozvěděli jsme se, že tato česká firma dělá limitované edice triček, takže málokdo bude chodit ve stejném jako já. Dále jsme se dozvěděli, že tričko bylo vyrobeno tak, aby nezatížilo životní prostředí.
Největší pecku jsem si schoval nakonec. Cituji: Tento výrobek nevyrobila čínská holčička.

(Ne)Qalita v bežném životě

Během víkendu jsem měl několik zajímavých postřehů ohledně kvality výrobků běžně potřeby.
Na prvním místě je autíčko mého syna, imitace klasického vojenského jeepu. Předpokládám, že uhodnete zemi původu. Ano, je to tak. Autíčko Made in China. Jako již poněkolikáté jsem vzal modelářské lepidlo na plasty a zalepil upadávající přední sklo (sklo tam samozřejmě není, jenom prázdný rám). Čínské plasty jsou pěkná fušeřina, trošku zatlačíte a křus. Tentokrát ale krom onoho rámu jsem zjistil, že je zadní náprava nějak podezřele posunutá jedním směrem.
Tak jsem vzal šroubovák, povolil jediný šroubek, co tam je, oddělal podvozek a čuměl jsem jak puk. V autíčku byl z mně neznámých důvodů osazený motorek spřevodovaný se zadní nápravou. A oba vstupy byly ustřižené! Pokud to mělo sloužit jako brzda nebo jako doraz (jiný význam nevidím), je to totální kravina. Holt, čínský výrobek, u něj se asi nemáme čemu divit.
Druhá hračka, která mne pěkně nadzvedla, byl silniční kužel v rozšiřující sadě (čtyři kužely, jeřáb, parní válec a nákla´dák) k vláčkodráze (ta kompatibilní s Maxim Wooden Toys), bohužel si už nepamatuju na výrobce, krabičku jsme už vyhodili. Každopádně jsme u této sestavy za pět kilo kvalitu jaksi očekával. Bohužel.
Buď máme doma takového ničitele, nebo prostě jenom ty hračky tak qalitní nejsou, ale dvě části kužele, vlastní kužel a podstava, byly k sobě jenom přilepeny a to něčím méně trvanlivým. Stačilo se o něj malinko opřít mimo osu kužele a podstava upadla. Musel jsem to k sobě přišroubovat.
Další "srandu" jsem si užil, když jsem koupil náhradní trafo k halogenovým bodovkám. Když jsem chtěl do svorkovnice přišroubovat měděné lanko, nešlo to. Důvod? Ve svorkovnici vypadající jak jednostranná "čokoládka" byl pod každým šroubem plech. Na tom by nebylo nic divného, kdyby ten plíšek nebyl napevno ukotvený z vnější strany. Přitahováním jsem tudíž lanko vytláčel a stačilo po dotažení za něj mírně zatáhnout a bylo venku :-(
Poslední zápich jsem zažil se satelitem od Koskomu. Po spadeném stropu, kdy jsme barák 7+2 muslei sestěhovat do dětského pokoje, který se zabednil, a do mojí nové pracovny o rozměrech 7x3m, ve které jsme museli měsíc vegetovat (čtyřčlenná rodina a naše hovawartí slečna, fakt legrace), byl satelit odpojený od sítě a pěkně zabalený před prachem. Po měsíci jsme ho vytáhli. Přívodní kabel jsme museli přecvaknout, protože se musela bourat příčka, kterou byl protažen a jíž konektor neprolezl. Po zapojení jsme ho museli zase nacvaknout. Byl šroubovací a tak jsem si na to troufl jenom se štípačkama a kombinačkama. Jenomže nám od té doby po televizi občas přeběhly pruhy. Napotřetí jsem k nám dostal ogaru, který nás zasatelitnil. Ten přišel a řekl, že je to pouhým nastavením video výstupu. Po dvou dnech odpojení prý koskom ztrácí konfiguraci!
No prostě hrůza a běs. Pokud mají nízké ceny přinést takové šmejdy, tak to ať se s cenovými závody honem přestane.

pátek 11. dubna 2008

IDEA a setter/getter generátor

IntelliJ IDEA umí generovat ohromné množství jednotlivých kusů kódu. Například toString() plugin generuje opravdu velice přehledně a inteligentně to, o co by se člověk musel starat. Navíc si můžete napsat několik vlastních šablon a ty potom podle potřeby generátoru vyměňovat.
Opačný extrém ale platí pro gettery a settery. IDEA je umí vygenerovat pro specifikované atributy, ale neumožňuje použít žádnou šablonu ani nakonfigurovat žádnou inteligenci.
Tak jsme hledal, jak toto opravit. A vygoogloval jsem feature request, který přesně o tomto mluví. takže doufám, že se toho brzo dočkáme. Ideálně v podobě pluginu či opravy stávajícího kódu.

Slovenčina je nádherná

Včera jsem se díval na ST 2. V reklamní přestávce v kriminálce Miami šel reklamní spot známý i u nás, na "konečně přípravek na hebké podpaží od nejmenované firmy", kde se děvče ptá svého milého, kterou část jejího těla má nejraději.
A reklama byla ve slovenštině. Na jejím konci jsem se musel smát, až jsem se za břicho popadal. Víte, jak se řekne slovensky podpaží? Podpazuší!
No řekněte, není ta slovečina úchvatný jazyk?

středa 9. dubna 2008

Hibernate a tabulky bez primárních klíčů

Jsou lidi, kteří tvrdí, že mít tabulku bez primárního klíče je nesmysl. A proto se bez něj Hibernate neumí pohnout. Já s nimi nesouhlasím.
Mějmež jednoduchý příklad: chceme uložit přichodivší fakturu do databáze. Faktura obsahuje hlavičku (kdo, kdy,...) a několik položek. Každá položka faktury má pevně danou strukturu. Z hlediska databázisty jednoduchý případ jak facka. Jedna tabulka pro fakturu (ID faktury, hlavička a stav), druhá pro položky (id faktury jako cizí klíč a atributy položky (cena, množství,...).
No jo, ale zkuste toto udělat v Hibernate! Jediná cesta, kterou jsem vygoogloval, je vytvořit fake_id pro každou položku každé faktury! FUJ! řeknou kování DBáci. A já s nimi.
Možná, že znáte jinou cestu. Rád se ji dozvím.