Tuesday, August 18, 2009

Amerika a Američani

Jsem ve Spojených státech už skoro dva týdny. Měl jsem možnost poznat Manhattan v New Yorku a Manhattan v Kansasu – první typické velkoměsto, druhé typické maloměsto. Vypozoroval jsem několik zajímavostí o Americe a Američanech, o které bych se rád podělil.

Plýtvání, plýtvání, plýtvání

To mě zarazilo nejvíc. V USA se plýtvá vším a na každém rohu. Plýtvá se například:
- auty: rodiny mají minimálně aut jako lidí, klidně i dvojnásobný počet aut než lidí
- místem: města jsou rozlehlá, ulice široké, zahrady obrovské
- elektřinou: všude je klimatizace, moc se nezhasíná
- benzínem: všichni mají velké bouráky a pickupy
- vodou: Každé spláchnutí na záchodě sebere tak 5 litrů vody
- jídlem: V restauracích lidé většinou jenom něco nakousnou, nechají to na stole a jdou si pro něco jiného.

Jídlo

Jídlo v USA je dobré. Neměl jsem ještě nic co by mi nechutnalo. Chutě jsou výrazné, dost jídla je odtučněné, ale dohání se to cukrem. Běžná praxe ve většině restaurací a fast-foodech je all-you-can-eat bufet. Přijdete do restaurace, zaplatíte jednu taxu a můžete jíst co se do vás vejde. Včetně neomezeného pití. Je to skutečně nezvyk oproti ČR. Ke každému jídlu je spousta příloh, salátů, omáček, dortů, neomezené zmrzliny atd. Jídlo je levné, dobré a je ho opravdu hodně. Musím se tu začít krotit a pořádně sportovat :)

Stereotypy platí

Koukáte na americký film a říkáte si, že ve skutečnosti je určitě všechno jinak? Ve většině případů to opravdu tak je. Třeba černoši: Mluví svým nezaměnitelným slangem, mladí se přes den flákají u basketu a večer v kroužcích po ulicích, když jedou po městě mají naplno zapnutý hiphop, když se hádají s bělochem, běloch je automaticky 'rasist' atd. Jdete po městě a všude vidíte předměty, místa a lidi "jako ve filmu". Ze začátku jsme se tomu smáli, teď už nám to ani nestojí za zmínku.

Pohodlnost

Různé vynálezy sloužící k pohodlí jsou někdy až absurdní. Dostávají mě záchody – ve škole je máme na fotobuňku, takže se po tom co vstanu automaticky spláchnou. Ale to samé se stane když se předkloním, takže mě to jednou osprchovalo :) Nebo někde místo umyvadla jsou jenom dvě díry ve zdi. Tam strčíte ruce a automaticky vám je to namydlí a ze všech stran umyje. Znáte McDonalds drive-thru? Tady mají drive-thru banku. Všechno co potřebujete v bance vyřídíte z auta. Mohl bych pokračovat... Ale něco se i hodí – třeba u každého sportoviště je voda na pití zdarma – to přijde vhod.

Přátelskost

Američané jsou hodně přátelští. Lidé se dívají do očí, i neznámí se zdraví, ptají se 'How are you?', v pohodě si pokecáte s prodavačkou v obchodě, se servírkou, s bankovní úřednicí. Lidé jsou usměvavaví a snaží se maximálně pomoci a vyhovět. Možná to i trochu přehánějí, sama ta bankovní úřednice nám říkala že někteří lidé jsou až 'creepy friendly'. Obecně tu je přátelkost povrchnější, máte spousty "kamarádů", s kterými každý den prohodíte pár slov na chodbě.


Celý článek by mohl vyznít jako kritika USA, ale není to tak. Je to jiná kultura a rád tuto kulturu poznám. Všeho je hodně, všechno je větší, všude koukají příležitosti k aktivitě a lidé jsou přátelštější. To vidím jako největší plus, je skutečně velmi jednoduché se s někým seznámit a neztratit se tu.

Sunday, May 24, 2009

CakePHP: jak upéct PHP aplikaci snadno a rychle

