Vývoj aplikací pro Facebook v Javě – 1

V tomto příspěvku rozeberu postup, jak psát aplikace pro Facebook platformu v jazyce Java. Celý příspěvek jsem rozdělil na několik částí.

Nejdříve tedy krátký úvod, co je to Facebook a proč by vás mohl jakožto vývojáře zajímat.

Úvod

O Facebooku jistě většina z vás již slyšela. Jedná se o další social network projekt, tedy web poskytující vám služby sociální sítě. Více se dočtete více zde nebo zde.

Pokud nejste na Facebooku zaregistrovaní a nevyzkoušeli jste si ho, vřele vám to doporučuju. Facebook totiž není jen „yet another Orkut“ 😉 a osobně si myslím, že Facebook je na dobré cestě, aby porazil všechny ostatní sítě. Uvidíme ještě, jak dopadne snaha o standardizaci API v oblasti social networků, ve které se výrazně angažuje i Google – viz OpenSocial.

Btw. Pokud chcete, můžete si přidat můj kontakt mezi své kontakty – link na můj profil je zde.

Čím je Facebook zajímavý a čím vybočuje z řady? Jednak je to jeho obrovská popularita a raketový nárůst počtu uživatelů. Zaregistrujte se, použijte Friend Finder nástroj a garantuji vám, že budete překvapeni, kdo všechno z vašich známých již na Facebooku je 😉 Pro zajímavost ohledně vývoje popularity, podívejte se třeba na Google Trends graf pro Facebook, Orkut a LinkedIn.

Co Facebook ale výrazně odlišuje od předchůdců jako Orkut je fakt, že Facebook se otevřel pro vývoj dalších aplikací a vznikla tak Facebook platforma.

Přínos

Facebook vám umožňuje relativně jednodušše napsat aplikaci (nebo vzít existující aplikaci) a zaintegrovat jí do Facebooku. Proč byste to měli dělat?

  1. Facebook používá obrovské množství lidí a počet stále roste. Roste tak počet potenciálních uživatelů vaší aplikace (a tedy i vašich příjmů 🙂
  2. Přidat si novou aplikaci ve Facebooku je mnohem snažší než najít a zaregistrovat se na nějakém novém webu. Prvotní bariéra proto, aby uživatel začal používat vaší aplikaci je minimální.
  3. Úspěch a popularita aplikací na Facebooku se šíří virálně. To je další podstatný rys Facebooku. Po přihlášení se do Facebooku se vám šikovně zobrazí stránka s news feedem , kde vidíte co se ve vaší síti děje.

    Např. zaujme, že váš kamarád používá aplikaci, která by vás mohla zajímat též, jste dva kliky od toho, abyste jí začali používat taky. No a virus se začíná šířit ;-]

Pokud tedy vlastníte fungující web, chtěli byste ho dále rozvíjet a získat větší počet uživatelů, neváhal bych a už dneska bych začal pracovat na jeho integraci s Facebookem.

Jako pěkný příklad uvedu Flickr vs. Facebook Photo, služby pro sdílení fotek. Flickr byl donedávna jasnou jedničkou, co se týká sdílení fotek na webu. Nyní jej (v USA) už předstihl Facebook Photos (viz zde). Přitom Facebook Photos je jen základní služba, kterou dostanete pokud se na Facebooku zaregistrujete. Stejně jako možnost používat sdílené kalendáře (Events), inzerci (MarketPlace) atd. Takže tu roste nová konkurence pro Evite.com resp. eBay.com.

Celé je to hrozně jednoduché. Proč bych měl být registrován na tolika webech, když mi to Facebook poskytne všechno pod jednou střechou. Pod jednou střechou ale neznamená, že by Facebook napsal všechny služby znova a vytvořil tak konkurenční služby jako v případě Flickru. Facebook je platforma, která umožňuje vznik a existenci konkurečních projektů a až trh rozhodne 🙂

Pokračování příště…

