sobota 13. září 2014

New York State of Mind - postřehy 2

Chtěl jsem psát každý týden nový článek o tom, co je nového v USA. Bohužel není doma net a v práci musím pracovat, takže až dnes (12.9.2014), kdy už skoro odjíždím domů, jsem našel čas napísat nějaké další postřehy.

Pracovní dny

Pokud je dnešní název dne pondělí, úterý, středa, čtvrtek nebo pátek, tak vstávám mezi 5:15 až 5:30 (a.m.). Zpočátku bylo vstávání v chillu, protože jet lag dělá hodně a chodil jsem brzo spát. Nyní jsem si už zvykl na svoji matraci a.k.a. postel, proto se vstává čím dál tím hůře. Výhodou brzkého vstávání jsou prázdné chodníky a méně aut na silnicích (na těch hlavních tazích je po ránu aut jak normálně v Praze). Brzké vstávání mi dovoluje se zúčastnit konferenčního callu s lidmi z Prahy, proto vstávám brzy. A také chodím domů už někdy okolo 4 odpo.

Kancl máme kousek od Chelsea Market. Chelsea Market je obchodní dům, který obsahuje převážně restaurace a fastfoody. Jednou jsem tam byl v poledne a nebylo místa k hýbání. Od té doby tam nechodím. Co jsem zahlíd, tak jsou tam snad všechny typy jídel, takže každý si něco najde. Ať jsou to italské, thajské, čína, japonsko, usa burgery, mořské plody, květiny, bio jídla, halal vepřové, košér atd.

Restaurací je okolo práce velký dostatek. V prvních dnech jsem si vyzkoušel dost různých restaurací, ať už jsou to burgery, pizzy, mexikáni nebo thajsko. Nakonec jsem se rozhodl chodit na burgery do Corner's Bistro k panu Billovi. Bill je poměrně starý pán menšího vzrůstu (menší než já), vypadá a mluví něco mezi italštinou a hispáncem, a s největší pravděpodobností se nejmenuje Bill. Prostě jsem ho tak pojmenoval jako někteří lidi  pojmenovávají své plyšáky nebo mobily. Nejlepší na té restauraci není ale Bill, nýbrž hamburger. Hambáč stojí USD 9.75 bez daně, daň činí dalších 9% navíc. K tomu samozřejmě připočti povinné "dýško". Ale stojí za to. Má to nejlepší maso, který jsem kdy ochutnal, a nedokážu to popsat vlastními slovy. I ty hranolky k tomu jsou super. Musíte ochutnat. Na Yelpu to má nejlepší hodnocení z okolních restaurací. Hambáč tu mají menší velikost než v ČR a tak se lépe vejde do ruky, ale jsou lepší.

Co se týče známých fastfood řetězců jako McD nebo KFC, těch tu v okolí moc není nebo jsem je neviděl. Vyzkoušel jsem i nějaké méně známé a nic moc. Jmenovitě např. Wendy's, White Hall, T.G.I.F. (i když to není asi fast food, stejně nic moc). Mekáč tu chutná podobně jak v Praze a stojí to jen o trochu víc a navíc se nemusí dávat dýško, takže je to nejlevnější póvl jídlo (junk food).

Kultůra

Možností je tu hodně. Stačí zajít ven a uvidíte takových kultur jako snad nikde na celém světě. Co restaurace, to je jiná jídelní kultůra. Dokonce i česká restaurace tu je, ale jako jediná z restaurací zde mi příliš nechutná.