Už od ledna tohoto roku si hraji s PHP frameworkem CakePHP. Kvalitních PHP frameworků je několik, já jsem hledal něco rozšířeného a s minimální dobou nutnou k pochopení. Byl jsem frameworkem příjemně překvapen a už mám za sebou dvě PHP aplikace v tomto frameworku. V tomto článku popíšu ty nejlepší featury Caku a uvidíte, že to je piece of cake.

CakePHP je hodně podobný frameworku Ruby On Rails (ROR). Částečně z něho vychází, ale není to úplná předělávka, protože jazyk PHP má svoje specifika stejně jako jazyk Ruby. Základní principy jsou ale stejné. Především to, že framework má konvence pro pojmenovávání všeho - tříd, tabulek v databázi, sloupců v databázi, proměnných atd. Důležité je ale říct, že vývojář nemusí tyto konvence dodržovat. Když je ale dodržuje, ušetří si tím spoustu práce. Když je všechno pojmenované tak jak má, nastoupí spousta užitečných vlastností, které sami autoři v dokumentaci označují jako "magie". Většina podobných frameworků je založena na návrhovém vzoru Model-View-Controller, stejně tak Cake. Cake poměrně dost vývojáře nutí MVC používat, což je jedině dobře. Dřív jsem si to psal sám a ač jsem se o MVC snažil, mnohdy jsem ulítnul někam jinam. Výhoda těchto konvencí je jasná - kód je pak přehledný a snadno pochopitelný pro jiného vývojáře. Framework tak odstraňuje vlastnost PHP, kdy je jednu věc možno "naprasit" spoustu způsoby a kód je pak velmi nepřehledný. Abych to shrnul - Cake přebírá hlavní výhody Ruby On Rails, ale je to PHP (něco co znáte) a také odpadají problémy s hostingem.

Když jsem s Cakem začínal, překvapila mě podrobná dokumentace CookBook (kuchařka). Není to strohá referenční příručka ale ani spousta zbytečného textu ala Microsoft Help. Je to pěkně stručně psané a u všeho jsou příklady, které lze hned kopírovat a použít. Celá příručka je dobře hiearchicky rozdělená a dobře se čte. Navíc framework má za sebou hodně silnou komunitu. Na serveru Bakery je spousta článků které popisují konkrétní příklady a problémy z praxe a jak je vyřešit v Caku. Takových serverů je víc: Když jsem něco nechápal, vždy se stačilo zeptat Googlu.

Jak začít? Byl jsem až překvapen jak to je jednoduché. Stáhnete si distribuci, zdrojáky nakopírujete na localhost. Spustíte program do příkazové řádky, který se jmenuje "cake". Nebojte nemusíte si pamatovat žádné příkazy, program se na všechno ptá a vy jenom odpovídáte. Nastavíte přístup k databázi, název a cestu k vašemu projektu a cake vygeneruje potřebné adresáře a soubory. Cake podporuje snad všechny myslitelné databáze, má nad databází objektovou abstrakci, takže změna databáze znamená pouze přepsání jednoho slova v konfiguraci. Máte už v databázi nějaké tabulky? Super, tak pro ně uděláme web. Cake stejně jako ROR podporuje metodu zvanou scaffolding. Stačí pro každou tabulku vytvořit controller a model a tadá, máte vygenerovaný kompletní CRUD (create read update delete) nad tabulkou. A to včetně stránkování a pěkného defaultního vzhledu. Jak vytvořit controller a model? Předpokládejme že vaše tabulka se jmenuje users. V adresáři controllers/ vytvořte soubor users_controller.php s obsahem:

<?php

class UsersController extends AppController {

var $scaffold;

}
?>

a v adresáři models/ vytvořte soubor User.php s obsahem:

<?php

class User extends AppModel {
}
?>

Nyní v prohlížeči zadejte http://localhost/users a budete koukat. Alespoň já jsem koukal jako puk. To, co mi vždy trvalo spoustu hodin a hrozně mě nebavilo tady už je hotové. A pokud jste udělali něco špatně, například špatně nastavili přístup k databázi, Cake vás nenechá na holičkách. Vypíše pěknou a přesnou chybovou hlášku, kde je napsáno v jakém souboru na jaké řádce máte co upravit. A jak vidíte z URL, Cake se také stará o pěkné adresy pomocí mod_rewrite. Pěkné, nemyslíte?

