úterý, 9. srpna 2011

Remote Notifications

Na letošním jOpenSpace jsem měl Lightning talk o tom jak jednoduše vytvořit desktopovou notifikační aplikaci, řízenou pomocí HTTP requestů. Aplikace je na pár řádků a nezávisí na žadných dodatečných knihovnách. Integruje tři nepříliš známé vlastnosti Javy:

  • ikonka v System Tray - přidáno v Java 6
  • přehrání systémových zvuků (ve Windows) - od Javy 1.4
  • HTTP server - v Javě 6 od Sunu/Oraclu (HotSpot, OpenJDK)

Ukázky zdrojového kódu a použití výsledného programu najdete v prezentaci.

Celý projekt naleznete pod GPL licencí na GitHubu na adrese:
https://github.com/kwart/Notifier

Aplikaci si můžete rovnou vyzkoušet spuštěním Notifier.jar.

čtvrtek, 9. června 2011

jOpenSpace 2011

O víkendu proběhl další ročník tradiční (ne)konference české Java komunity jOpenSpace 2011. Tentokrát předal Šrakyi (Michal Šrajer, Inmite – znáte z Google akcí) organizační taktovku Filemonovi (Jiří Fabián, JetMinds – znáte z CZPodcast) a jako místo konání byly vybrány Vítkovice v Krkonoších.
Základní prezentace se samozřejmě točily kolem technologií z Java světa (Spring, RPC, Graddle, Git, SQL a noSQL, JSON, Android, XMLs a Relax NG, adorované a zatracované portály, …), ale to co dělalo tuto konferenci originální jsou další témata, která vytvářela velmi inspirativní atmosféru:
  • hands-on přímo od Oraclu – jak správně natočit pivo
  • jak si doma postavit Boeing 737-800
  • programování pro Kinect s využitím Jírových aretačních misek
  • štěstí a spokojenost završené prezentací „Veselá jehlička aneb jak udělat manželku šťastnou“
  • monetizace aplikací pro platformu Android
  • již neodmyslitelná degustace vín z Bílého sklepa
A protože je obrázek často za tisíc slov, hlavní body přednášek si můžete prohlédnout na originálním pohledu Petra Adámka:
Velké díky všem účastníkům za vydařenou akci a především Filemonovi, který akci nejen naplánoval, ale i zasponzoroval.
Fotky z akce najdete ve fotogalerii.

pátek, 25. února 2011

Expanze proměnných – neobjevujte kolo

Možná jste už někdy řešili problém, jak nahradit proměnné jejich hodnotou třeba v konfiguračním souboru. Například ze vstupu

<app-config baseDir="${projectDirectory}">
 <timeout>${timeout}</timeout>
</app-config>
chceme ve výsledku dostat
<app-config baseDir="C:\Projects\MyApp">
 <timeout>30</timeout>
</app-config>

Asi vás napadne využít String.replaceAll(String, String) nebo v lepším případě přímo dvojice Pattern/Matcher a capturing groups. Proč ale znovu vymýšlet kolo, když knihovna Apache Commons Lang (která by mimochodem měla být standardní součástí každého netriviálního projektu) nabízí pro daný problém přesně ty třídy, které potřebujeme. Výchozím bodem je třída StrSubstitutor, která obsahuje i statické metody pro zjednodušení v nejpoužívanějších případech:

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("animal", "dog");
properties.put("legs", new Integer(4));

System.out.println(
    StrSubstitutor.replace("The ${animal} has ${legs} legs.", properties));
//prints: The dog has 4 legs. 

StrSubstitutor zvládá nahrazovat i Java property (standardní i ty zadané jako argumenty JVM)

System.out.println(
    StrSubstitutor.replaceSystemProperties("Your OS is '${os.name}'"));
//prints: Your OS is 'Windows XP'

A nejsme vázáni ani zdrojem hodnot našich proměnných. Například, chceme-li expandovat na proměnné prostředí a property mají syntaxi proměnných ve Windows, není to vůbec složité. Stačí vlastní implementace abstraktní třídy StrLookup:

//Anonymous child of StrLookup class, which
//maps property names to environment variables in the system
public static final StrLookup ENV_VAR_LOOKUP = new StrLookup() {
    @Override public String lookup(final String key) {
        return System.getenv(key);
    }
};

//expands windows-like properties to system environment variables (e.g. %PATH%)
public static String expandBatch(final String textToExpand) {
    final StrSubstitutor batchSubstitutor = new StrSubstitutor(
        ENV_VAR_LOOKUP, "%", "%", StrSubstitutor.DEFAULT_ESCAPE);
    return batchSubstitutor.replace(textToExpand);
}

//used then
System.out.println(
    expandBatch("Windows is installed in '%WINDIR%'."));
//prints: Windows is installed in 'C:\WINNT'.

A připomenutí na závěr – neobjevujte znovu kolo – pro začátek si projděte API ke Commons Lang a nebojte se tuto knihovnu používat.