Pokud se zajímáte spíše o muzea a tak, je také z čeho vybrat. Zatím jsem byl v Museum of Modern Art (MOMA), Transit museum a Jewish Museum. Chci ještě očekovat Metropolitan museum NY a pak Natural Museum.
MOMA - lístek sem stojí $25 a rozhodně za to stojí. Pokud se ještě zajímáte o kreslení nebo grafiku nebo něco podobného, je to zážitek k nezaplacení. Muzeum má 6 pater, k projetí jednoho patra vám tak zabere hoďku času. Hodně je tu originálů od klasiků jako jsou Picassa, Gaugina, van Gogha apod. Pak jsou tu vystavené moderní umění, což jsou kontroverzní díla, u kterých platí "Hate it or love it". Je tu vystaven třeba Salvador Dalí nebo ten americký umělec, co dělá reklamní věci, jehož jméno je známé, ale zapomněl jsem ho. V dalších patrech narazíte například na počítačovou sekci, která mě také nejvíce zaujala. Je tu historie počítačů, pak jsou tu různé staré a známé hry (např. Pacman, Super Mario), nějaké Google věci, hledači min apod. Vše je samozřejmě interaktivní a můžete zkoušet.
Transit museum - toto muzeum není na Manhattanu, ale v Brooklynu. Není to turisticky známé místo, přesto je to také zajímavé. Nenajdete tu žádná díla od známých umělců, ale dozvíte se něco o tom, jak se stavělo metro v NYC. Jsou tu vystavěné také staré vagóny metra a můžete se po nich projít. Lístek stojí jen $7.
Jewish museum - židovské muzeum se nachází kousek od WTC One (ten nejvyšší barák v NYC).  Protože je tu v práci hodně Židu a jeden Žid z vedlejšího kanclu je podle mě dost liberální (má vousy jak Žid, nosí hábit jako židovský Harry Potter a má i pod čepicí), proto jsem šel do tohoto muzea. Také ráno hraje na divný hudební nástroj, který vydává zvuk jako když kvíká děcko, tak jsem chtěl vědět, co to hraje. V muzeu jsem to ale nezjistil, takže je to prostě židovská hymna. Každopádně muzeum je zase poměrně velké, pokud chcete vše pročíst a tak, sebere vám to den. Lístek pro studenty zde stojí jen $7. Muzeum má 3 patra. V prvním patře se dozvíte něco o Židech obecně. Jaké mají zvyky, uvidíte nástroje, se kterými se dělala obřízka, oslava bar mitzvah a.k.a. den dospělosti, hanukkah atd. Také se dovíte, kteří Židi jsou kteří a jaké jsou směry židovství (ortodoxní, socialisti, zionisti a liberální). Prostě je to pohodové patro, který s emocemi moc nepohne. Druhé patro je naopak pravý lolocaust. Ano, je celá věnována holocaustu v Německu, od vzniku až po úpadek. Uvidíte zde vyvěšenou originální vlajku s hakenkreuz, videa z té doby, různé originální vyhlášky, dopisy vězňů a dětí a další věci. Hodně drsné je vyprávění židovských dětí. Musím to zopakovat, že je to pravý lolocaust a místy se to zdá neuvěřitelné, že se něco takového stalo ani ne před 100 lety. Musíte vidět, ani pak to ale nelze pochopit. Třetí patro je již o židovství v současnosti. Jelikož jsem musel vyzvednout věci z prádelny, bylo to rychlé patro a nic mě nezaujalo.
Guggenheimovo museum - toto muzeum je tak známé po celém světě, že má i poměrně kvalitní český popis na wikipedii. Lidi (já) znají spíše ten barák zvenku než co je uvnitř. A opravdu byl ten barák více zajímavý než samotná díla. Přitom v muzeu (nebo spíše galerii) byly vystaveny samé známé obrázky jako od Cezanne, van Gogh nebo Picassa (období před kubismem, kdy kreslil ještě normálně). Vstupné do muzea stojí $ 14 pro studentíky, pro normální lidi $ 16. V ceně je zahrnut i audioprůvodce, což určitě dělá obrazy o mnoho zajímavější. Audioprůvodce je vlastně jedna aplikace, která je nainstalována na iPod Touch.
Bohužel dnes až někdy do října se připravuje výstava, proto byla uzavřena točité schodiště, což je asi nejlepší věc v tomto muzeu, a také tři horní patra. I tak prohlídka 3 zbylých pater mi trvalo asi 3 hodiny, protože jsem si u některých děl pozastavil a poslouchal vyprávění.
Jak jsem zmínil, barák samotný je skvostné architektonické dílo. Byl otevřen někdy v 50.letech min. století na 5th Avenue, což je asi také nejznámější ulice zde v NYC. Podél celé kupole je schodiště, kde by měly být vystavěna díla (dnes nebyly) a je prý zážitek koukat na proudy lidí, jak koukají na díla. Stoupání tohoto schodiště je 3%, takže je vhodné i pro invalidy. Ze střechy jde dolů přirozené světlo, který má osvětlovat celý barák za slunečního dne (dnes pršelo).

Někde jsem četl, že je povinnost zajet do Broadway do divadla. Tak jsem si také koupil lístek na jedno představení. Je to Lion King. Lístek stál cca neuvěřitelných $ 160, a to ještě byl ten levnej. Jo, Broadway je drahé místo. Kupodivu kdybych si lístek nekoupil, nemusel bych ho už sehnat. Je poměrně rychle vyprodáno a kupoval jsem to tak přes 14 dní předem, abyh měl za tuhle cenu požadované místo. Například u těch nejlepších her, kde účinkuje Jack Hughman a.k.a. Wolverine, ceny začínají od $ 200 výše a lístek si kupujete tak měsíc předem. Drahá záležitost, report o divadlu napíšu, až to uvidím.