Scaffolding je ale pouze tak na ukázku. Vy potřebujete mít plnou kontrolu nad view, modely a controllery abyste mohli napsat plnohodnotnou PHP aplikaci. V jiných frameworcích musíte všechno psát od nuly, v Caku ne. Opět nastupuje skvělý program pro příkazovou řádku "cake". Na příkazové řádce se přesuňte do adresáře vašeho projektu. Poté zadejte příkaz "cake bake" (upéct koláč:D). A můžete vyrábět modely, controllery a view jak na běžícím páse. Program se vás ptá na podrobnosti a vy odpovídáte. Nejdřív je dobré upéct modely. Zde se vás program zeptá na vztahy mezi modely (tabulkami). Cake podporuje základní vztahy belongsTo (N:1), hasMany(1:N), hasOne (1:1) a hasAndBelongsToMany (N:N). To určitě nadefinujte u všech tabulek, později to ušetří hodně práce. U modelů se vás program ještě zeptá na omezení pro jednotlivá data - např. minimální a maximální počet znaků, ale jsou i složitější vzory jako "email", "číslo kreditní karty" atd. Vytvoření modelů proto trvá déle, ale controllery a view máte během chvilky. Pak zadejte do prohlížeče http://localhost a budete koukat podruhé. Máte hotový web nad celou databází, včetně CRUDu všeho. A to včetně vztahů mezi tabulkami! Tzn. Ve formuláři pro vytváření knihy bude rovnou <select> pro vybrání ke kterému autorovi patří. A když si prohlížíte autora rovnou uvidíte seznam souvisejících knih! Zkuste si zadat něco špatně do formuláře - jé ona funguje validace formulářů podle těch kritérií co jste zadali při tvorbě modelu! A koukněte do kódu. Je to všechno přehledné a připravené k úpravě. Tenhle způsob mi hrozně vyhovuje - nemám prázdný projekt kde musím studovat dokumentaci jak se to dělá a podle toho něco tvořit - tady už mám základ hotový a jenom upravuji pěkný přehledný kód a tím se rovnou učím "jak to dělat".

A to jsem možnosti Caku jenom nakousl. Obsahuje další samozřejmé věci - např. správu layoutů, můžete definovat layouty pro různá zobrazení. Správu přihlášení pomocí komponenty Auth - pokud máte databázi správně pojmenovanou (tabulka users, pole username a password), nemusíte ani nic nastavovat, stačí v controlleru definovat metody login() a logout(), vytvořit view pro logovací stránku a tadá, máte přihlašování a odhlašování. Nebo podpora lokalizace, když všechny texty opouzdříte funkcí __ (dvě podtržítka), jste připraveni na lokalizaci webu. Funkce funguje tak, že když najde jazykový ekvivalent, použije ho a když ne, vypíše to, co jste funkci zadali.

Líbí se mi také různí pomocníci, tzv. Helpery. Třeba HtmlHelper generuje pěkné a validní XHTML. Třeba zadáte příkaz $html->image('cake.png') a ono to vytvoří validní HTML obrázek s tím, že se nemusíte starat o URL obrázku i poté, co z localhostu přejdete na na nějaký hosting. Nebo FormHelper je úžasný. Formulář v Caku napíšete asi takhle:

echo $form->create('Building');

echo $form->input('name');

echo $form->input('address');

echo $form->input('public');

echo $form->input('accessible_from');

echo $form->input('company_id');

echo $form->end('Submit');

Tento kód vygeneruje validní XHTML formulář a políčka přizpůsobí typům z tabulky buildings. "name" je string, takže to bude běžný <input type="text" />. "public" je boolean takže to bude checkbox. "accessible_from" je datum takže to bude kalendářík. "company_id" je cizí klíč takže to bude <select> z výběrem existujících companies. Nutno říct že i texty jako nadpisy formulářových políček nebo texty chybových hlášek se inteligentně vygenerují podle databáze. Jak tento formulář vypadá můžete vidět zde.

