pondělí 8. prosince 2008

Haruki Murakami: Konec světa & Hard-boiled Wonderland


Hned jak se v metru objevily reklamy na novou knížku mého oblíbeného autora (zatím jsem přečetl vše, co vyšlo v češtině), neváhal jsem a knížku koupil.

Nemá asi smysl pitvat, že se mi jeho styl prostě líbí, a snadno se mi identifikuje s hlavním hrdinou. Děj je opět kafkovsky absurdní, ale o tom se jistě dočtete více od serióznějších kritiků.

Já bych chtěl poukázat na originální hlášky.

  • Přesto se zdá, že jsou všichni navzájem spojeni sice neviditelným, ale přesto nepopiratelným poutem důvěrné vzpomínky. [s.23]

  • Sexuální touha, to je pozitivní energie.Pokud ji není jak vybít, hromadí se a hromadí a člověk přestává jasně myslet a narušená je i jeho fyziologická rovnováha. U mužů stejně jako u žen. U žen to navíc vede k nepravidelnostem v menstruaci a nepravidelný cyklus vede zas k psychické labilitě. [s.57]

  • Já připadá, že ve vás něco je. Anebo že vám naopak něco chybí. To vyjde docela nastejno. [s.60]

  • Pravil jsem rovnou, že tomu moc nerozumím. Jsem totiž člověk povětšinou upřímný. Když je mi něco jasné, řeknu upřímně, že je mi to jasné, když mi to jasné není, přiznám bez mučení, že to nechápu. Nejasné odpovědi nedávám. Myslím si totiž, že je naprostá většina problémů zaviněná tím, že se někde někdo nejasně vyjádří. A věřím tomu, že na světě mluví tolik lidí vyhýbavě a nejasně proto, že si někde v hloubi duše koledují o problém. [s.61]

  • Smrti samotné se tolik nebojím. Jak napsal William Shakespeare: kdo letos umře, má pokoj pro příští rok. [s.62]

  • Její příšerný apetýt připomínal střelbu z těžkého kulometu do kůlny na dříví. [s.107]

  • "Kdy jsi vlastně naposledy měl nějakou ženskou?" zeptala se mě nakonec. Odklopil jsem v duchu víko své paměťové bedny a chvíli se přehraboval v obsahu. [s.108]
  • How to calculate age?

    I offten have on my projects a lot of conditions, which depends on the age of the client, user, his wife or dog ;-).

    Standard Java API is not very friendly for this use case. If you can't use JodaTime as me, I hope you appreciate this little calculator.



    public class AgeCalculator {

    public static int getAge(final Date dayOfBirth) {
    return getAge(dayOfBirth, new Date());
    }

    public static int getAge(final Date dayOfBirth, final Date referenceDay) {
    if (dayOfBirth == null) {
    throw new IllegalArgumentException("Parameter 'dayOfBirth' can't be null.");
    }
    if (referenceDay == null) {
    throw new IllegalArgumentException("Parameter 'referenceDay' can't be null.");
    }

    final Calendar calRef = Calendar.getInstance();
    calRef.setTime(referenceDay);

    final Calendar cal = Calendar.getInstance();
    cal.setTime(dayOfBirth);

    final int yearRef = calRef.get(Calendar.YEAR);

    final int year = cal.get(Calendar.YEAR);

    int result = yearRef - year;

    cal.set(Calendar.YEAR, yearRef);
    if (calRef.before(cal)) {
    result--;
    }

    return result;
    }

    }

    pátek 5. prosince 2008

    Už nikdy více NPE

    Na posledním projektu jsem ze zabýval archeologickou činností - upravovat aplikaci, která vznikla asi před dvěma lety a od té doby se příliš neměnila. Šlo o poměrně jednoduchou webovou aplikaci, která ukládá data z pár formulářů do databáze. Prostě brnkačka.

    Horší to bylo s implementací. Kód byl úplně zamořen následující konstrukcí

    if (someString!=null && someString.trim().length()>0) {
    // do something
    }

    nebo ještě v komplikovaněji

    if (firstName!=null && firstName.trim().length()>0 && lastName!=null && lastName.trim().length()>0) {
    // do something different
    }

    Kdyby to byl výskyt jen tu a tam, tak nad ním mávnu rukou, ale podobné podmínky tvořili asi 80% celého kódu.

    Většinou si programátoři začnou psát svoji vlastní MyUtil třídu, kde soustředí různé malé metody. Co programátor, to další MyUtil třída.

    Neznalost neomlouvá, takže - pro tyto účely je už dávno vytvořená, zdokumentovaná a asi milionkrát otestovaná třída StringUtils, která je součástí apache commons lang balíčku (doporučuji prostudovat vše, co v této knihovničce je - pozor je vysoce návyková).

    Výsledek vypadá následovně - čitelnost o poznání lepší.

    if (StringUtils.isNotBlank(firstName) && StringUtils.isNotBlank(lastName)) {
    // do someting
    }

    Pokud tedy máte pocit, že si chcete napsat svoji vlastní MyUtil třídu vězte, že objevujete znova kolo.

    neděle 26. října 2008

    Nepovedený zimmerit - díl třetí

    Po mnoha večerech, kdy jsem si hrál s novým tmelem jsem nakonec vyměkl koupil plechy od eduarda. Nejhorší bylo ten starý tmel dostat dolů. Myslím ale, že výsledek je tak o 100% lepší, než s použitím tmelu.

    pátek 17. října 2008

    Testing blocking operation

    Sometimes I have a luck and I can write multi-threaded application. I like testing all my classes with JUnit but it has no support for concurrency.

    During studding an excellent book Java Concurrency in Practice which explains all new features added in JSE5 regarding to concurrency, I was looking forward to chapter about testing with JUnit.

    The author recommends - if you need to test, that your operation blocks the calling thread, it is similar pattern as testing that your operation throws Exception.


    void testTakeBlocksWhenEmpty() {
    final BoundedBuffer bb = new BoundedBuffer(10);
    Thread taker = new Thread() {
    public void run() {
    try {
    int unused = bb.take();
    fail(); // if we get here, it's an error
    } catch (InterruptedException success) { }
    }};
    try {
    taker.start();
    Thread.sleep(LOCKUP_DETECT_TIMEOUT);
    taker.interrupt();
    taker.join(LOCKUP_DETECT_TIMEOUT);
    assertFalse(taker.isAlive());
    } catch (Exception unexpected) {
    fail();
    }
    }


    While I was watching funny video about java puzzles I was surprised, that the example from the book does not work !!!

    JUnit framework all exceptions and errors which are thrown from user thread does not interprets as failure! Fortunately, it logs stack trace to the console at least.

    Try this simple example - what colour does your test - green or red ?

    public void testFail() throws InterruptedException {
    final Thread t = new Thread(new Runnable() {
    public void run() {
    assertEquals(2, 5);
    }
    });
    t.start();
    t.join();
    }


    My is green and I expect, it should be red, because in my world, two does not equal to five.

    How to fix it? You need to catch the exception or error in your user thread and forward it to JUnit normal thread. For example in this way.


    private volatile Exception eException = null;
    private volatile Error eError = null;

    public void testEquals() throws InterruptedException {
    final Thread t = new Thread(new Runnable() {
    public void run() {
    try {
    assertEquals(3, 5);
    } catch (Exception e) {
    eException = e;
    } catch (Error e) {
    eError = e;
    }
    }
    });
    t.start();
    t.join();
    }

    protected void tearDown() throws Exception {
    if (eException != null) throw eException;
    if (eError !=null) throw eError;
    }

    protected void setUp() throws Exception {
    eException = null;
    eError = null;
    }

    čtvrtek 18. září 2008

    return ve finally ?

    Na certifikačním serevru javablackbelt jsem narazil na otázku, jak se chová fuknce, pokud má více návratových míst. Docela mě zarazilo, že návratovou hodnotu lze přepsat ve finally bloku.


    public class FinallyExample {

    public static void main( String[] args ) {
    System.out.println( test(true) );
    System.out.println( test(false) );
    }

    public static String test(boolean e) {
    try {
    if (e) throw new RuntimeException();
    return "A";
    } catch ( Exception ex ) {
    return "B";
    } finally {
    return "C";
    }
    }
    }

    Bez ohledu na to, jestli v metodě dojde či ne k vyjímce, hodnota ve finally bloku nakonec vyhrává - program tedy vypíše dvakrát C C.

    Inu, ne nadarmo je v idei automaticky zapnutá inspekce, která ihned varuje.

    This inspection reports any instances of return statements inside of finally blocks. While occasionally intended, such return statements may mask exceptions thrown, and tremendously complicate debugging.

    středa 17. září 2008

    Konec aplikačních serverů tak jak je známe?

    Po shlednutí přednášky Roda Johnsona se nemůžu ubránit dojmu, že koncept Spring application platform totálně převálcuje stávající implementace aplikačních serverů, tak jak je známe dnes.
    Na druhou stranu, jak znám stávající konzervativní zákazníky, kteří ještě ani nepřešli na Javu 5, mě optimismums opouští.
    Která banka bude první, a postaví svoje aplikace na springu?

    středa 20. srpna 2008

    Jak jsem se nechal certifikovat – SCBCD

    Ve firmě, kde právě pracuji jsem se nechal uvrtat do toho, že povedu školení o EJB3. Materiály jsem převzal po kolegovi, takže jsem s tím neměl moc práce. Horší bylo, že EJB3 jsem znal jen z rychlíku. Přesně podle hesla: “Ten kdo to neumí, ten to učí“. Takže jsem musel začít od začátku.

    Pomohla mi knížka EJB3 in Action (mimochodem, knížky od
    Manningu jsou vždy výborné). Je teda trochu obsáhlejší, asi 700 stran, takže na studium v tramvaji je to přece jen macek. Líbilo se mi, že se nesnaží obhajovat předchozí verze EJB a nevyhýbá se ani springu . Takže můžu jen doporučit.

    Školení proběhlo v pohodě, a aby čas strávený studiem nepřišel vniveč, rozhodl jsem se, že se nechám ocertifikovat.

    Jako studijní materiál jsem zvolil samotnou specifikaci. Původně jsem si myslel,že se nebude dát číst, ale opak byl pravdou. Dokonce jsem díky ní odhalil některé chyby v knize (mimochodem, autor odpovídá promptně).

    Na java ranči doporučovali ještě poznámky Mikalai Zaikina. Ty se ukázaly jako velice užitečné, neboť popisují i to, co EJB neumí.

    Abych nevyšel ze cviku, tak jsem si za těžce zdaněné peníze koupený tester od whizlabu. Ten mě ale velice zklamal. Nevím jak tester vyvíjejí, ale mě padal jak hrušky, a když spadl po 61 zodpovězených otázkách, tak jsem ho v rámci duševní hygieny smazal. U některých otázek byli dokonce špatné odpovědi! Takže rozhodně nebrat.

    Naštěstí jsem od firmy dostal licenci na uCerify – super věc, rozhodně doporučuji.

    Nakonec jsem zkoušku složil na 88%.

    pátek 15. srpna 2008

    Jak jsem se nechal ocertifikovat - SCJP

    Po několika letech kdy jsem dostudoval výšku a ještě víc letech co se živím (bavím) programováním v javě jsem se nechal ukecat na certifikaci (SCJP) - prý tím stoupne moje cena na trhu práce.

    Nejdříve jsem si nabubřele myslel, že se nebudu muset nic učit - vždyť všechno už znám ne ;-) ? Kolegové, kteří už ono martýrium absolvovali mě varovali, že si mám zkusit alespoň nějaké cvičné testy, ať vím co čeho jdu - ještě že je mám (ty kolegy).

    Testovací příklady jsou zejména o tom, jestli daný kód jde nebo nejde zkompilovat a proč. Přiznám se, že tuto práci za mě dělá počítač sám, takže jsem se moc nechytal. Druhý zádrhel byla znalost API - třeba v které package je DateFormat a tak. Přiznám se, že slovo klíčové import jsem nenapsal od doby co je za mě IDEA píše sama (minimálně 5 let).

    Na druhou stanu abych jen nehaněl, dozvěděl jsem se i o některých záludnostech, o kterých jsem nevěděl, neb jsem se s nimi nesetkal - např. anonymní iniciátory.

    Suma sumárum. Pokud se na certifikaci SCJP chystáte, určitě doporučuji nastudovat tuto knížku. Dále jsem měl k dispozici příklady testů od whizlabu. Poté test uděláte bez problémů (já jen na 90%).

    Na co vše se dá certifikovat - link.

    Poté, co jsem se nechal namočit do školení o EJB3 jako speaker, jsem se rozhodl, že si udělám i SCBCD, ale o tom až někdy příště.

    čtvrtek 24. července 2008

    commonj TimerManager

    Trápil jsem se rozběháním commonj knihovny na BEA WebLogic 9.2. Potřeboval jsem rozběhat periodický timer a byl jsem nucen použít tuto feature (Quartz mi byl zakázán).
    Postupoval jsem podle manuálu a světe div se, nefungovalo to.

    Prý stačí vložit do web.xml následující konstrukci a je to

    <resource-ref>
    <res-ref-name>timer/MyTimer</res-ref-name>
    <res-type>commonj.timer.TimerManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
    </resource-ref>

    Problém ovšem nastane při deploy !?!
    Žádná package commonj.timer totiž není, zato existuje commonj.timers.
    Chyba je tedy v jednom písmenku - s.

    pátek 11. července 2008

    Nepovedený zimmerit - díl druhý

    Tak jsem udělal druhou verzi. S tím polyester putty se dělá o poznání lépe. Horší bylo ten starý strhnout. Výsledek sice není žádná hitparáda, ale alespoň vzdáleně to připomíná zimmerit.
    Zatím jsem pracoval jen na věži, ale plánuji předělávku všude.

    středa 9. července 2008

    Nepovedený zimmerit - Tiger I, Tamiya 1:35

    Pokusil jsem se o vytvoření zimmeritu a bohužel ne moc uspěšně.

    Prošel jsem web a doporučené postupy a zakoupil Tamiya Epoxy Putty s nástrojem Zimmerit Coating Applicator taktéž od Tamiye.



    Asi nemám ten správný grif, neboť výsledek je tristní. Pousuďte sami.
    Navíc jsem se od toho tmelu neuvěřitelně upatlal a od plic zanadával.



    Naštěstí existuje fórum modelářů, kteří poradí. Prý jsem použil špatný tmel. Měl jsem použít tamiya polyester putty. Video, jak se zimmerit dělá také existuje.



    Dnes si tedy letím do obchodu pro jiný tmel a zkusím to ještě jednou. Horší bude, že už mám nalepené detaily a budu je muset odlepit a pak znova přidělat.

    Vychytávky v IntelliJ IDEA o kterých jsem nevěděl

    Přihlásil jsem ke k odběru refcardz a poslední příspěvek byl o IntelliJ IDEA. Vzhledem k tomu, že Ideu používám již léta a vždy mě dokáže něčím překvapit jsem se pustil do čtení. Myslím si, že většinu funkcí znám, tak se zaměřím jen na ty, o kterých jsem nevěděl.

    Copy/Paste
    To že se přes schránku kopíruje pomocí Ctrl+C/V není nic objevného. Zajímavé je ale to, že pokud není označené nic, automaticky se kopíruje celý řádek.

    Autoscroll from Source
    V projektovém panelu lze zapnout funkci, že pokud změníte selekci ve stromečku, automaticky se v editoru otevře příslušný soubor. Opět nic světoborného a nečekaného. Zajímavé je to, že to může fungovat i naopak. Tedy, pokud se přepínáte mezi taby v editoru, automaticky se skroluje na příslušný prvek ve stromě. Dříve jsem pro tuto funkci používal zkratku Ctrl+F1.

    Goto Class
    Pro nalezení třídy dlouhá leta používám Ctrl+N. Nevědel jsem ale, že pomocí Shift+Up/Down můžete vybrat tříd více.

    Goto Parent
    Pokud jsem potřeboval skočit na metodu předka, kterou overriduji, vždy jsem klikal na ikonu vedle metody. Odedněška už na myš nešáhnu. Stačí Ctrl+U.

    Autoscroll to Source in the Find pane
    Při vyhledávání pomocí Ctrl+F se ukáží výsledky v okně ve kterém se můžete pohybovat pomocí šipek nahoru a dolu. Lze zapnout i autoscroll, kdy při změně selekce ve stromě se automaticky odskroluje v editoru. Já toto většinou mám vypnuté, neb mě to vyrušuje. Zajímavé je ale, pokud máte autoscroll vypnutý, tak ho můžete "temporary" zapnout pomocí Ctrl+Alt+Up/Down.

    Preview in the Find pane
    Po vyhledávání pomocí Ctrl+F se mi většinou změní otevřené soubory v editoru a musím je pracně hledat a otevírat znovu. Ve Find pane lze ale zapnout preview okno, ve kterém se při změně selekce ve stromu automaticky skroluje do preview okna.

    Vyhledávání funkcí v menu
    Menu je poměrně rozáhlé a občas je probém najít tu správnou položku. Pomocí Ctrl+Shift+A lze vyhledávat v akcích menu. Toto považuji za velice užitečnou funkčnost. Škoda, že něco takového není i ve Wordu - tam tápu téměř pořád.

    Expand Word
    Pomocí Alt+Slash umí editor napovídat jména proměných. Moc jsem nepochopil, jak to funguje, ale vyzkouším.

    Surround with Live Template (Ctrl+Alt+J)
    To, že lze obalovat kusy kódu pomocí Ctrl+Alt+T jsem věděl a používám. Že existují Life templates (Ctrl+J) jsem věděl taky ale že může být life template+surround je pro mě novinka.