Také jsem asi 4x byl v kině. Kina tu jsou stejná jak v ČR, akorát trochu víc kin a filmy jsou i novější. Lístek stojí v multikině za $ 15, v menším kině v Brooklynu jsem dal okolo $ 10. Stejně jako multikina v ČR tu na lístku nejsou místenky a míst je vždycky dost (jednou jsme byli okolo 10 lidí v celém sále). Také jsou tu k dispozici pítka, takže si nemusíte kupovat pití před představením. A do kina lze brát i jídlo zvenčí, kontrolor lístku mi jednou zkontroloval i batoh a měl jsem tam jídlo a pohoda.

pátek 12. září 2014

New York Empire State - nějaké postřehy

Big Apple, New York City, město, které nikdy nespí atd. New York patří mezi ty největší, ve kterých jsem kdy byl (větší byly asi jen Peking, Shanghai a Seoul). Je to však město s nejvíce mrakodrapy a možná i nejvíce multikulturní, které jsem kdy viděl. Sydney sice bylo také hodně multikulturní, ale např. moc lidí z negroidní rasy jsem tam neviděl.

Důvody odjezdu
Protože v současnosti pracuji v americké firmě se sídlem v NYC, tak jsem se rozhodl sem jet. Také je to jedna z míst, kam bych se tak či tak chtěl podívat v budoucnu. Navíc jsem chtěl někam jet na dovolenou.

Přípravy
Před samotným odletem jsem si připravil několik věcí. Jako první je nutné koupit si letenku. Našel jsem nějakou za 18k Kč, letí se z Prahy časně ráno (6:45am) a dorazí se do NYC ten samej den v 11:50am (časový posun -6 hodin GMT). Všetko to bylo přes pelikan.cz. Co jim tam špatně fungovalo, byl zadávání API (Advanced Passengers Info). Musel jsem jim volat na centrálu a stejně informace tam zadali špatně. Nakonec ty info nebyly ani potřeba, ale to zjistíte až na letišti, na netu je napsáno opak.
Dále jsem si rezervoval místo bydlení přes Airbnb. Protože jsem chtěl bydlet přímo na Manhattanu někde blízko k práci (max. 45 min pěšky), tak jsem si našel místo v Chinatown. Bydlení není úplně nejlevnější. Protože jsme jeli 2 lidi, chtěli jsme byt nebo pokoj s 2 posteli a toto nejlevnější apartmá nás vyšlo na 36k Kč na osobu na měsíc.
Jako poslední krok jsem si zařídil ESTA (něco jak vízum). Oproti vízu je to jednodušší v tom, že je to v podstatě nákup přes eshop. Na jejich webu si vyplníte nějaké údaje o sobě, zaplatíte $14 a je to hned hotové.
Nejsložitější část z celé přípravy byl najít ten správný byt na správném místě za správnou cenu. Sice je k dispozici hodně bytů, ale ceny buď začínají od 5k USD výše za měsíc nebo jsou velmi daleko od centra, což by se také nevyplatilo, zvláště pokud jste turisté.

Přílet
Let byl poměrně standardní, letadlo od Delta Airlines nic moc, jídlo bylo v pohodě. Po příletu se prochází imigrační branou, kde se imigrační policajt vás zeptá na to, co je účelem vaší cesty, přejde bio pasem přes stroj, který o vás ví vše, sejme otisky prstů a fotku, a můžete jít. Celý to trvá tak 3 min.

První kroky
Letiště JFK je poměrně daleko od města. Naštěstí je tu přímé spojení s metrem, který funguje také dobře. Co vás v metru na první sestup zarazí, je hic ve stanicích. Stanice jsou na rozdíl od těch českých poměrně blízko u země, a tak tam není chládek z podzemí, ale hic z nadzemí. Lístek tu také nestojí extrémní prachy (např. v Austrálii jsem platil $17 jen z cestu z letiště k nejbližšímu MHD), ale jen $5 od letiště k MHD a pak dalších asi $2,5 do města. Cesta je poměrně dlouhá, takže jít pěšky místo toho je nepředstavitelné. Metro vypadá hůře než v Praze a má trochu divnou vůni, ale není to nic hrozného. Zajímavé bylo to, že vlak v některých částech tunelu poměrně dlouho zastavoval. Takže cesta, která by asi trvala tak 35 min pražským tempem, se nakonec protáhlo na 55 min.
Naše první kroky ve městě vedli přímo do našeho kanclu někde na Manhattanu. Pro představu, kanclík asi 2,5x2,5m tu asi stojí $1900 USD (ta kóje vedle našeho kanclu, kterou jsme však nechtěli). Náš kancl je o trochu větší, ale taky nic super. 3 lidi se sem vejdou, ale that's it. V kanclu jsme si vyzvedli doláče (miliony doláčů a nějaké ty šeky a diamanty) a klíče k novému bytu a šli jsme domů. MHD z kanclu do bytu trvá asi 20 min.
Byt je poměrně malé, pokoje obsahují postel nebo spíše matrace a stůl a to je tak vše. Z okna je slyšet permanentní hučení ve stylu Niagara, takže přes noc se musí spát se zavřeným oknem. Občas tam lítaj komáři, ale to jsem zabil stylem spreje proti komárům. Matrace jsou nic moc, jeden je tvrdý a na druhém je cítit každá pružina. Kromě ložnic je tam i obývák, kuchyňka a WC a sprchový kout, všechno však v malém provedení, takže celkově je byt tak pro 2 lidi.