A poslední věc kterou musím zmínit - jak v Caku získáváte data z databáze? Zapomeňte na SQL, to je moc složité :-) Řekněme, že chceme získat autora který má příjmení Herbert a všechny jeho knihy. V controlleru AuthorsController ve funkci view() napíšeme pouze tento příkaz:

$this->set('author',$this->Author->findBySurname("Herbert"));

Tato funkce vytvoří ve view proměnnou $author obsahující pole dat, které potřebujeme. Funkci findBySurname jsme nikde nedefinovali, máme jenom v databázi tabulku authors a sloupec surname. Cake poskládá SQL dotaz a to včetně všech joinů. Vše vrátí jako přehledné pole.

V souboru views/authors/view.ctp (view pro detail autora) pak už jenom vypíšeme pole foreachem:

echo $author['Author']['firstname'];
echo $author['Author']['surname'].'<br />';
foreach ($author['Book'] as $book)
{
echo '<b>'.$book['title'].'</b><br />';
echo $book['anotation'].'<br />';
}

A to jsem pouze nakousnul jenom ty nejvýraznější featury. CakePHP toho umí mnohem víc a jak budete web tvořit, budete je postupně objevovat. Nutno říct, že spousta věcí jde v Caku generovat, ale nemusíte nic z toho používat. Reálné projekty mají často specifika, na které třeba Cake nemyslí. Nevadí, vše je možné rozšířit a napsat po svém. Ale pak samozřejmě budete psát víc kódu. Například já jsem pracoval v projektu s PostGISem, který má vlastní SQL funkce, které Cake nevygeneruje. Vlastní SQL samozřejmě můžu použít, ale musím si potom například psát vlastní validaci.

Chcete vidět CakePHP v praxi? Pomocí něho už jsem vytvořil dva projekty - GPS hru Catch&Run a systém pro evidenci elektrických zásuvek Juice My Laptop. Catch&Run už je plně přizpůsobený web mým potřebám. Juice My Laptop je ještě v začátcích, je to z velké části vygenerované Cakem. Juice My Laptop jsem celkem tvořil asi 3 hodiny. A z toho hodinu jsem tvořil databázi a zadával vztahy mezi tabulkami. Nesrovnávám CakePHP s jinými PHP frameworky, protože s nimi nemám dostatek zkušeností. Ale s Cakem jsem naprosto spokojený.

No a třešnička na závěr - v celém projektu se tvorba webu přirovnává k pečení koláče. Pekařské termíny se prolínají dokumentací. Není nad to se při čtení dokumentace zasmát :-)

Tuesday, February 17, 2009

Patý semestr na STM – praktický a zábavný

Mám za sebou další semestr na ČVUT FEL STM – byl ve znamení praktických pokročilých předmětů, zahájení práce na bakalářce a objevení skvělého International Student's Clubu. Nastal také posun v přípravě nových programů – Fakulty Informatiky a Otevřené Informatiky na FELu. Tak jdeme na to.

V tomto semestru už se hodně projevily konkrétní zájmy jednotlivých studentů. Máme už poměrně velkou volnost ve výběru předmětů, tak spoustu mých kamarádů studovalo hodně odlišných předměty. To je ale určitě dobře, každý by měl dělat hlavně to, co ho baví.

Povinný předmět byl Semestrální projekt. Tady trochu selhala organizace, nikdo nám o tom nic neřekl. Chtělo by to třeba jednu přednášku o bakalářkách a tomto projektu. Ale poradili jsme si a informace zjistili sami. Většina z nás už si v září našla vedoucího práce pro bakalářku a zvolila si téma. Tento projekt jsme pak pojali jako zárodek bakalářky. Většina mých kamarádů nemusela ani nic dělat a dostala kredity zadarmo s tím, že bakalářku budou dělat příští semestr. Já jsem u svého vedoucího musel vypracovat podrobné zadání a analýzu bakalářky jako přehledný dokument. Takže docela pohoda, bavilo mě to.

