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 = [
test: false,
run: false
]
Pro více informací a jiné způsoby řešení se koukněte na jeden blog, kde jsem řešení zjistil i já.
Blog určený spíše pro osobní použití. Zaznamenávám sem problémy, se kterými se potýkám v práci a které mi trvaly trošku déle, než jsem je vyřešil. Tak abych příště dělal rychleji :) Nyní také o Austrálii.
neděle 12. ledna 2014
č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.
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?:
Třídy A a B jsou definovány takto:
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.
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.
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".
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ě.
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í metodPř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
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ě.
pondělí 25. března 2013
Spontaneous update from AU
This post was updated throughout March. Brisbane is now more or less like my home, so I don't have much new stuff to talk about, as everything was said and done before. Nevertheless, here are some new stories:
On Friday (9.3.) was the regular dinner meeting of the Christianity club. But this time it was more special. At first, we had dinner as usual. Then we played games, some of them were really funny. Afterwards people started to sing worship songs. I've never seen this before. I always thought that it's something boring, but the people really rocks! Two of them were rocking on the guitar and one girl was playing piano. And everybody sings (me too, but just a little bit, because I don't believe in God :D). Really interesting experience.
Next day on Saturday (10.3.) I played my first football match at the UQ 7-a-side tournament with the team I joined recently. We won 3-1 (one own goal from their team)! I didn't score because I was playing the defender, but maybe next time. The match lasted 40 min with 5 min break in the middle. The only thing that was bad was mud everywhere.. The mud also smelled like (cow?) shit, so after the match I also smelled like (horse?) shit.
Gold Coast
I've been here over 1 month and I haven't been to the sea yet. To fix that, I decided to go to Gold Coast on 17th March. Gold Coast is (according to Wiki) the biggest non-capital city in Australia.
Me & my friend transfered from Brisbane to Gold Coast by train. There's a train leaving from Roma Central Station quite frequent. After 45 min the train arrives to Gold Coast suburb (or sth like this). From there it's neccessary to take 30 min bus to get to the city, particularly to Surfers Paradise. Public transport can be paid by the go card, which is the one used in Brisbane. It costs me around 5$ from my place (St.Lucia) Surfers Paradise with my green go card. But if you have more than 10 travels in the week, than you can travel for free the rest of the week.
Gold Coast is a long city streatching along the coast. The main tourist point is definitely Surfers Paradise. As the name indicates, it's a paradise for surfing. So I thought that this place would be crowded with surfers and therefore dangerous to swim, but suprisingly there weren't so many surfers and the place was full of swimmers. The weather was f***in' hot and sunny (must be like 30 something), so I went to the sea. The waves were really good and around 2m high, so it was ideal for jumping around. At noon I lay down on the white sandy beach under the palm trees and had a little siesta. What more can you ask for?
The beach is really clean and covers with white and black sands. The sea itself is crystal clear and little wavy for swimming, but not to much to have fun. The city itself is very touristic, there are millions of skyscrapers everywhere, among them the highest skyscraper in Australia. And there's a McDonald's close to Surfer's Paradise, which means ice cream for 30 cents (the only thing here that's cheaper than in Czech Republic).
Rocky Horror Picture Show (RHPS)
I read about this show in The perks of being a wallflower, but otherwise I didn't know anything about it. At first, I thought is a theather performance. No, it's an old musical movie. Then I saw on Facebook that this performance will be at our university theather. So I attend it without any hesitation.
The ticket costs 10$ for UQ students and it includes 1 movie and the RHPS. The first movie was called Startrucks. There wasn't many people attending this movie. I watched it for 20 min, then I realize I didn't understand anything, so me and my friend got out and I ordered a pizza for dinner :)
The RHPS started around 20:30. At 20:00, there were a bunch of people waiting in front of the theather. We noticed that some of them were wearing really weird clothes - one guy came in a nightdress and underwear, the other was dressed as a woman prostitute etc. We thought that they were performers, but they weren't.
The show consisted of the movie itself on the screen and artists lip-syncing some parts of it. These parts were mostly the singing parts, performers were wearing exactly the same dress as in the movie and acted accordingly to what was going on on the screen. The other interesting part was that the audience screaming all the time, making jokes and saying nonsenses (probably because I didn't understand them). At first I thought they were drunk, but at the end I found out it was a part of the show :D At one scene some people from the audience started to spray water from water pistols on everyone, and during the other scene the whole theather stood up and danced. Crazy :D
I really like the songs from the movie, but unfortunately I didn't understand anything :) The sound was not that loud, then the continuous screaming and yelling from the audience didn't help to make it better. But that's how it goes, I should have watched it before at home. Well, maybe next time...
Study
Programming in the Large - this course exceeds my expectations. I expect easy-peasy subject when I'd spent max. 30 min every week doing homework. But the first assigment surprised me. It's harder than I expected :D The reason is that it contains stuff from probability and I don't remember them, like conditional probability... And the instructions for the assignments are little bit hazy, even the tutors don't know exactly what we have to do. So I spent couple of hours reading the instructions and comments again and again and now I think I finally understand it, I've written some codes and almost got the basics done. But still it will take me a couple of hours more... Damn!
Introduction to Web Design - again, the first assignment is not easy. We have to write a documentation about our personal web page, including things like persona, wireframes, discussing about target audiences etc. And I'm still confuse about what to write and how to write it.
Human-Computer Interaction (HCI) - Until now I've lost 1 point from 8, so it's ok. Tomorrow (27.3.) I'm going to miss 1 tutorial as I'm in Melbourne, so I'll probably lose 4 points more. It's bad, but I'm an exchange student, so it happens :D We also have to write an essay about a given topic, but there's still plenty of time for it.
Web Information Systems (WIS) - chill, but lengthy. I didn't know a thing about PHP, but the assignment was pretty easy (login, logging, timer and auto-logoff), so I haven't lost a point yet. The next assignment will be about JSP and I have some XPs with it already, so it should be quicker.
It might seems that study here is very easy :) I can ensure you that's not as easy as it seems. Overall, the subjects I mentioned are not easy at all for everybody. I picked them because I have some XP with programming and I've worked before, but if you come from VŠE FIS (my school) and have no interest in programming and had only the programming subjects at school, they might be a problem for you. Especially WIS course is pretty comprehensive and during the semester you have to learn PHP, JSP and JavaScript. Also the Programming in the Large expect you have taken a Python programming course and many examples are based on algorithm and maths and statistics.
On Friday (9.3.) was the regular dinner meeting of the Christianity club. But this time it was more special. At first, we had dinner as usual. Then we played games, some of them were really funny. Afterwards people started to sing worship songs. I've never seen this before. I always thought that it's something boring, but the people really rocks! Two of them were rocking on the guitar and one girl was playing piano. And everybody sings (me too, but just a little bit, because I don't believe in God :D). Really interesting experience.
Next day on Saturday (10.3.) I played my first football match at the UQ 7-a-side tournament with the team I joined recently. We won 3-1 (one own goal from their team)! I didn't score because I was playing the defender, but maybe next time. The match lasted 40 min with 5 min break in the middle. The only thing that was bad was mud everywhere.. The mud also smelled like (cow?) shit, so after the match I also smelled like (horse?) shit.
Gold Coast
I've been here over 1 month and I haven't been to the sea yet. To fix that, I decided to go to Gold Coast on 17th March. Gold Coast is (according to Wiki) the biggest non-capital city in Australia.
Me & my friend transfered from Brisbane to Gold Coast by train. There's a train leaving from Roma Central Station quite frequent. After 45 min the train arrives to Gold Coast suburb (or sth like this). From there it's neccessary to take 30 min bus to get to the city, particularly to Surfers Paradise. Public transport can be paid by the go card, which is the one used in Brisbane. It costs me around 5$ from my place (St.Lucia) Surfers Paradise with my green go card. But if you have more than 10 travels in the week, than you can travel for free the rest of the week.
Gold Coast is a long city streatching along the coast. The main tourist point is definitely Surfers Paradise. As the name indicates, it's a paradise for surfing. So I thought that this place would be crowded with surfers and therefore dangerous to swim, but suprisingly there weren't so many surfers and the place was full of swimmers. The weather was f***in' hot and sunny (must be like 30 something), so I went to the sea. The waves were really good and around 2m high, so it was ideal for jumping around. At noon I lay down on the white sandy beach under the palm trees and had a little siesta. What more can you ask for?
The beach is really clean and covers with white and black sands. The sea itself is crystal clear and little wavy for swimming, but not to much to have fun. The city itself is very touristic, there are millions of skyscrapers everywhere, among them the highest skyscraper in Australia. And there's a McDonald's close to Surfer's Paradise, which means ice cream for 30 cents (the only thing here that's cheaper than in Czech Republic).
Rocky Horror Picture Show (RHPS)
I read about this show in The perks of being a wallflower, but otherwise I didn't know anything about it. At first, I thought is a theather performance. No, it's an old musical movie. Then I saw on Facebook that this performance will be at our university theather. So I attend it without any hesitation.
The ticket costs 10$ for UQ students and it includes 1 movie and the RHPS. The first movie was called Startrucks. There wasn't many people attending this movie. I watched it for 20 min, then I realize I didn't understand anything, so me and my friend got out and I ordered a pizza for dinner :)
The RHPS started around 20:30. At 20:00, there were a bunch of people waiting in front of the theather. We noticed that some of them were wearing really weird clothes - one guy came in a nightdress and underwear, the other was dressed as a woman prostitute etc. We thought that they were performers, but they weren't.
The show consisted of the movie itself on the screen and artists lip-syncing some parts of it. These parts were mostly the singing parts, performers were wearing exactly the same dress as in the movie and acted accordingly to what was going on on the screen. The other interesting part was that the audience screaming all the time, making jokes and saying nonsenses (probably because I didn't understand them). At first I thought they were drunk, but at the end I found out it was a part of the show :D At one scene some people from the audience started to spray water from water pistols on everyone, and during the other scene the whole theather stood up and danced. Crazy :D
I really like the songs from the movie, but unfortunately I didn't understand anything :) The sound was not that loud, then the continuous screaming and yelling from the audience didn't help to make it better. But that's how it goes, I should have watched it before at home. Well, maybe next time...
Study
Programming in the Large - this course exceeds my expectations. I expect easy-peasy subject when I'd spent max. 30 min every week doing homework. But the first assigment surprised me. It's harder than I expected :D The reason is that it contains stuff from probability and I don't remember them, like conditional probability... And the instructions for the assignments are little bit hazy, even the tutors don't know exactly what we have to do. So I spent couple of hours reading the instructions and comments again and again and now I think I finally understand it, I've written some codes and almost got the basics done. But still it will take me a couple of hours more... Damn!
Introduction to Web Design - again, the first assignment is not easy. We have to write a documentation about our personal web page, including things like persona, wireframes, discussing about target audiences etc. And I'm still confuse about what to write and how to write it.
Human-Computer Interaction (HCI) - Until now I've lost 1 point from 8, so it's ok. Tomorrow (27.3.) I'm going to miss 1 tutorial as I'm in Melbourne, so I'll probably lose 4 points more. It's bad, but I'm an exchange student, so it happens :D We also have to write an essay about a given topic, but there's still plenty of time for it.
Web Information Systems (WIS) - chill, but lengthy. I didn't know a thing about PHP, but the assignment was pretty easy (login, logging, timer and auto-logoff), so I haven't lost a point yet. The next assignment will be about JSP and I have some XPs with it already, so it should be quicker.
It might seems that study here is very easy :) I can ensure you that's not as easy as it seems. Overall, the subjects I mentioned are not easy at all for everybody. I picked them because I have some XP with programming and I've worked before, but if you come from VŠE FIS (my school) and have no interest in programming and had only the programming subjects at school, they might be a problem for you. Especially WIS course is pretty comprehensive and during the semester you have to learn PHP, JSP and JavaScript. Also the Programming in the Large expect you have taken a Python programming course and many examples are based on algorithm and maths and statistics.
pátek 8. března 2013
Rainy days in Brisbane
I signed up this semester for the CCM (Christianity sth Movement) and to make it complete as a package, I also signed up for the G Race, which took place on Saturday. Start was at 9:00, but because we needed to meet at South Bank at 8:15, I had to wake up at 6:30 am on the weekend...
I was in a team with another 7(?) people and there were a lot of teams (above 30 for sure), but not all teams started from the same place, so the start wasn't crowded. The race is about going to different spots in Brisbane, solving tasks there and get a clue. All the clues will then help you to answer the main question "Where is Frank?" (Frank Abignale from Catch Me If You Can movie). The tasks were various, e.g. first one was about throwing our shoes to the paper box so the box will move as far as possible, or dance Gangnam Style in front of the strangers and let them guess what's the dance, or sing an arbitrary text to a melody of a well-known song (well-known English song, so I didn't know them :D).
The finish was at UQ at 1 pm, so 4 hours to fulfill 6 tasks and to get the answer to the main question. We got the answer with the 3rd clue (the answer was "Madagascar"), but those 6 tasks took us almost 4 hours to complete. Because the time is also important, we ran the whole way as cheetahs, and because the rain is really persistent today, it was raining the whole day. And as I heard in a song, "When it rains it pours", that's a true story. I got soaked, even I wore a poncho and got an umbrella. But at the finish we got pizzas and drinks :) Unfortunatelly my team didn't win the first and second places, because there were better teams (or rather, more lucky teams), so I guess that we finished third. Not bad (Obama face).
I also got 2 new E guitar strings, yay :D Yesterday a friend of my landlord has came over. As she saw me bought a guitar with a broken string two weeks ago, she asked me whether I fixed and tune it. I answered that I fixed it, but probably didn't tune it well. So she offered that she would have a look at it and tune it for me. As she was trying to tune it, one string got broken... Too bad, but it happened to me also. So today, she bought a new string and fixed and tune the guitar for me :) In addition, she left 2 more strings for me, and a tuner. So I got new stuff for the guitar for free. Not bad (Obama face).
On Sunday I planned to go to the Koala Pine with my new friend here, but it rained again. So we ended up in the Brisbane museum and Brisbane gallery, but I had fun there even it was my second time in those places :) We also saw a Aboriginal dance performance and it was absolutely awesome.
Second week in school was funnier than the first week, because the practicals and the tutorials have started. I have pracs and tutorials in my Programming course, and the difference is simply about having/not having a computer to program. During the tutorial, we write code on the paper and on the blackboard. And the computers here are pretty fast as they're Intel Core i7 3,4GHz, have 16GB of RAM and Win 7. Not bad (Obama face).
Me and my Czech classmate also created a plan for the mid-semester break. We will travel to Melbourne, from there to the Great Ocean Road by car, and afterwards to Tasmania by plane. We'll probably live at my acquaintance's house in Melbourne, which means for free, so it should be a low cost travel. The trip is going to take about 8-9 days, so I'll miss some of my classes and probably lose 4 points... If someone happened to be on those places while I'm there, let me know and we can grab a drink or two (or more). Not bad (Obama face).
On Sunday I planned to go to the Koala Pine with my new friend here, but it rained again. So we ended up in the Brisbane museum and Brisbane gallery, but I had fun there even it was my second time in those places :) We also saw a Aboriginal dance performance and it was absolutely awesome.
Second week in school was funnier than the first week, because the practicals and the tutorials have started. I have pracs and tutorials in my Programming course, and the difference is simply about having/not having a computer to program. During the tutorial, we write code on the paper and on the blackboard. And the computers here are pretty fast as they're Intel Core i7 3,4GHz, have 16GB of RAM and Win 7. Not bad (Obama face).
Me and my Czech classmate also created a plan for the mid-semester break. We will travel to Melbourne, from there to the Great Ocean Road by car, and afterwards to Tasmania by plane. We'll probably live at my acquaintance's house in Melbourne, which means for free, so it should be a low cost travel. The trip is going to take about 8-9 days, so I'll miss some of my classes and probably lose 4 points... If someone happened to be on those places while I'm there, let me know and we can grab a drink or two (or more). Not bad (Obama face).
Přihlásit se k odběru:
Příspěvky (Atom)