Chinatown
Ten je tu poměrně veliký. Někde jsem i čet, že je to největší chinatown mimo Čínu na světě, žijí tu až 150000 Asijců. Rychle jsem tam tedy zapad. Silnice a ulice tam opravdu trochu připomíná Čínu či Vietnam, ať už jsou to pouliční prodavači, odpadky po zemi, smrad a nebo zavěšená mrtvá zvířátka za vitrínou restaurací. Jako první restauraci jsme taky nemohli vyzkoušet nic jiného než nějakou tu čínu. Dal jsem si hned 3-chodové menu (dimsum, rýži s hovězí a nějaké almond tofu dezert) a celkově to vyšlo na 40 doláčů.

Dýška v USA
Když už povídám o restauracích, je dobré zmínit o jejích cenách. Začnu dýšky. Dýška se tu dává od 10 - 20% (můj šéf dává 20%, pokud je to extrémně špatné, tak 10%). A proč je tomu tak? Je psáno v jedné knize a také mi to říkal kolega, že číšníci i číšnice tu dostávají extrémně nízký základní plat a zbytek mají jen z dýšek (např. jen $1,5 za hodinu). Také (nebo spíše díky tomu?) se o hodně více snaží než v českých restauracích. Jsou milí, při jídle se chodí ujistit (někdy i několikrát), zda máte vše v pořádku atd.

Ceny v USA
Další věc, která může zahýbat s cenou, jsou daně. Daně jsou pro každý stát různé, proto jsou všechny ceny uvedené bez daní. Takže v restauraci, pokud narazíte na jídlo za $10, musíte si připočíst ještě asi 9% zde v NYC. A to platí nejen v restauracích, ale všude, dokonce i na internetu. Chtěl jsem si koupit MacBooka za 1800 USD, ale pak jsem zjistil, že to stojí 2000 USD s daní. Nuff said.

MHD v USA
MHD jsem příliš v USA nepoužil. Příjemná je cena jízdenky z letiště do centra, vyjde to tak na 7,5 USD se vším všudy. V NYC je také druhé nejstarší metro v USA (za Boston), je však jediný na světě, který jezdí nonstop (24/7 365 dní). Linek je tu taky mrtě, takže se dostanete skoro všude metrem. Kromě MHD tu také jezdí busy, ale s tím jsem zatím nejel.
Posledním MHD je ferry a.k.a. velká loď. Ta převáží lidi z Manhattanu na Staten Island (čtvrť NYC). Je to poměrně veliká loďka o čtyřech patrech, která převáží kromě lidí i třeba i auta. Co je super, je její cena. Jako jediná jezdí zdarma  intervalu po 30 min denně. Z tohoto ferry je super výhled na Manhattan a mrakodrapy, hlavně na nové WTC barák (3.nejvyšší na světě), pak také lze vidět sochu svobody a nějaké ty lodě.


neděle 12. ledna 2014

Grails 2.3 a IntelliJ debug breakpointy nefungují

Pokud vyvíjíte Grails 2.3 v IntelliJ IDEA 12.6 (a možná i jiné verze), může se vám stát, že přestane fungovat debugování a aplikace se nezastaví při breakpointu. Problém je kvůli nové vychytávky (feature) forked mode, kdy spouštíte aplikaci v samostatném JVM a tato aplikace má vlastní proces. To má samozřejmě výhody jako vlastní nastavení parametrů tohoto JVM nebo při problémech se ukončí jen jeden konkrétní JVM (více na SO). To ale také způsobí, že IntelliJ v defaultním nastavení neumožní breakpointy v kódu. Řešení je několik, já jsem to vyřešil tak, že jsem vypnul forked mode :)

grails.project.fork = [
    testfalse,
    runfalse
]

Pro více informací a jiné způsoby řešení se koukněte na jeden blog, kde jsem řešení zjistil i já.

čtvrtek 14. listopadu 2013

Google Analytics API s Grails