Další povinný předmět z oboru Softwarové inženýrství se vlastně skládal ze dvou předmětů – Řízení SW projektů a Realizace programových systémů. Předměty měli společné dvojcvičení a přednášky oddělené. Měli jsme pracovat na softwarovém projektu, který na rozdíl od předmětu z třetího semestru měl mít funkční výstup. V týmech nás bylo docela dost, takže se nikdo extra nenadřel. Náš tým měl za úkol kontrolovat kód jakéhosi ovladače na bezdrátovou kartu pro Linux. Bylo nás hodně, tak jsme se rozdělili na „management" a „programátory". Já jako příslušník managementu jsem kódu moc nerozuměl, ale stačilo, abych vytvořil a přednesl pár prezentací. Zkoušky pak byly dvě, oboje z teorie, která je v tomto předmětu celkem intuitivní a dá se dobře naučit. Těmto předmětům by se dalo přezdívat „důl na kredity", měli jsme dokonce možnost nechat si uznat projekt tvořený v tomto předmětu jako Semestrální projekt (viz výše).

Dál budu psát o povinně-volitelném předmětu Tvorba mobilních aplikací. Byl to snad nejzajímavěji pojatý předmět, co jsem kdy studoval. Probíhal totiž formou hry. Na začátku jsme se rozdělili na týmy po 7 mi lidech. Každý měl na starosti jednu mobilní aplikaci. A byly to aplikace vskutku zajímavé – GPS navigátor, interaktivní čtečka QR kódů, rozpoznávání obrazců nakreslených v prostoru Wii ovladačem, zpracování infračervených signálů, rozpoznávání zvuků mobilním telefonem, Bluetooth lokalizátor a skládačka fragmentů obrázků stažených z internetu. Cvičení byla víceméně konzultační a pro testování našich aplikací. Bylo na nás, jakou platformu a provedení si zvolíme (záviselo to především na telefonu, který každý vlastnil). No a v zápočtovém týdnu proběhla velká hra. Běhali jsme s mobily po škole po připravených stanovištích a soutěžili s ostatními týmy. Klíčem k úspěchu byla daná mobilní aplikace – jak byla rychlá, jestli byla bez chyb, jestli měla intuitivní uživatelské rozhraní. Výsledky ve hře potom ovlivňovaly hodnocení studenta. Zkouška byla nepovinná ústní a když člověk překonal strach a přišel, mohl si známku jenom vylepšit.

No a nyní ke strašáku tohoto semestru – Administrace webového serveru. Předmět vypadal vskutku zajímavě – naučím se jak spravovat webový server Apache. Předmět ale byl mnohem těžší, než jsem si myslel. Cvičení byla ryze praktická – vždy jsme přišli k rozbitému webovému serveru, museli jsme ho spravit a potom vykonat sadu konfiguračních úkolů. Pro linuxové guru to nebyl problém ale já s linuxem zas takový kamarád nebyl, tak jsem pár prvních cvičení zápasil s banalitami jako jak kopírovat text z Firefoxu do mceditu a zpátky. Pak už mi to trochu uteklo a každé cvičení jsem stihnul jenom pár prvních úkolů. Dělala se semestrálka ve formě wiki článku týkající se předmětu a bylo nám nabídnuto, že jí můžeme i prezentovat a pak dostaneme body navíc. Ač jsem o to prosil cvičícího jednou osobně a dvakrát mailem, prezentace mi nebyla umožněna. Zkouška probíhala stejně jako cvičení – rozbitý server, úkoly, 3 hodiny. Pak byla ještě písemka z teorie a pouze a pouze na součtu z praxe a teorie záviselo hodnocení. Učil jsem se skutečně hodně, rozjel jsem si server na svém linuxu gOS, chodil jsem i do školy kde jsem si to zkoušel na místním Gentoo Linuxu. Ale z prvního termínu zkoušky jsem dostal za E, což jsem nemohl přijmout. Zasekl jsem se na problému, kde byly úmyslně špatná práva na přístup k adresáři o dvě úrovně výše než psala chybová hláška. A na tomto problému závisely i další úkoly. Strávil jsem další 4 dny Apachem a nyní můžu říct, že umím vcelku obstojně nakonfigurovat Apache server. Druhý termín mě ale opět zklamal. Vše jsem nastavil a fungovalo mi to v prohlížeči. Hodnocení ale neprováděl člověk ale automatický skript. Ten měl v sobě chyby a za skoro funkční konfiguraci mi přidělil polovinu bodů. Po teoretickém testu jsem se domáhal spravedlnosti u cvičícího, který toho evidentně měl po celém dnu dost. Moje připomínky ale uznal a dostal jsem se alespoň na známku C. Suma sumárum: V tomto předmětu jsem se naučil hodně, ale organizace nebyla zvládnutá a spoléhání na strojové hodnocení tak komplexní záležitosti jako je nastavení serveru není dobrý nápad.