Takže to by na úvod stačilo. V dalších dílech rozeberu architekturu Facebook aplikací, API které máte možnost použít pro integraci s platformou a tím se dostanu až k Javě, kterou můžete použít jako jednu z možností (kromě PHP, Pythonu, Ruby, C# atd.).

PS: Pokud vás (vývoj pro) Facebook zajímá, ať už z pohledu vývojáře nebo z pohledu spíše podnikatelského, přidejte se do facebookové groupy Czech Facebook User Group.

JGear LiveSource – Namodelujte si své Java EE aplikace!

Na portálu java.cz jsem publikoval recenzi na JGear LiveSource, Eclipse plugin, který je pokračovatelem populárního TogetherJ a je základním kamenem nového JBuilderu 2007:

JGear LiveSource je nový modelovací nástroj firmy CodeGear. LiveSource umožňuje modelování a vizuální návrh Java /Java EE aplikací pomocí modelovacího jazyka UML. Tento produkt je distribuován jako plugin pro vývojové prostředí Eclipse. V tomto příspěvku bych chtěl popsat svoje dojmy a zkušenosti z tohoto produktu.

Celou recenzi naleznete zde:

JGear LiveSource – Namodelujte si své Java EE aplikace! (java.cz)

Zde se můžete podívat na screenshoty.

Web Services Standards Poster

Pokud vás zajímají webové služby (web services), SOA a podobná témata, rozhodně doporučuji pěkný poster s přehledem existujících Web Service standardů (stav 2007):

WS-Standards Poster 2007-02.pdf

který vytvořila a dala k dispozici německá firma innoQ.

Pro zajímavost. Před pár měsíci jsem procházel nové WS standardy a projekty a pro přehledné vyjádření vzájemných souvislostí jsem použil kontextové mapy vytvořené pomocí CMapTools (více zde).

Contextual map Web Services - Metro and Tango
Příklad: kontextová mapa pro projekty Metro a Tango

Eclipse – nefunkční "hot code replace"

Alternativní nadpis tohoto příspěvku by mohl znít „Jak použít Eclipse (java) compiler“ mimo IDE. Tímto jsem asi dost napověděl, o čem budou následující řádky pojednávat.

Remote Debugging

Vzdálené debugování (remote debugging) je užitečný nástroj pro ladění „vzdálených“ aplikací – „vzdálených“ v tom smyslu, že se pomocí svého debuggeru připojujete do jiné běžící Java Virtual Machine nejspíše s úmyslem ladění dané aplikace 😉 Nebudu nosit dříví do lesa: Více si o tomto tématu přečtete například v článku Debugging v praxi – opravdu samozřejmost?! od otce Fura či Eclipse a drobné maličkosti – vzdálené debugování od Dagiho.

Hot Swap

S remote debuggingem souvisí další funkcionalita, která z mé vlastní zkušenosti dokáže ušetřit obrovské množství času. Tato funkcionalita se jmenuje hot swap. Hot swap umožňuje „vpašovat“ do běžící aplikace novou verzi přeloženého kódu a nahradit jí tak kód původní.

Pro lepší představu, proč považuji hot swap za maximálně efektivní pomůcku, uvedu jeden příklad z mé praxe. Pracoval jsem na Ariba projektu, kde restart modulu Ariba aplikace (to jest jedné instance Weblogicu) na které jsem pracoval, trval na laptopu přibližně 9-10 minut (díky tomu, že se inicializovaly různé adaptéry, Tibco repositories, kontrolovala se XML metadata,…).

Součástí typického úkolu na tomto projektu byl vývoj nějakého vysoce sofistikovaného 😉 java kódu, který používá pokud možno public API aplikace a na konci dosáhne kýženého výsledku, za aplausu business consultantů 🙂 V uvedené konfiguraci, kdy jedním restartem ztratíte tolik času, si musíte dávat sakra dobrý pozor na jakékoliv triviální chyby (na netriviální chyby si často pozor dát ani nemůžete, například z toho důvodu, že API není zrovna dobře zdokumentované a až stacktrace při testování vás upozorní na možný problém) 😉

Zde se pomalu dostávám k jádru věci. Hot swap vám v těchto případech velice dobře poslouží: triviální problém – zapomněli jste test na null? Chcete přidat debugovací řádku…? S hrůzou zjistíte že nerovnost v podmínce je přesně obráceně? Bez remote debuggingu (aneb tak jak jsem to viděl kupodivu u velkého množství kolegů konzultantů) musíte shodit server, opravit, překompilovat, zrestartovat a dvacet minut je pryč. Následnovně zjistíte, že o pár řádků dále je problém podobný a tak pořád dokola.

Ti rozumnější (případně ti pracující v módu fixed fee a ne time&material 😀 ) využijí hot swap: kód v IDE jednoduše opravíte, upravíte, přeložíte, a pokud jste debuggerem připojeni do JVM v které běží aplikace, hot swap nahraje novou verzi byte-kódu do JVM a nahradí jí kód původní. V těchto jednoduchých případech vám hot swap nezanedbatelně šetří čas. (Samozřejmě zde existuje mnoho omezení, která když porušíte, debugger zobrazí varování, že daná změna není podporována (změny v hierarchii tříd ale i například přidání public metody atd.) a restartu se stejně nevyhnete).

Hot Swap v Eclipse

Zatímco v Intellij Idee hot swap fungoval bez problémů a intuitivně, po přechodu na Eclipse mi hot code replace (jak se tato feature v eclipsu nazývá) v mnoha případech nefungoval. Po rekompilaci třídy se mi místo očekávaného nahrání nového byte-kódu na server zobrazovalo často následující varování:

Hot code replace failed

Trochu jsem pátral co je příčinou a dopátral jsem se. Na obranu debuggingu v Eclipsu můžu uvést, že je v tom (částečně nevinně).

Scheme change not implemented

Zásadní problém je ten, že Eclipse pro kompilaci nepoužívá sunovský javac, nýbrž svůj kompilátor (součást JDT Core component). Vyprodukovaný byte kód se liší (nezkoumal jsem do detailů jak…) od byte kódu class přeložených javac kompilátorem. Tyto rozdíly jsou pro debugger ale podstatné tak, že neumožní záměnu byte kódu za běhu. Podobný problém viz např. na news.eclipse.tools.jdt: Scheme change not implemented.

(Nutno podotknout, že důvod proč se mi na serveru objevuje kód kompilovaný jiným kompilátorem (javac než z IDE (eclipse compiler), je fakt, že instalace a deployment této aplikaci je poměrně komplikovaný proces a je pro něj přepdřipravena sada nástrojů (Ant skriptů), které je nutné ve správném pořadí použít v závislosti na prováděné změně).

Řešení

Řešení problému spočívá v použití stejného kompilátoru v obou případech.

První možnost je donutit Eclipse kompilovat pomocí javac. To jde podle mě jednoduše pouze pomocí nového ANT builderu a custom Ant scriptu. Což není zrovna elegantní.

Druhá varianta je donutit existující produkt, který obsahuje vlastní „Ant“ build systém, kompilovat pomocí Eclipse kompilátoru.

To jde celkem jednoduše:

  1. stáhnout ecj.jar (JDT Core Batch Compiler)z eclipse.org
  2. donutit Ant použít tento compiler: tzn. nastavit hodnotu Ant property build.compiler na org.eclipse.jdt.core.JDTCompilerAdapter
  3. a nakonec samozřejmě přidat ecj.jar do classpath (tip pro lenochy: nahrát tento jar do adresáře ant/lib)

Tímto donutíme Ant kompilovat pomocí Eclipse kompilátoru a hot swap neboli hot code replace funguje tak jak má. Malá poznámka na konec. Rozhodně bych nedoporučoval měnit použitý compiler na produkčním server, o čem tu pojednávám, je prostředí vývojáře! Více kompilování v Eclipse o možnostech použití vně Eclipse IDE se lze dočíst v online nápovědě: JDT Plug-in Developer Guide > Compiling Java code.

TunnelliJ a Idea plugin API

Nedávno jsem navštívil zajímavou přednášku pořádanou českou Java User Group s názvem Jak psát API, které přežije nástrahy času prezentovanou architektem Netbeans Jardou Tulachem. V rámci přednášky proběhla diskuse o (ne)kompatibilitě IDE pluginů s postupem času (jakožto současný uživatel Eclipsu vím moc dobře, o čem je řeč).

Napadlo mě tedy, že se mrknu jaká je situace v Idee, zda ještě pořád funguje plugin Tunnellij (TCP tunnel integrovaný do IDE), který jsem napsal před pár lety pro verzi Idea 3.5 (jakožto pomůcku pro sniffování SOAP zpráv). Mrknul jsem na stránky Jetbrains a zjistil jsem, že udělali v této oblasti velký kus práce. Nové a pěkně udělané stránky plugin repository, relativně velké množství pluginů (vzhledem k tomu že Idea je komerční IDE).

Takže jsem vzal poslední build Idea verze 7 a zkusil jsem, zda můj Tunnellij (popis) plugin bude i nadále fungovat. Funguje bez problému, takže plugin API v Idee se zda být celkem stabilní, minimálně pro featury které jsem použil. Lehce se změnil a rozšířil plugin XML descriptor, takže jsem doplnil chybějící údaje (vsuvka – na zmiňované přednášce se mi líbilo, že Jarda zdůraznil, že návrh API není jenom o Java kódu a public interfacech, ale týká se mnohem více věcí, od proměnných prostředí OS přes různé deskriptory, konfigurace atd…) a znova rebuildoval celou package a nahrál do plugin centra. Paradoxem je, že tento build Idea pluginu jsem již dělal z Eclipsu 😉

A co mě nakonec příjemně překvapilo je počet downloadů – přes 5700 downloadů je pěkné číslo 😉