Dělám teď na aplikaci, kde chci získat data z Google Analytics jako počet návštěvníků nebo statistiku nejnavštěvovanějších URL. Protože už jsem něco zkoušel s API od Google jako mapy, platby nebo grafy, tak si říkám, že to nemůže být tak těžké. Omyl. Bylo to docela komplikované to správně rozběhnout v Grails.

Konkrétně jsem potřeboval rozběhnout Reporting API (v3). Na Google mají návod, jak udělat "Hello World" pro tohle API. S největším problémem jsem se setkal už na začátku při získávání těch správných knihoven a jejich závislostí. Google samozřejmě má pro tohle zase jiný návod, kde je napsaný asi bambilion potřebných knihoven, kdybych to měl stahovat postupně. To se samozřejmě dnes už nedělá, ale používá se Maven nebo podobný buidovací nástroj (pro Grails je to Apache Ivy). Funguje to hodně podobně jako Maven, jen má jinou syntaxi, takže se lze řídit návodem pro Maven. Google vás zase odkáže na další stránku s návodem, tentokrát i s ukázkovou aplikací pro Javu s pom.xml (Maven soubor).

Po rozbalení ukázkové aplikace v souboru pom.xml zjistíte, že jsou potřeba tyto knihovny:

      <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-analytics</artifactId>
      <version>v3-rev74-1.17.0-rc</version>
    </dependency>
    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client-jackson2</artifactId>
      <version>${project.http.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.oauth-client</groupId>
      <artifactId>google-oauth-client-jetty</artifactId>
      <version>${project.oauth.version}</version>
    </dependency>

Knihovna oauth-client je potřeba, jen pokud potřebujete, aby aplikace mohla žádat uživatele o přístup k jejich Google Analytics (něco jako Facebook přihlášení). To jsem ale nepotřeboval, protože chci získat data jen z vlastní Analytics, takže stačí 2 knihovny + klíčový soubor. Převedeno do Grails pro soubor BuildConfig.groovy, tak je to něco takového:

dependencies {
    def googleLibVersion = "1.17.0-rc"
    compile("com.google.apis:google-api-services-analytics:v3-rev74-${googleLibVersion}")
    compile("com.google.http-client:google-http-client-jackson2:${googleLibVersion}")
}

Jenže tohle nejde zkompilovat, chyba je následující:

:: commons-codec#commons-codec;1.6: configuration not found in commons-codec#commons-codec;1.6: 'master'. It was required from org.apache.httpcomponents#httpclient;4.0.1 compile

Po chvíli googlování (žádné řešení jsem nenašel), tak jsem to změnil na tohle:

def googleLibVersion = "1.17.0-rc"
build("com.google.apis:google-api-services-analytics:v3-rev74-${googleLibVersion}")
build("com.google.http-client:google-http-client-jackson2:${googleLibVersion}")

Následně jsem jen postupoval podle návodu od Google (triviální) a napsal jsem i nějaké testy, vše funguje tak, jak má. Když jsem ale zkompiloval aplikaci do .WAR a nasadil na produkční server, tak se aplikace nespustila a v logu byla chyba:

Caused by: java.lang.NoClassDefFoundError: com.google.api.client.json.jackson2.JacksonFactory

Z toho bylo jasné, že nejspíš chybí nějaká knihovna z Analytics, protože nic jiného od Google zatím nepoužívám. Zjistil jsem, že chyba je při změně z scope compile na build. Po přečtení odpovědi ze StackOverflow vyplynulo následující:

build - knihovna je k dispozici jen při buildování aplikace a není k dispozici při běhu
runtime - opak build - knihovna je k dispozici jen při běhu, ale není k dispozici při buildování (např. různé implementace JDBC pro konkrétní databáze).
compile - knihovna je k dispozici jak při buidování, tak i při běhu

Musel jsem tedy změnit scope na compile, jinak to nejde. Chybu s commons-codec jsem pak vyřešil pomocí příkazu grails dependency-report, který vám umožní vygenerovat si graf závislostí a případných konfliktů. Zjistil jsem, že commons-codec je už standardně v Grails, a je tedy potřeba zakázat Google, aby stahoval znova tuto knihovnu. Toho lze dosáhnout následujícím způsobem:

        def googleLibVersion = "1.17.0-rc"
        compile("com.google.apis:google-api-services-analytics:v3-rev74-${googleLibVersion}") {
            excludes "commons-codec"
        }
        compile("com.google.http-client:google-http-client-jackson2:${googleLibVersion}") {
            excludes "commons-codec"
        }

A tohle už funguje správně.

TL;DR:
Pokud chcete použít Google Analytics Reporting API (v3), potřebujete knihovny. Zkopčete si následující řádky do BuildConfig.groovy:

dependencies {
        def googleLibVersion = "1.17.0-rc"
        compile("com.google.apis:google-api-services-analytics:v3-rev74-${googleLibVersion}") {
            excludes "commons-codec"
        }
        compile("com.google.http-client:google-http-client-jackson2:${googleLibVersion}") {
            excludes "commons-codec"
        }
}

sobota 28. září 2013

Grails - Spring Security Facebook plugin

Dnes se mi konečně podařilo úspěšně implementovat serverové přihlašování pomocí Facebooku s pluginem Facebook Authentication for Spring Security. Kdysi jsem to zkoušel a tehdy jsem některé věci nevěděl, tak jsem to radši vyřešil klientským přihlašováním pomocí JS. Dokumentace se mi zdá zbytečně komplikovaná a v některých bodech nedostatečná, tak zde stručně popíši, jak jsem postupoval.

1) Je nutné mít vytvořenou aplikaci na Facebook Developers. Zde jsem nevěděl, co zadat do pole Přihlašování pomocí Facebooku - URL stránky (na toto URL pak Fb přesměruje uživatele, pokud bude úspěšně autentizován). Nakonec jsem zjistil, že to je jedno, protože autentizace probíhá pomocí filtrů. Dal jsem tam homepage - http://www.mujhomepage.cz
Pokud ještě nevíte, tak nelze zadat při vytvoření aplikace na Fb do polí s URL adresu localhost něco. Proto pro testování musíme upravit soubor hosts, který je součástí OS, a přidat tam fake URL (více o tomhle UTFG).

