Do Austrálie jsem se chtěl dycky podívat. Teď se mi nabízí šance to uskutečnit. Na příští rok jsem nominován na výměnný pobyt do University of Queensbridge (Queensland). Povedlo se mi to tedy až na druhý pokus a jen díky tomu, že v OZS zvýšili body za průměr pro studenty FIS. Každopádně jsem nominován na rok 2013 na letní semestr.
Prvně, co jsem udělal, bylo kontaktovat další 2 lidi (např. Petra a Eva), kteří jedou se mnou. Pak jsem zašel s nimi na studijní oddělení (asi někdy v květnu) a tam nám paní sdělila nějaké info, ale hlavně to, že je času dost na zařizování. Po prostudování letáku, která nám paní posléze poslala emailem, jsem zjistil, že deadline pro přihlášky do 1.semestru (tj. letní semestr) je do 30.9. předchozího roku. Takže chill.
A dnes je konec sprna a holki spolucestovatelky mi napsaly, že příští týden pošleme všichni přihlášku do Austrálie. Přihláška se totiž musí posílat poštou spolu s 2 dalšími dokumenty, a to transkript známek v angličtině a potvzení o úrovni angličtiny (v angličtině). Úroveň angličtiny může být potvrzen platnými certifikáty nebo v případě VŠE stačí dopis ze školy o úrovni angličtiny.
V pondělí (dnes je pátek) to jdu všechno zařídit do školy. Prvně pro transkript na studijní oddělení a pak na katedru angličtiny pro potvrzení o úrovni angličtiny.
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.
pátek 31. srpna 2012
středa 29. srpna 2012
Začínám s Haskell - 2. kapitola
Datový typy v Haskell
- datové typy se odvozují
:t příkaz pro vrácení datového typu
:t 'a' vrací: 'a' :: Char
Typ fce - typ fce je tvořen z parametrů a návratové hodnoty
definice fce se 3 parametry typu int a výsledek int:
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
Datové typy:
Int celá čísla
Integer taky celá čísla, akorát s větším rozsahem (např. na počítání faktoriál 9999)
Float , Double , Bool , Char
Tuples (n-tice) - jejich datový typ závisí na velikosti a typ vnitřních prvků
Type Variable (typová proměnná)
- u fcí - typ může být jakýkoliv (jak Generics v Javě)
Typ fce fst (vrací 1.prvek ve 2-prvkovém tuple):
snd :: (a, b) -> b znamená: jako parametr bere 2 prvky různého typu, a vrátí prvek stejného typu jako druhá proměnná
Type class (typová třída)
- definuje vlastnost, kterou všechny instance této třídy musí mít
(==) :: (Eq a) => a -> a -> Bool znamená: funkce rovná se bere jako parametr 2 prvky stejného typové třídy Eq (tzn. tyto prvky musí být instancí této typové třídy) a vrací typ Bool
Typové třídy
Eq == a /=, všechny předchozí zmíněné typy (kromě fcí ) jsou instancí Eq
Ord porovnání (např. >=), všechny předchozí zmíněné typy (kromě fcí ) jsou instancí Eq
Show převede do řetězce - fce show
Read načte řetězec a vrátí typ - fce read: je potřeba ji buď použít v kontextu nebo specifikovat typ (type annotation)
read "[1,2,3,4]" ++ [3] použitý v kontextu
read "5" :: Int type annotation
Enum sekvenčně seřazené typy (použití v ranges). Má definované předchůdce (fce pred) a následníky (fce succ).
Bounded mají spodní a horní hranici (např. Int nebo Bool nebo Tuples složené z Bounded prvků). Pro zjištění hranic jsou fce minBound a maxBound (např. minBound :: Int = -2147483648
Num instance se chovají jako čísla. Instance této třídy musí být zároveň instancí Show a Eq.
Integral jen celá čísla (Int a Integer)
Floating čísla s des. čárkou (Float a Double)
fromIntegral změní celé číslo na obecné číslo
fromIntegral :: (Num b, Integral a) => a -> b
fromIntegral (length [1,2,3,4]) + 3.2
znamená: length vrací celé číslo a sečtením s 3.2 by házelo chybu (4 + 3.2 jde, protože Haskell bere 4 jako typ floating), proto musíme přetypovat na obecné číslo pomocí fromIntegral
- datové typy se odvozují
:t příkaz pro vrácení datového typu
:t 'a' vrací: 'a' :: Char
Typ fce - typ fce je tvořen z parametrů a návratové hodnoty
definice fce se 3 parametry typu int a výsledek int:
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
Datové typy:
Int celá čísla
Integer taky celá čísla, akorát s větším rozsahem (např. na počítání faktoriál 9999)
Float , Double , Bool , Char
Tuples (n-tice) - jejich datový typ závisí na velikosti a typ vnitřních prvků
Type Variable (typová proměnná)
- u fcí - typ může být jakýkoliv (jak Generics v Javě)
Typ fce fst (vrací 1.prvek ve 2-prvkovém tuple):
snd :: (a, b) -> b znamená: jako parametr bere 2 prvky různého typu, a vrátí prvek stejného typu jako druhá proměnná
Type class (typová třída)
- definuje vlastnost, kterou všechny instance této třídy musí mít
(==) :: (Eq a) => a -> a -> Bool znamená: funkce rovná se bere jako parametr 2 prvky stejného typové třídy Eq (tzn. tyto prvky musí být instancí této typové třídy) a vrací typ Bool
Typové třídy
Eq == a /=, všechny předchozí zmíněné typy (kromě fcí ) jsou instancí Eq
Ord porovnání (např. >=), všechny předchozí zmíněné typy (kromě fcí ) jsou instancí Eq
Show převede do řetězce - fce show
Read načte řetězec a vrátí typ - fce read: je potřeba ji buď použít v kontextu nebo specifikovat typ (type annotation)
read "[1,2,3,4]" ++ [3] použitý v kontextu
read "5" :: Int type annotation
Enum sekvenčně seřazené typy (použití v ranges). Má definované předchůdce (fce pred) a následníky (fce succ).
Bounded mají spodní a horní hranici (např. Int nebo Bool nebo Tuples složené z Bounded prvků). Pro zjištění hranic jsou fce minBound a maxBound (např. minBound :: Int = -2147483648
Num instance se chovají jako čísla. Instance této třídy musí být zároveň instancí Show a Eq.
Integral jen celá čísla (Int a Integer)
Floating čísla s des. čárkou (Float a Double)
fromIntegral změní celé číslo na obecné číslo
fromIntegral :: (Num b, Integral a) => a -> b
fromIntegral (length [1,2,3,4]) + 3.2
znamená: length vrací celé číslo a sečtením s 3.2 by házelo chybu (4 + 3.2 jde, protože Haskell bere 4 jako typ floating), proto musíme přetypovat na obecné číslo pomocí fromIntegral
úterý 28. srpna 2012
Začínám s Haskell - 1.kapitola
Někde jsem četl, že je dobrý každý rok se naučit 1 nový programovací jazyk. Proto jsem se rozhodl, že tento rok se naučím Haskell. Budu si sem zapisovat poznámky z knížky Learn You a Haskell for Great Good!
Kapitola 2. Starting out
/= nerovná se
succ vrátí následující prvek (succ 8 == 9; succ 'a' == 'b')
min vrací ze 2 prvků menší prvek (min 'a' 'b' == 'a', min 8 10 == 8)
max vrací ze 2 prvků větší prvek
div celočíselné dělení dvou prvků (div 92 10 == 9; 92 'div' 10 == 9)
Vytvoření funkce
doubleUs x y = x*2 + y*2
název fce - doubleUs
x y - parametry fce
= začátek těla fce, za tímto je samotné provedení fce
List
ukládá více prvků stejného typu
let lostNumbers = [4,8,15,16,23,42] (let definuje jméno proměnné)
String je list znaků
++ spojování
['w','o'] ++ ['o','t'] == "woot"
[5]++[1,2,3,4,5] == [5,1,2,3,4,5]
"ha" == ['h', 'a']
: přidání prvku na začátek listu
'A':" SMALL CAT" == "A SMALL CAT"
5:[1,2,3,4,5] == [5,1,2,3,4,5]
!! získání prvku podle indexu (od 0)
"Steve Buscemi" !! 6 == 'B'
Porovnávání listů - porovnání prvků postupně (porovnává se 1. prvek, pak 2.prvek atd.)
[2, 10] < [1,100,1000] == false
head vrací head (první prvek) z listu
tail vrací tail = list - head
last vrací poslední element
init vrací vše
Texas ranges
- rozsahy čísel nebo znaků pro zkrácený zápis
[1..20], [2,4..20] (sudá čísla do 20), ['A'..'z'] (písmena A až Z + nějaké znaky + malé a až z), ['a'..'Z'] (prádzné pole), [20,19..1] (čísla od 20 do 1)
cycle bere parametr list a vytvoří opakováním nekonečný list
repeat bere prvek a vytvoří nekonečný list opakováním toho 1 prvku
replicate první parametr určí počet opakování druhého parametru
Generátor listu
- má 3 části: první je výstupní funkce; druhá je list, ze kterého se bude brát x; třetí jsou podmínky pro x.
- výstupem je nový list
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x] - první část (před pipou) je if podmínka, druhá část: pro x se bere z parametru pole xs pro funkce boomBangs, třetí část x musí být liché.
[ x | x <- [10..20], x /= 13, x /= 15, x /= 19] - tady jsou 3 podmínky ve 3.částí
[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50] - tady se ve 2.části bere ze 2 listů zároveň
length' xs = sum [1 | _ <- xs] - v této fci nás nezajímá, co se bere z listu za hodnoty, vždy se vrací 1. Nakonec dostaneme list jedniček o stejné délce jako je parametr xs a ten sečteme - dostaneme délku xs.
Tuples (N-tice)
Typy tuplu jsou závislé na tom, kolik obsahují prvků a jakého typu jsou tyto prvky.
- tuply nemusejí být homogenní jako list - můžou obsahovat prvky různého typu
[(1,2),(8,11),(4,5)] - ok, vnější list musí obsahovat jen prvky stejného typu, což ty vnitřní tuply jsou
[(1,2),(8,11,5),(4,5)] - chyba, vnitřní tuply nejsou stejného typu - tuply obsahují prvky stejného typu, ale tuply nemají stejný počet prvků.
fst bere parametr tuple o 2 prvcích a vrací 1. prvek
snd bere parametr tuple o 2 prvcích a vrací 2. prvek
Kapitola 2. Starting out
/= nerovná se
succ vrátí následující prvek (succ 8 == 9; succ 'a' == 'b')
min vrací ze 2 prvků menší prvek (min 'a' 'b' == 'a', min 8 10 == 8)
max vrací ze 2 prvků větší prvek
div celočíselné dělení dvou prvků (div 92 10 == 9; 92 'div' 10 == 9)
Vytvoření funkce
doubleUs x y = x*2 + y*2
název fce - doubleUs
x y - parametry fce
= začátek těla fce, za tímto je samotné provedení fce
List
ukládá více prvků stejného typu
let lostNumbers = [4,8,15,16,23,42] (let definuje jméno proměnné)
String je list znaků
++ spojování
['w','o'] ++ ['o','t'] == "woot"
[5]++[1,2,3,4,5] == [5,1,2,3,4,5]
"ha" == ['h', 'a']
: přidání prvku na začátek listu
'A':" SMALL CAT" == "A SMALL CAT"
5:[1,2,3,4,5] == [5,1,2,3,4,5]
!! získání prvku podle indexu (od 0)
"Steve Buscemi" !! 6 == 'B'
Porovnávání listů - porovnání prvků postupně (porovnává se 1. prvek, pak 2.prvek atd.)
[2, 10] < [1,100,1000] == false
head vrací head (první prvek) z listu
tail vrací tail = list - head
last vrací poslední element
init vrací vše
Texas ranges
- rozsahy čísel nebo znaků pro zkrácený zápis
[1..20], [2,4..20] (sudá čísla do 20), ['A'..'z'] (písmena A až Z + nějaké znaky + malé a až z), ['a'..'Z'] (prádzné pole), [20,19..1] (čísla od 20 do 1)
cycle bere parametr list a vytvoří opakováním nekonečný list
repeat bere prvek a vytvoří nekonečný list opakováním toho 1 prvku
replicate první parametr určí počet opakování druhého parametru
Generátor listu
- má 3 části: první je výstupní funkce; druhá je list, ze kterého se bude brát x; třetí jsou podmínky pro x.
- výstupem je nový list
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x] - první část (před pipou) je if podmínka, druhá část: pro x se bere z parametru pole xs pro funkce boomBangs, třetí část x musí být liché.
[ x | x <- [10..20], x /= 13, x /= 15, x /= 19] - tady jsou 3 podmínky ve 3.částí
[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50] - tady se ve 2.části bere ze 2 listů zároveň
length' xs = sum [1 | _ <- xs] - v této fci nás nezajímá, co se bere z listu za hodnoty, vždy se vrací 1. Nakonec dostaneme list jedniček o stejné délce jako je parametr xs a ten sečteme - dostaneme délku xs.
Tuples (N-tice)
Typy tuplu jsou závislé na tom, kolik obsahují prvků a jakého typu jsou tyto prvky.
- tuply nemusejí být homogenní jako list - můžou obsahovat prvky různého typu
[(1,2),(8,11),(4,5)] - ok, vnější list musí obsahovat jen prvky stejného typu, což ty vnitřní tuply jsou
[(1,2),(8,11,5),(4,5)] - chyba, vnitřní tuply nejsou stejného typu - tuply obsahují prvky stejného typu, ale tuply nemají stejný počet prvků.
fst bere parametr tuple o 2 prvcích a vrací 1. prvek
snd bere parametr tuple o 2 prvcích a vrací 2. prvek
zip bere jako parametr 2 listy a kombinuje tyto 2 listy na list obsahující tuply o 2 prvcích
zip [5,3,2,6,2,7,2,5,4,6,6] ["im","a","turtle"] výsledek: [(5,"im"),(3,"a"),(2,"turtle")]
Příklad:
jaký pravoúhlý trojúhelník s celočíselnými stranami má všechny strany rovné nebo menší než 10 a jeho obvod je 24?
neděle 26. srpna 2012
JS soubory podle prostředí v Grails Resources
Při vývoji web aplikace je užitečné mít jiné Javascript (JS) soubory než při produkci. Příkladem jsou minifikované vs plné verze JS nebo JS soubory ze CDN vs uložené JS soubory. Grails pro práci s JS má plugin Resources (i když teď už se stal součástí Grailsu). V dokumentaci jsem ale nevyčetl, jak rozlišit různé prostředí v definici resources. Ve skutečnosti je to docela jednoduché:
To už je skoro super. Pak jsem ale zjistil, že takhle definované má v sobě duplicity, když jsou soubory stejné pro oba prosředí (viz část application), a snadněji se dělají chyby (musí se přidávat ten samý řádek tolikrát, kolik je prostředí). Je potřeba ještě další trik - kompozice 2 closures v 1 closure:
environments {
development { // pro vývoj beru uložený plugin
modules = { // closure
jquery {
resource url: '/js/libs/jquery.js', disposition: 'head'
}
application { // duplikace
resource url: 'js/application.js'
}
}
}
production { // pro produkci beru ze CDN
modules = {
jquery {
resource url: 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
disposition: 'head'
}
application { // duplikace
resource url: 'js/application.js'
}
}
}
}
To už je skoro super. Pak jsem ale zjistil, že takhle definované má v sobě duplicity, když jsou soubory stejné pro oba prosředí (viz část application), a snadněji se dělají chyby (musí se přidávat ten samý řádek tolikrát, kolik je prostředí). Je potřeba ještě další trik - kompozice 2 closures v 1 closure:
commonModules = {That's that s**t!
application {
resource url: 'js/application.js'
}
}
environments {
development { // pro vývoj beru uložený plugin
modules = { // closure
jquery {
resource url: '/js/libs/jquery.js', disposition: 'head'
}
}
} << commonModules
production { // pro produkci beru ze CDN
modules = {
jquery {
resource url: 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
disposition: 'head'
}
}
} << commonModules
}
sobota 25. srpna 2012
Backbone.js callback u metody save()
Backbone.js ve své dokumentaci píše o možnosti volitelného callbacku při úspěšném a neúspěšném uložení modelu. A tak jsem taky zkoušel vytvoři callback:
Po chvíli googlení jsem zjistil, že na StackOverflow se někdo už ptal na tuto otázku. Pokud chci volat callback, musí tento callback být až jako druhý parametr. První parametr jsou atributy, které chci uložit. Bohužel v dokumentaci to není popsáno dostatečně (spíš vůbec). Tak jsem upravil:
transientModel.save({A na serveru vracím jen kód 200 jako OK. Samozřejmě že callback nefungoval. Na serveru se poslaly všechny atributy modelu a vše se uložilo v pořádku. I kód 200 se vrátil.
success:function (model, response) {
log.info("Uloženo!");
}
});
Po chvíli googlení jsem zjistil, že na StackOverflow se někdo už ptal na tuto otázku. Pokud chci volat callback, musí tento callback být až jako druhý parametr. První parametr jsou atributy, které chci uložit. Bohužel v dokumentaci to není popsáno dostatečně (spíš vůbec). Tak jsem upravil:
transientModel.save({}, // {} znamená, že chci poslat všechny atributy na serverA už to funguje.
{
success:function (model, response) {
log.info("Uloženo!");
}
});
Přihlásit se k odběru:
Příspěvky (Atom)