Java

Json Java parsers / generators microbenchmark

A month ago I had an incident in production that was caused, as I found out later, by poor performance of used JSON parser library. I've optimalized the code and managed to solve it but decided to look for another library with better performance characteristics. I searched for some existing benchmarks and found two of them - one is for JSON manipulation on Android and the second one is thorough serialization test focused on different use-cases than I had. So I decided to write my own microbenchmark copying the use-case I had in the production.

This (self) v generikách

Tohle byl pro mě nějakou dobu oříšek, než jsem narazil na pár článků s překvapivým - ne dokonalým, ale přeci jen nějakým řešením.

Problém je jednoduchý, chtěl bych aby bylo možné v nějaké abstraktní třídě definovat cosi jako:


/** poznámka: toto je nesmysl, ale vyjadřuje
moji snahu o vyjádření vazeb **/
abstract class AbstractClass<T is this> {
   T getMe();
}

Což jsem potřeboval z důvodu získání reference na AOP proxy obalující moji třídu - v níže uvedených odkazech podobná potřeba vznikla při implementaci builder patternu.

Jak se zbavit nepříjemných závislostí v testech

Dnešní příspěvek bude velmi krátký. Je dost pravděpodobné, že podobné řešení už dávno máte ve svých tetovacích utilitkách, ale mě tato kombinace napadla relativně nedávno a jsem nadšený z toho, o jak elegantní řešení se pro testy jedná.

V některých testech potřebuji vytvořit část Spring aplikačního kontextu, jehož některé beany mají závislost na nějaké další beaně, kterou je pro mne obtížné do testu zahrnout. Buď z důvodu, že její samotné vytvoření s vyžaduje další komplexní infrastrukturu okolo ní nebo třeba proto, že její zařazení do testovacího kontextu způsobuje při běhu testu vedlejší efekty (např. odeslání e-mailu).

UX - také terorizujete své uživatele přesnými formáty vstupních polí?

Od začátku letošního roku pracujeme na drobných vylepšeních, které mají za cíl zlepšení uživatelské zkušenosti s našimi webovými aplikacemi. Kromě řady dalších věcí se naši UX odborníci zaměřili i na formuláře, které jsou standardní součástí většiny webů. O správném designu webových formulářů už toho bylo napsáno mnoho (viz. reference na konci článku) a v tomto článku je nechci opakovat. Jedním z požadavků, které dostali jako první byly automatické korekce zjevně špatných vstupů uživatele na místech, kde to je možné. Uvedu pár příkladů, které jste ještě donedávna mohli najít i na našich webech:

Groovy namísto shell skriptů

Pár shell skritpů jsem už napsal - jak pro Windows tak pro Linux, ale v tomto směru se považuji za naprostou lamu a to se ještě nějakou dobu nezmění. Proto jsem fascinovaně naslouchal Dierk Königovi, který na přednášce pražského CZJUGu zmiňoval použití Groovy pro psaní shell skriptů. Vyměnit jazyk proprietárního shellu, ve kterém toho moc neumím, za multiplatformní Groovy, kde jsem na výrazně pevnější půdě, se zdá jako perfektní nápad. Vše šlo tak hladce, že neváhám podobnou věc doporučit všem, co denně kódují na JVM.

GeeCON 2011

Polská konference GeeCON nabírá na popularitě a letos již byla s předstihem vyprodána. Možná to není takový tahák jako Google I/O, které se vyprodalo hned po 2 dnech, ale myslím, že pro Java pozitivního středoevropana je to jedna z velmi lákavých událostí roku. S kolegy z Forresta jsme na ni vyrazili již v úterý, abychom se ve středu zúčastnili University day s rozšířenými (3h) prezentacemi na konkrétní témata.

Jabber Shell

Nápad použít jabber jako příkazovou řádku k živému systému nás napadl asi před dvěma lety. Přestože se nám naše idea zdála velmi originální, jak se později zjistilo, nebyli jsme sami, koho podobná věc napadla. Existuje například implementace použití SSH přes Jabber protokol (JabSh) a možná by bylo možné při detailnějším hledání najít další.

Co nás vůbec motivovalo o nějaké takové věci vůbec přemýšlet?

Předně jsme vývojáři, kterým je příkazová řádka často bližší než sebelepší klikátka. Navíc klikátka umí milion věcí, které běžně nepotřebujeme - nám stačí jen pár základních úloh, které ovšem chceme provést velmi rychle a odkudkoliv. Ve firmě máme zprovozněný interní Jabber server (Openfire Jabber Server) integrovaný s naším LDAP (s odpovídající politikou hesel), který je provozován přes SSL protokol a tudíž splňuje všechny bezpečnostní požadavky definované naším TA oddělením pro přístup zvenčí. Svůj jabber účet má každý zaměstnanec Forresta, a mají ho také všichni po ruce (jeden klik nebo klávesová zkratka obvykle stačí) a to nejen ve firmě, ale i z domova. Klientů pro jabber protokoly je nepřeberné množství pro všechny platformy, a to i dokonce pro platformy mobilní (Android, iPhone, Symbian). XMPP má řadu použitelných knihoven v Javě - konkrétně autoři Openfire Jabber Serveru dodávají i velmi kvalitní klientskou knihovnu Smack, kterou jsme si pro naše účely vybrali. Všechno tedy hrálo do karet nápadu použít jabber protokol jako bránu k našim interním systémům.