2) Instalace pluginu pro Grails. 
Při tomhle jsem se setkal s problémem, že při každém spuštění aplikace Spring Security chtěl aktualizovat na jinou verzi a pokud jsem dal aktualizovat, tak se to aktualizovalo, ale pak při dalším spuštění chtělo zase aktulizovat zpátky (takže nekonečný loop). Jádro problému bylo nakonec v tom, že Spring Security instaluji do application.properties (starý a deprecated způsob) a Facebook plugin mám definovaný v BuildConfig.groovy (nový a správný způsob). Stačí všechny pluginy definovat v BuildConfig.groovy a problém je vyřešen.

3) Spustit v Grails console tento příkaz: grails s2-init-facebook
Vytvoří za vás doménu FacebookUser, který je propojený s vaším User doménovou třídou. Také přidá pár řádků do Config.groovy. Případně vše můžete provést manuálně, viz dokumentace.
Pak ještě je potřeba doplnit do konfigurace app ID a secret ID.

4) Nastavit grails.serverUrl v Config.groovy
Tento krok jsem minule vynechal, proto mi nefungovala aplikace. Defaultně grails.serverUrl není nastaven pro development prostředí, a proto při přihlášení pomocí Fb aplikace přesměruje na odkaz localhost, proto přihlašování nefunguje. Stačí tu nastavit něco takového:
grails.serverURL = "http://www.mujhomepage.cz:8080"

5) Přidat tlačítko na přihlašování
Viz dokumentace část 3.

6) Získání detailů o uživateli
Po přihlašování často chci získat informace o uživateli jako uživ. jméno, email, avatar apod. Facebook plugin nám vrací jen token. Minule jsem to udělal tak, že jsem si napsal vlastní service třídu, připojil na Graph API a získal další informace pomocí vráceného tokenu. Pak jsem ale našel správnou odpověď na StackOverflow


sobota 10. srpna 2013

Haruki Murakami - 1Q84 (1. a 2. kniha)

Nevím, jak je to možné, ale čím víc knih od něj čtu, tím se mi zdají lepší. Začal jsem v tomto sledu: Sputnik, má láska -> Kafka na pobřeží -> Konec světa & Hard-boiled wonderland -> Norské dřevo -> 1Q84.
Poslední knihou, kterou jsem dočet od něj, je tedy 1Q84, tak zkusím napsat nějaké věci, které mě zaujaly v knize.

Český překlad obsahuje zatím jen 2 části ze 3, poslední by měla vyjít na podzim 2013. To jsem nevěděl, dokud jsem knihu nedočetl a nekoukl se na net. Hodně otázek zůstala nezodpovězená, což ale není nic neobvyklého u Murakamiho. Od začátku sledujeme příběhy 2 lidí - muže a ženy.
Muž se jménem Tengo je rádoby spisovatel a učitel matematiky na škole. Jeho život se změní, když se mu dostane do rukou soutěžní dílo s názvem Kukly ze vzduchu. Protože je dílo napsáno velmi jednoduchým stylem, rozhodne se Tengo spolu s jeho šéfem Komacu, že to Tengo upraví a pak pošlou upravené dílo do soutěže. Přitom budou předstírat, že to vše napsala sama autorka Fukaeri, a oni tak zůstanou v naprosté anonymitě. Dílo vyhrálo první cenu, ale také od té doby se začaly dít divné věci, které se vymyká chápání Tenga.
Žena se jmenuje Aomame a její oficiální prací je sportovní trenérka, ale ve skutečnosti je profesionální vražedkyní. Vždy však popravuje jen muže, které nenávidí ženy (násilníky a úchyly). Jednoho dne si však všimne, že svět okolo ní už není to, co bývalo. Zlom nastává ve chvíli, kdy potká znásilněnou 10-letou dívku, a dostane za úkol zavraždit jejího násilníka. Netuší však, že násilník je tzv. Lídr náboženské skupiny Předvoj, o které se nic neví.