Tento semestr byl pro mě také hodně humanitní, chtěl jsem si to už odbýt. Historie 1 byla pohodička kde stačilo vytvořit jednoduchou prezentaci a když jsem poslouchal, dozvěděl jsem se zajímavé kapitoly z historie 20.století. Etika byl zajímavý předmět vedený římskokatolickým knězem. Na cvičení jsem pouze poslouchal, neškodilo by víc aktivity přenést na studenty. Hodina se potom většinou zvrhla na diskuzi všichni proti cvičícímu na téma Potraty/Eutanázie/Konzumní sex :-) Ale i přesto dokázal pan Slámečka chytře oponovat. Jako tělocvik jsem si tento semestr dal Lezení na stěně a poté, co jsem přemohl počáteční strach z výšek, mě to velmi bavilo.

Poslední předmět o kterém budu psát je Rétorika, což byl mimořádně povedený humanitní předmět. Byl o tom, co jsme se nikdy na střední neučili a byla to chyba – o lidské komunikaci. Také o sebeprezentaci a pochopení gest a jiné neverbální komunikace. A vynikající paní Pinková to dokázala pojmout jednoduchými hrami mezi námi studenty, kde jsme přímo na sobě zkoumali různá gesta a prováděli různé hlasové rozcvičky, úpravy dýchání atd. Bylo to velmi vtipné a poučné. Každý také několikrát během semestru musel přednášet před publikem na zvolené téma, což bylo velmi přínosné, zvlášť když následovala diskuze o přednostech a nedostatcích dané prezentace. Překvapilo mě, že se paní Pinková nebála i ožehavých témat a např. na hodině před Vánoci nám vysvětlila (a předvedla!) některé ženské a mužské neverbální signály sloužících obvykle ke svádění opačného pohlaví. Prostě předmět jak má být :-)

Ještě něco málo o tom, jak se to vyvíjí s Fakultou informatiky. Ta získává reálnější obrys, konečně je rozhodnuto o prostorách, FI bude mít pronajaté patro v krásné nové budově Národní technické knihovny. FI má nový web, ale stejně pořád fakulta není schválena. Magisterský program určitě nebude a bakalářský bude schválen až v dubnu. V té době bude mít většina středoškoláků rozhodnuto a nová fakulta bude těžko shánět studenty. Věřím ale, že se počáteční zmatky zvládnou a FI bude jednička pro studium informatiky v Praze.

V současné době lépe vypadá program Otevřená Informatika na FELu, který už je kompletně schválený. Já na něj budu nastupovat na magistra. Je více hardwarově zaměřený, ale každý si tu najde svoje. Bohužel tento program je zde na úkor programu STM, který je v propagaci a i jinde zatlačován do pozadí. Neví se, jak dlouho tento program bude ještě přijímat nové studenty.

A svůj blogpost bych chtěl zakončit názorem na International Student's Club. Do tohoto semestru jsem o něm nevěděl a docela toho lituji. Myslím totiž, že členství v ISC dodá studiu tu správnou šťávu! Když jste členové, stanete se tzn. Buddies. Staráte se o mezinárodní studenty, kteří přijíždí na naší univerzitu. Já jsem si vybral dvě Američanky, které jsou hrozně super. Pomohl jsem jim s papírováním, provedl je po Praze a nyní už mě čeká jenom chodit s nimi na party a jezdit na výlety :-) Je to samozřejmě nepovinné, ale je to skvělá příležitost jak zlepšit angličtinu a poznat lidi z celého světa. Zrovna včera byla „Integration party" v pražském P.M. baru, kde jsem potkal spoustu lidí a ještě dostal večeři od ISC zadarmo :-)