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

Proč používat Linux

středa 16. dubna 2008

Java prý prohrává boj o Web

Po delší době jsem zase brouzdal The ServerSide a musel jsem se opravdu zasmát. Přečetl jsem si "Java is losing the battle for the modern web"..., reakci Josepha Ottingera na Java is losing the battle for the modern Web. Can the JVM save the vendors? od Andiho Gutmana. Lidi, číst si některé blog2blog flameware, to je vám fakt někdy švanda. První něco ne zrovna inteligentního vymyslí pro podporu svého tvrzení, druhý to navíc špatně pochopí a polemizuje s tím. No nic.
Přesto je dobré si ona dvě zamyšlení přečíst. Andi se snaží přijít na to, proč je LAMP tak úspěšný a prosazuje se oproti Java EE řešení.
Zaujala mne myšlenka o větší RESTovosti LAMP řešení oproti klasice v Javě, která je podle něj navržena více na Enterprise aplikace a Webový Xicht je tam přidán tak nějak jako navíc. S tou historickou skutečností má dozajisté pravdu. EJB, gró J2EE, vznikaly nezávisle a odděleně od JSDK. JServ jsme používali a EJBoss byl ve stavu nepoužitelném.
Co se týká RESTovosti, tak tady je to dáno geneticky. Spustit CGIčko bylo velice rychlé, obzvláště když byl skript nakešován. Navíc CGI nemohlo být stavové a tak se všechna data předávala v INPUT HIDDEN tazích. Oproti tomu spouštět JVM pro každý request by znamenalo si vyrvat vlasy. Je celkem pochopitelné, že chtěl-li Sun dostat Javu i na serverovou stranu, musel JVM pověsit na ServerSocket. Ono to mělo zase spoustu výhod. Najednou přibyla stavovost a všichni tvůrci Webových aplikací (no, moc nás tehdy nebylo) jásali, protože si mohli data držet v HttpSession. A ano, zde se ztratil REST.
Časem ale došlo k velkému sblížení. PHP dostalo session (ó, jaká to výhoda oproti Perlu, máme podporu session přímo v systému!), J2EE patterny tvrdí něco o bezstavovosti a držení si stavu v DB, což je momentálně jediný způsob, jak si ho drží Perl či Python.
Takže o větší RESTovosti LAMPu to není. Aplikace je tak RESTová, jak se napíše.
Další zajímavý poznatek je o multiprocess versus multithread. Dozajista pád skriptu nemusí nutně znamenat pád celého systému. Ale řekněme si to jinak - od dob mod_php či mod_perl je schopen vzít s sebou skript celý apache. Deadlocky nechrozí jenom zdánlivě - maximální počet spojení na MySQL se při tuhnutí skriptu velice brzo vyčerpá, to mi věřte.
Já si myslím, že hlavní rozdíl je v nasazení. V rámci komunity se vyvíjí především na LAMP ve stylu komunita sobě, komerčnímu světu zase vládne spíše J2EE, protože platící zákazník požaduje záruku stability a pro většinu z nich není ani PHP ani MySQL dostatečnou zárukou. Proto je možno z Webu stáhnout LAMP OpenSource aplikace a vrznout je na svůj LAMP server, kdežto málokdy stáhnete OpenSource .ear .

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?