Příběhy se střídají po kapitolách. Zpočátku to vypadá, že vůbec s sebou nesouvisí, ale samozřejmě na konci knihy se jejich osudy protnou. Stejný styl prolínání 2 příběhů, kdy se příběhy střídaly po kapitole, už použil Murakami v Konec světa. Nechápu, jak dokáže ukončit každou kapitolu tak napínavě, že mě vždy naštvalo, když jsem musel přečíst další kapitolu o té druhé postavě. Také se mi líbí, že postavy jsou si podobní v mnoha maličkostech. Např. nejčastěji zmíněná skladba Sinfonietta od Janáčka zní na začátku knihy, když holka jede v autě, pak si ji ještě několikrát pustí doma. Stejnou skladbu hrál chlap na střední škole na činely.

Celá kniha provází velmi pochmurná atmosféra. Oba postavy působí a také jsou velice osamělí, i když žijí ve velkoměstě Tokio. I přesto, že spolu nikdy nemluvili, a jen se drželi za ruce asi 10 vteřin na základní škole, jsou do sebe zamilovaní. Toto zamilování (nebo spíše vzpomínka na sebe, protože se 20 let neviděli) je to, co je drží na živu. I přesto si tuto zamilovanost uvědomili až na konci 2.knihy a chlap začal holku hledat, aby ji nenašel. Holka chlapa viděla z balkóna, a když se po dlouhém váhání rozhodne vyjít k němu z baráku, on už byl pryč.

Tato kniha patří k jedné z nejvíce fantasy knih od něj. Je tu koncept 2 světů - rok 1984 a rok 1Q84. Tyto světy jsou odlišné v maličkostech (např. některé události, které se staly), ale třeba i v počtu měsíců, kdy 1Q84 má 2 měsíce. Ve knize se objevují tzv. Little people, což jsou něco, co uvádí svět do pohybu svými činy, které nejsou ani zlé, ani dobré. Nechybí tu ani telekineze u jednoho z postav. Pak jsou tu kukly, ve kterých se ukrývají daughter, což jsou jakési stíny lidí, které slouží jako vchod do tohoto světa pro Little people.

Jako vždy se tu vyskytují odkazy na různé filmy a hudby a knihy. Překvapivě nejčastější je česká klasika Sinfonietta od Janáčka. Pak si pamatuji ještě song It's Only a Paper Moon. Z filmů je tu Případ Thomase Crowna. Nesmějí chybět ani úryvky z knih (jak by řek XZibit: kniha v knize). Tengo čte Fukaeri část knihy od Antona Pavloviče Čechova s názvem Sachalin; Ze Sibiře. Pak v jiné části knihy Fukaeri cituje asi 10 min část z japonské knihy Příběh rodu Taira.

úterý 4. června 2013

Základy Javy - overriding a overloading

Přetěžování (overload) a překrývání (override) metody asi zná každej, co se kdy učil Javu. Otázkou je, jak dobře. Nedávno jsem si myslel, že to docela znám, ale ne-e. Popíšu jednoduchý problém.

Jaký je výstup následující metody?:

public static void main(String [] args) {
Object o = new A();
A a1 = new A();
A a2 = new B();
B b = new B();
a2.report(a1);
a2.report(b);
b.report(o);
b.report(a2);
}

Třídy A a B jsou definovány takto:


class A {
public void report(Object o) {
System.out.println("Object");
}
public void report(A a) {
System.out.println("A");
}
}


class B extends A {
public void report(A a) {
System.out.println("A again");
}
public void report(B b) {
System.out.println("B");
}
}


Pokud se vám to zdá easy, tak to ještě zkuste rozběhnout v nějakém IDE nebo pomocí příkaz. řádky. Jestli máte správně i odpovědi, tak jste v chillu a dále nemusíte číst.

Moje trochu zmateně formulovaná teorie

Přetěžování metod
Přetěžování metod je technika, kdy v jedné třídě se vyskytují metody se stejným jménem a odlišným počtem a/nebo typem argumentů. Ve skutečnosti to jsou zcela odlišné metody, jen mají stejné jméno.