Zamyšlení nad tvorbou programátorské dokumentace

Aktuálně ve Forrestu revidujeme způsob vytváření dokumentace, nastavení standardů a bavíme se o tom, co a jak změnit.

Motiv je jasný - nejsme spokojeni se současným stavem a v některých případech dokonce dost zásadně. Všichni známe to staré rčení "nejlepší dokumentace je zdrojový kód", které pochází kdoví odkud (tipnul bych si, že za ním stojí eXtreme Programming, ale zdroj jsem vážně nenašel) - jenže je to omyl. Správná dokumentace může mít dost zásadní vliv na výslednou použitelnost / publicitu vašeho produktu / knihovny mezi programátory.

IntelliJ Idea X - na co se můžeme těšit?

Ode dneška (1. listopadu 2010) bude pro zakoupené licence IntelliJ Idey 9 k dispozici upgrade na verzi 10 zdarma. Stejně tak pokud nyní upgradujete své starší verze Idey (6, 7, 8) na devítku, dostanete upgrade na 10 také zadarmo. To značí jedinou věc - vývoj IntelliJ Idea X se blíží ke svému konci a během měsíce nebo dvou bychom se mohli dočkat finální verze. A v této verzi nás čekají skutečně zajímavé libůstky.

Traktát o vzdělání programátorově

Po sadě technických článků bych rád napsal zase jeden trošku filozofického charakteru. Rád bych se v něm zamyslel nad způsoby, které používám pro své vlastní vzdělávání a faktory, které osobně vnímám jako pozitivní. Snad každému je jasné, že ten kdo na sobě dál nepracuje může v našem oboru těžko dlouhodobě něco dokázat (a být lépe placen ;-)) a proto se zamyšlení nad tím, jak se vzdělávat co nejefektivněji, určitě hodí každému.

When does your Spring @Transactional attribute apply on CgLib proxies

Testing transactional aspect of your application is not easy as we usually use Springs' transaction rollback on tear down testing approach. Though there are solutions to test aspect oriented logic it's not without a price. More than that - we very much got used relying on easy-to-use Spring @Transaction annotation so that we don't usually take an effort to do it. There is a few standard Spring rules for rollbacking transaction in relation to method resolution:

jOpenSpace 2010

Opět po roce proběhla - v pořadí již třetí - ne-konference nesoucí název jOpenSpace. Na ní se každoročně setkávají zajímaví lidé z celé republiky, které spojuje jediné téma a tím je Java a vývoj aplikací. Základem konference jsou tzv. lightning talky, což jsou mini-přednášky na vybraná témata. Některá z nich se mi podařilo nahrát a v tomto článku je dávám se svolením autorů ke stažení ve formě podcastů. Kromě toho, že některé z nich obsahují skutečně velmi zajímavé informace, je na nich lákavé především to, že s nimi neztratíte moc času - jejich délka se pohybuje do 6 do 25 minut. Takže neváhejte a stahujte ...

Názvy argumentů metod v reflexi

Člověk neznalý věci by mohl nabýt dojmu, že přes reflexi v Javě půjdou získat všechny informace, které se v signaturách tříd a metod nacházejí. Reflexe v Javě je skutečně velmi mocná, nicméně k některým informacím se nedostává jednoduše (jak jsme si ukázali v minulém článku) a k některým se bohužel nedokážete dostat vůbec. Do té posledně jmenované kategorie právě patří názvy argumentů metod. A právě o nich se chci dnes rozepsat.

Oříšek v reflexní analýze generik

Minulý týden jsem řešil zajímavý problém s reflexí a došel jsem k závěru, že generiky v reflexním API jsou opravdu velká legrace. Prototypoval jsem myšlenku automatického generování implementací nad obecným kontejnerem - dejme tomu Map (což není pro účely tohoto článku zase až tak důležité), a došel jsem k potřebě správně číst generické informace z deklarací tříd. Právě této, na první pohled jednoduché, věci, bych chtěl věnovat dnešní článek.

Vyhodnocení iBatis 3 Workshopu

Tento týden proběhl workshop na téma iBatis 3 v Národní technické knihovně. Na workshopu jsem vyhlásil soutěž o licenci vývojového prostředí IntelliJ Idea 9 - Ultimate Edition a v tomto příspěvku najdou soutěžící jak moji verzi řešení příkladů, tak i výsledné vyhodnocení. Kompletní řešení všech testů, které jsme v průběhu workshopu probírali najdete v GitHub repository na stejném místě jako původně (stačí si "pullnout" novou verzi zdrojových kódů):

Sponzor přednášky:

Děkuji ještě jednou všem, kdo si našli cestu na seminář a kdo se i po něm za mnou zastavili a řekli mi svůj názor na jeho formu a průběh (speciální díky patří chlapcům z MoroSystems za jejich příspěvek na blogu). Není totiž horší pocit než, když se jako přednášející dobu potíte vedle projektoru, pak se publikum potichu rozuteče a vy odcházíte z rozpačitým pocitem a otázkou, jestli to nakonec mělo smysl. Jsem rád, že, pokud nic jiného, tenhle workshop nějaké emoce vyvolal a ke konci za mnou zašlo hodně lidí, a měl jsem šanci si udělat obrázek o tom, jestli jsem to vzal za ten správný konec.

Pozvánka na CZJUG Workshop věnovaný iBatis 3

Rád bych vás všechny pozval na workshop na téma iBatis 3 konaný 3. března 2010 od 18 hodin v rámci CZ JUG setkání (pozor tato praktická setkání se konají v Národní technické knihovně v Praze - Dejvicích - viz. mapka dole). iBatis je framework pro mapování dat uložených v relační databázi na Java objekty. Už po několik let je zajímavou alternativkou k ORM frameworkům postaveným na JPA (jehož typickým představitelem je Hibernate). Mottem iBatisu je zjednodušit vývojářům práci s databází a přitom zůstat tak jednoduchý, jak jen to je možné. Právě jednoduchostí a nízkoúrovňovým přístupem k databázi si získal celou řadu vývojářů a v řadě případů poráží i daleko silnější frameworky.

7 tipů pro práci v Debug režimu v IntelliJ Idea

Před lety jsem psal článek o debugování aplikací v Javě. K mému překvapení jsem se totiž setkal s programátory, kteří v Javě k debugování kódu používali System.out(...) místo debug režimu. Po letech otvírám stejné téma z jiného pohledu. Jak efektivně používáme nástroje debug režimu, které nám naše IDE nabízí? Je totiž plno situací, kdy se můžeme s debugováním dost nadřít, nebo ... vědět co a jak v daném okamžiku nastavit tak, abychom se k výslednému pochopení problému dostali zkratkou. IntelliJ Idea těchto nástrojů nabízí celou řadu a v tomto článku bych rád rozebral několik z nich, které sám rád používám.

Třetí rok Myšlenek Otce Fura

Tradic je nutno se držet - i když je to jen tradice dvouletá. Proto i letos rekapituluji dění na mém blogu výtahem několika málo statistik, které mám k dispozici a také informacemi z mého osobního života, které mají s blogem souvislost. Doufám, že tím milé čtenáře neurazím, že v mé závěrečné rekapitulaci (kterou dělám i kvůli sám sobě) najdou pár zajímavých informací.

Rekapitulace

V letošním roce jsem měl o něco málo více čtenářů než v roce minulém. Počty přístupů odrážejí i skutečnost, že se díky vyhledávačům dostávají čtenáři i ke starším příspěvkům, kterých není na blogu úplně málo (v současné době je 91 publikovaných článků). Těší mě dvojnásobný nárůst čtenářů, kteří sledují novinky na blogu přes RSS čtečku - podle statistik zdrojů provozu většina z vás přichází právě buď přes RSS čtečky, z portálu Java.cz nebo při hledání rad přes Google.com. Tento fakt je patrný už ze statistik minulého roku, nicméně letos, řekl bych, většina lidí konvertovala právě k RSS formě odběru.

7 tipů pro práci s VCS v IntelliJ Idea

Znát velmi dobře IDE, se kterým pracujete deno denně, je pro vaši produktivitu zcela zásadní. Poslední rok mne utvrdil v tom, že přesto že IntelliJ Ideu používám už několik let, přesto je plno věcí, které nevím a které mi nakonec ušetří plno práce. Příkladem budiž pár klávesových zkratek o kterých jsem absolutně nevěděl a které jsem se dozvěděl teprve z DZone IntelliJ Cheatsheetu od Hamleta D'Arcyho - kupříkladu:

  • Ctrl+Shift+Insert - vertikální výběr oblasti (skvělé pro hromadné úpravy CSV souborů, SQL apod.)
  • Ctrl+Shift+U - změna case vybraného textu (tzn. na upper-case nebo lower-case)
  • Ctrl+Alt+Left, Ctrl+Alt+Right - posun na předchozí / následující lokaci kurzoru (používal jsem ikony) - skvělé pokud si prohlížíte jinou část třídy, včetně přesunutí kurzoru a pak se chcete vrátit rychle zpět
  • F11 - vložení rychlého bookmarku do kódu, který se vám ukazuje po pravé straně a je možné se na něj rychle vrátit

Možná, že teda i já vím pár věcí, které tak úplně známé nejsou, a třeba někomu z vás pomůžou.

Groovy - making existing objects refreshable

In the last post I described the basic principles I found behind the scenes of GroovyScript refresh. Now imagine that you want to create your own long living Groovy instances with auto-refresh behaviour when source code changes. You can use out-of-the-box Spring support - but there are some limitations I stated in the previous article.

In this post I am going to present an alternative solution that addresses some of the painful issues I noticed. As I stated before, key is to wrap the reference to Groovy instance into an another object managed by the Java class loader and that is exactly the main point of the solution presented.