Důležitější je ale, kdy se určí, která metoda je ta pravá? Odpověď je při psaná kódu podle argumentů metod (statická analýza kódu). Pokud existují více metod, které mají argumenty stejného a nadřazeného typu jako předávaný objekt, tak přednost má ta metoda, která je hierarchicky nejblíže tomuto předávanému objektu.

Překrytí metod
Překrytí metod je technika, kdy potomek znovu definuje metodu, která již existuje v předku. To znamená, že překrývající metoda v potomkovi má stejné jméno i počet a typ argumentů  jako metoda předka a vracející typ metody musí být buď stejného nebo podřazeného typu (např. pokud rodičovská metoda vrací Object, potomek může vracet i String).

Metoda, která se zavolá při překrytí, je určena až za běhu programu (late binding) podle typu objektu, na kterém je volána.

Řešení předchozího příkladu

Nyní zkusím aplikovat teorie na předchozím příkladu. Začnu postupně:

a) a2.report(a1);
Je jasné, že prvně probíhá psaní kódu (tedy statická analýza), až pak je běh napsaného kódu :) To tedy znamená, že prvně se uvažuje o přetěžování, poté o překrývání. Začnu od statické analýzy. Argument a1 je zde typu A. Objekt a2 při psaní kódu je také typu A. Třída B má přetěžovanou metodu report(). Protože je argument a1 typu A, prozatím se zavolá metoda report(A a).
Nyní nastupuje fáze běhu programu a překrytí metod. Za běhu je a1 pořád typu A, ale a2 je již typu B! Tudíž se stane to, že přednost dostane překrytá metoda ve třídě B. Metoda report(A a) ve třídě A má překrytou metodu ve třídě B, proto je výstup "A again".

b) a2.report(b);
Při psaní kódu jsou objekty a2 typu A a b typu B. Metoda report, která je volána na objektu a2, je přetěžovaná ve třídě A. Zde má přednost přetěžovaná metoda report(A a), protože je hierarchicky blíže objektu b než druhá metoda report(Objet o).
Při běhu programu nastupuje překrývání metod. Za běhu objekt b je pořád třídy B, ale a2 odkazuje na objekt třídy B. Třída B má metodu report(A a), která překryje stejnou metodu z rodičovské třídy A. Ošidný může být přítomnost metody report(B b) ve třídě B. Pokud si ale uvědomíme, že tato metoda je přetěžovanou metodou a přetížení metod probíhá za psaní kódu, tak je jasné, že je to jen trik pro zmatení studentů :) Proto je výstupem "A again".

c) b.report(o);
Při psaní kódu jsou objekty b typu B a objekt o typu Object. Jedním z vlastností dědičnosti je ten, že public a protected metody rodičů jsou děděny a tedy dostupné i pro potomky. Z tohoto důvodu má třída B ne 2, ale 4 různé metody report(). Nejvhodnější je v tomto případě metoda report(Object o).
Při běhu programu je objekt b pořád typu B, tedy nedochází k žádnému překrytí metod. Výstup je "Object".

d) b.report(a2);
Při psaní kódu jsou objekty b typu B a objekt a2 typu A. Třída B definuje vlastní metodu report(A a), proto se použije tato metoda.
Při běhu programu je a2 objektem třídy B. Jak jsme si ale řekli, při běhu dochází jen k překrytí metod. A protože je objekt b pořád objektem třídy B, k žádnému překrytí nedochází. Výstupem je tedy "A again".

Dynamické jazyky alà Groovy

Četl u Groovy, že typ objektu je přiřazen objektu až za běhu. Byl jsem tedy zvědav, co tento kód vypíše v Groovy. Výstupem je toto:

A again
B
A again
B

Protože je typ objektu přiřazen až za běhu, k přetížení i k překrytí metod dochází také za běhu! Co může být trochu zmatené u Groovy je fakt, že povoluje napsat stejný kód jako v Javě, tedy i s definicí typu jako:

A a1 = new A();

Přitom je to stejné, jako kdybyste napsali:

def a1 = new A();

Co si ještě matně pamatuji je fakt, že v Groovy volání metody toto volání nejde přímo k metodě, ale přes něco jako filtr (zapomněl jsem tu třídu), která až pak podle typu argumentů vybere tu správnou metodu. Vše probíhá za běhu, z tohoto důvodu je výstup takový, jaký je. Nevýhodou je rychlost, výhodou je, že můžete přidávat metody a parametry do tříd za běhu a vytvářet takové věci jako elegantně vypadající DSL (nemyslím internet, ale Domain-specific language).
Ve Groovy od verze 2 je možné přidávat anotace jako @CompileStatic, které dynamické vlastnosti zruší, tím se vše zrychlí. Nemám to ale vyzkoušené, jen jsem to četl zběžně.