}w !"#$%&'()+,-./012345
Masarykova univerzita Fakulta informatiky
Haskell Hero – interaktivní učebnice funkcionálního programování Bakalářská práce
Stanislav Novák
Brno, jaro 2011
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj.
Stanislav Novák
Vedoucí práce: RNDr. Libor Škarvada i
Poděkování Na tomto místě bych rád poděkoval všem, kteří se významnou rolí podíleli na vzniku práce. Zejména pak Filipu Štefaňákovi za pomoc s instalací XAMPPu, Tomáši Pastirčákovi za vyřešení problémů s kódováním, Anežce Koublové za pohled blondýny, Tomáši Radějovi za rady ohledně grafického vzhledu, Martinu Čežíkovi za pohled nadšeného studenta, Lucii Kašpárkové za motivační citát o učiteli, Pavlu Heřmanskému za kvalitní test bezpečnosti aplikace, Tomáši Vallovi, Tomáši Janouškovi, Tomáši Orsavovi, Janě Pelclové a Michalu Smrčkovi za pomoc s korekturou textu. Dále Lucii Diblíkové a Lence Stehlíkové za elán do života, Jitce Zowadové, Janu Kašpárkovi, Janě Adamčíkové a také mé rodině za psychickou podporu. Velký dík patří také Petru Molnárovi, který mě přivedl na dráhu učitele funkcionálního programování a bez něhož by práce nejspíš vůbec nevznikla. V neposlední řadě bych chtěl poděkovat vedoucímu práce RNDr. Liboru Škarvadovi za čas a energii, kterou mně a mé práci věnoval a tím ji obohatil o cenné podněty.
iii
Shrnutí Cílem práce je vytvořit učební pomůcku, která studentům pomůže vybudovat si kladný vztah k funkcionálnímu programování, bude je motivovat ke studiu a poskytne jim prostředky k následnému využití takto nabyté motivace. V rámci práce byla vytvořena webová interaktivní učebnice v jazyce PHP, která obsahuje učební text, příklady k procvičení a diskuzi k jednotlivým lekcím. Dále je implementováno administrátorské rozhraní pro práci s uvedenými rysy. Práce také obsahuje příručku seznamující administrátora se základy správy učebnice.
v
Klíčová slova Haskell, Haskell Hero, IB015, funkcionální programování, učebnice, interaktivní, PHP, MySQL, functional programming, textbook, interactive
vii
Průměrný učitel vypráví, dobrý učitel vysvětluje, výborný učitel ukazuje, nejlepší učitel inspiruje. Charles Farrar Browne Lidi choděj do práce Tramvaje jezděj Nechybí nám informace Chybí nám motivace Štěpán Škoch, Chinaski
viii
Obsah 1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Cíl práce . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Co je funkcionální programování? . . . . . . . . . . . . 2 Dostupné studijní materiály . . . . . . . . . . . . . . . . 2.1 Skripta Zápisky z přednášek . . . . . . . . . . . . . . . 2.2 Doprovodný text k přednášce . . . . . . . . . . . . . . 2.3 Další materiály . . . . . . . . . . . . . . . . . . . . . . 2.4 Knihy o Haskellu . . . . . . . . . . . . . . . . . . . . . 2.4.1 Haskell – The Craft of Functional Programming 2.4.2 Programming in Haskell . . . . . . . . . . . . . 2.4.3 Real World Haskell . . . . . . . . . . . . . . . . 2.5 Internetové zdroje . . . . . . . . . . . . . . . . . . . . . 2.5.1 Naučte se Haskell . . . . . . . . . . . . . . . . . 2.5.2 Learn Haskell in 10 minutes . . . . . . . . . . . 2.5.3 Seriál o funkcionálním programování . . . . . . 2.5.4 Haskell na Wikibooks . . . . . . . . . . . . . . . 2.5.5 Beginning Haskell – An introduction to functional programming . . . . . . . . . . . . . . . . . 2.5.6 Korespondenční seminář z programování MFF, XV. ročník . . . . . . . . . . . . . . . . . . . . 2.5.7 Další internetové zdroje . . . . . . . . . . . . . 3 Rysy učebnice . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Krabičková metoda . . . . . . . . . . . . . . . . . . . . 3.1.1 O co jde? . . . . . . . . . . . . . . . . . . . . . 3.1.2 Konstanty jako krabičky . . . . . . . . . . . . . 3.1.3 Funkce jako krabičky . . . . . . . . . . . . . . . 3.1.4 Typy jako krabičky . . . . . . . . . . . . . . . . 3.1.5 Seznam jako vláček . . . . . . . . . . . . . . . . 3.2 Texty k lekcím . . . . . . . . . . . . . . . . . . . . . . 3.3 Systém sledování postupu učebnicí . . . . . . . . . . . 3.4 Hodnocení odstavců . . . . . . . . . . . . . . . . . . . . 3.5 Diskuze k lekcím . . . . . . . . . . . . . . . . . . . . . 3.6 Příklady k procvičení . . . . . . . . . . . . . . . . . . . 4 Implementace . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Požadavky na systém . . . . . . . . . . . . . . . . . . .
. 3 . 4 . 4 . 7 . 7 . 7 . 8 . 8 . 8 . 8 . 9 . 9 . 9 . 9 . 10 . 10 . 10 . . . . . . . . . . . . . . . .
10 11 13 14 14 15 15 17 19 19 21 21 22 22 25 25 1
4.2
Srovnání existujících systémů . 4.2.1 Wiki . . . . . . . . . . . 4.2.2 Redakční systém / blog . 4.3 Použitý systém . . . . . . . . . 4.4 Uživatelské účty . . . . . . . . . 4.5 Texty k lekcím . . . . . . . . . 4.6 Příklady . . . . . . . . . . . . . 4.7 Diskuze . . . . . . . . . . . . . 4.8 Návrh databáze . . . . . . . . . 4.9 Struktura webu . . . . . . . . . 4.9.1 Šablonové stránky . . . . 4.9.2 Statické stránky . . . . . 4.9.3 Uživatelské stránky . . . 4.9.4 Lesson stránky . . . . . 4.9.5 Admin stránky . . . . . 5 Příručka administrátora . . . . . 5.1 Instalace . . . . . . . . . . . . . 5.2 Práce s lekcemi . . . . . . . . . 5.3 Práce s odstavci . . . . . . . . . 5.4 Práce s příklady . . . . . . . . . 5.5 Práce s diskuzí . . . . . . . . . 5.6 Administrátorská sekce . . . . . 6 Závěr . . . . . . . . . . . . . . . . .
2
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
25 25 26 26 27 28 29 29 29 32 32 34 34 34 35 37 37 37 38 40 40 40 43
1 Úvod Studenti přicházejí na Fakultu informatiky z různých důvodů. Jedni chtějí prozkoumávat nové možnosti zpracování přirozeného jazyka, jiní by zase rádi v praxi uplatnili své matematické schopnosti. Najdou se i tací, kteří se domnívají, že studium informatiky znamená editování textu v textovém procesoru nebo upravování fotek. Všichni tito studenti mají jednu věc společnou. Musí překonat zkoušku z předmětu IB015 – Úvod do funkcionálního programování. První část studentů vzdá studium v průběhu první přednášky se slovy „To se nikdy nemám šanci naučit, nemám na to talent, jsem na špatné škole.“ A tímto studium ukončí, protože si v hlavě vytvoří psychický blok, těmto myšlenkám uvěří a podlehnou jim. Druhá část studentů si vezme po první přednášce nějaký učební materiál a snaží se pochopit, co že se to vlastně povídalo. Tento pokus, i když opakovaný, skončí rovněž nezdarem, neboť i po několikerém čtení se jim látka jeví jako náhodná změť písmen, číslic a dalších znaků. Sám jsem měl podobný problém. Vyřešil jsem jej tím, že jsem si místo funkcí začal představovat krabičky a místo seznamů vláčky. A najednou to začalo dávat smysl. Tato přirovnání jsem dále prezentoval studentům ve čtyřech seminárních skupinách v podzimním semestru 2009, které jsem vedl. Podle předmětové ankety měly krabičky a vláčky úspěch:1 „Cvičení byly zábavné a docela jsem tvé vysvětlování chápal.“ „Paráda, mašinky a krabičky jsou dobrý nápad :-)“ „Líbil se mi krabičkový učební styl a vůbec celý výklad látky, byl jasný a srozumitelný.“ Kromě poskytnutí studijních materiálů je také neméně důležité studenty k jejich používání motivovat, aby předmět nezavrhli po týdnu snažení, kdy na sobě nepozorují žádný pokrok. Jak jsou studenti motivováni, je popsáno v kapitole 3. 1.
Záměrně ponecháno s chybami.
3
1. Úvod Jelikož se o krabičkové metodě měli možnost dozvědět pouze studenti mých seminárních skupin, začal vznikat nápad vytvořit interaktivní učebnici, která by byla k dispozici všem. Učebnice dostala název Haskell Hero a přináším ji právě v této práci. První kapitola uvádí čtenáře do problematiky, seznamuje jej s funkcionálním programováním obecně. V druhé kapitole jsou uvedeny dostupné studijní materiály. Jak knižní, tak elektronické. Třetí kapitola shrnuje rysy učebnice a kapitola čtvrtá popisuje, jak byly rysy implementovány. Pátou kapitolu tvoří příručka administrátora učebnice a šestou kapitolu závěr.
1.1
Cíl práce
Cílem práce je vytvořit učební pomůcku, která studentům pomůže vybudovat si kladný vztah k funkcionálnímu programování, bude je motivovat ke studiu a poskytne jim prostředky k následnému využití takto nabyté motivace.
1.2
Co je funkcionální programování?
Funkcionální programování předkládá vysokoúrovňový pohled na programování obecně. Nabízí uživateli širokou paletu nástrojů, které mu pomáhají tvořit knihovny silných a obecných funkcí. Hlavním nástrojem funkcionálního programování je představa funkce, která počítá výsledek v závislosti na hodnotách vstupu. Sílu a obecnost funkcionálního jazyka Haskell můžeme demonstrovat na funkci map, která umožňuje transformovat každý prvek seznamu daným způsobem. Například může být použita ke zdvojnásobení čísel v posloupnosti nebo k invertování barev každého obrázku v seznamu obrázků. Elegance funkcionálního programování je důsledkem způsobu, jak jsou funkce definovány. K řečení, co je výsledkem funkce na obecném vstupu, se jako zápis používá rovnice. Jednoduchou ukázkou může být funkce addDouble, která sečte dvě celá čísla a výsledek zdvojnásobí. Její definice je addDouble x y = 2 * (x+y) 4
1. Úvod kde x a y jsou vstupy a 2 * (x+y) je výsledek. Model funkcionálního programování je jednoduchý a čistý. Abychom získali hodnotu výrazu 3 + addDouble 4 5 použije se rovnice, která definuje funkci obsaženou ve výrazu, tedy 3 + addDouble 4 5 ~> 3 + 2*(4+5) ~> ... ~> 21 Tímto způsobem by spočítal hodnotu výrazu počítač. Nicméně je možné výpočet zapsat i tužkou na papír, což ještě více ztransparentní implementační mechanismus. Je také daleko snažší popsat, jak se programy chovají obecně. Díky faktu, že hodnoty výrazů x+y a y+x jsou stejné pro všechna čísla x a y, můžeme v případě funkce addDouble odvodit, že i hodnoty výrazů addDouble x y a addDouble y x jsou stejné. Toto tvrzení je ve funkcionálním programování o mnoho snáze dokazatelné než v tradičním imperativním a objektově orientovaném programování. [15]
5
2 Dostupné studijní materiály Studenti mají možnost připravovat se na polosemstrální a závěrečnou zkoušku z následujících zdrojů.
2.1
Skripta Zápisky z přednášek
Oficiální učební text Libora Škarvady [9]. Publikace je rozdělena do jedenácti kapitol tématicky pokrývajících jednotlivá témata. Probíraná látka je srozumitelně podaná a téměř plně pokrývá rozsah předmětu. Na konci každé kapitoly se nachází shrnutí toho nejdůležitějšího, což textu přidává na přehlednosti. Materiál je psán v češtině. Úplné začátečníky může vylekat částečně odborný styl, pokud se s jinou publikací v tomto stylu doposud nesetkali. V textu se místy vyskytují odborné pojmy, které nejsou předem vysvětleny.1 Text obsahuje netriviální ukázkové příklady srovnání s imperativním programováním, které jsou místy náročné na pochopení, zvláště pro neprogramátory.2 Základní věci jsou probírány až po věcech náročnějších.3 Chybí vysvětlení důkazu indukcí.
2.2
Doprovodný text k přednášce
Oficiální slajdy promítané na přednáškách vytvořené Liborem Škarvadou [10]. Obsahují spoustu příkladů, jsou dobré jako doplněk jiného učebního materiálu, např. Zápisků z přednášek. Slajdy se nedají číst jako samostatný text. Místy nejsou vysvětleny používané konstrukce Haskellu4 . Programátory začátečníky může vylekat příliš teorie ze začátku5 i dále.6 1. deklarativní paradigma, str. 1 2. nalezení indexu největšího prvku posloupnosti, str. 1 3. skládání funkcí (str 5). před povídáním o funkcích a operátorech (str. 8); redukční strategie (str. 11) před typy (str. 15) 4. type String, str. 27 5. deklarativnost, ortogonalita, referenční transparentnost, str. 12 6. „Funkce iterate je anamorfismus kodatového typu nekonečných seznamů,“ str. 73
7
2. Dostupné studijní materiály
2.3
Další materiály
Množství dalších příkladů a vysvětlujících textů se nachází i v následujících zdrojích: •
slajdy promítané na cvičení7
•
diskuzní fórum předmětu
•
fakultní stránky jednotlivých cvičících
2.4
Knihy o Haskellu
2.4.1 Haskell – The Craft of Functional Programming Slavná kniha Simona Thompsona o Haskellu a funkcionálním programování obecně [15]. Na svých bezmála 500 stranách seznámí čtenáře s naprostými základy i s látkou vysoce pokročilou. V červnu 2011 vyjde její třetí vydání. Výklad problematiky je podán velice srozumitelně. Kniha nepředpokládá předchozí znalost jiného programovacího jazyka. Přístupnost začátečníkům ještě zvyšuje přítomnost příkladů, které text vhodně doplňují. Text je psán v angličtině, což může mnohé studenty odradit. Kniha je také nadměrně obsáhlá pro účely jednosemestrálního kurzu. 2.4.2 Programming in Haskell Kniha o programování v Haskellu [7]. Graham Hutton zde probírá Haskell od úvodní motivace a vysvětlení základů přes programy pracující se vstupem a výstupem až po úvod do důkazů. Na Huttonových8 stránkách je umístěn i výtah z knihy v podobě slajdů a záznamy přednášek vedených Erikem Meijerem, který z těchto slajdů čerpá. Kniha pokrývá rozsah předmětu, vysvětluje vše podstatné, obsahuje spoustu názorných příkladů. Na druhou stranu je ale psána v angličtině. A to v angličtině složitější než publikace předchozí. 7. dostupné na http://www.fi.muni.cz/~libor/vyuka/IB015/cviceni/ 8. http://www.cs.nott.ac.uk/~gmh/book.html
8
2. Dostupné studijní materiály 2.4.3 Real World Haskell Kniha o Haskellu, jejímiž autory jsou Bryan O’Sullivan, Don Stewart, a John Goerzen [13]. První vydání vyšlo již v listopadu 2008. Kniha je dostupná i ke čtení online v internetovém prohlížeči, kam mohou čtenáři vkládat své komentáře k jednotlivým pasážím. Látka je podávána srozumitelně a čtivě. V případě nepochopení některé části výkladu má čtenář možnost zeptat se ostatních vložením komentáře. Obsah knihy pokrývá náplň předmětu, chybí zde pouze důkaz indukcí a analýza časové složitosti. Kniha je psána anglicky, což může být pro čtenáře překážkou. Také je pro účely předmětu příliš rozsáhlá a podrobná.
2.5
Internetové zdroje
2.5.1 Naučte se Haskell Překlad anglického originálu Learn You a Haskell for Great Good! [6]. Originál napsal Miran Lipovača ze Slovinska [11], do češtiny postupně překládá student FIMU9 Pavel Dvořák. Původní anglická verze vyšla dokonce i knižně. Text je napsán velice čtivě, nepředpokládá žádné předchozí znalosti. Látka je podávána přátelským stylem, text doplňuje velké množství veselých obrázků. Pro začátečníky je tento zdroj jistě dobrou volbou, nicméně jeho obsah nepokrývá rozsah předmětu. 2.5.2 Learn Haskell in 10 minutes Velice rychlý úvod do programování v Haskellu na oficiálním webu Haskellu.10 [4] Zdroj nabízí velmi přehledné a stručné uvedení do problematiky funkcionálního programování v Haskellu. Text je psán s ohledem na úplné začátečníky a neprogramátory, které by neměl vylekat. Obsah zdaleka nepokrývá rozsah předmětu. Text je psán v angličtině. 9. Fakulta informatiky Masarykovy univerzity 10. http://www.haskell.org
9
2. Dostupné studijní materiály 2.5.3 Seriál o funkcionálním programování Krátký úvod do programování v Haskellu od Libora Škarvady z roku 2006 na webu Programujte.com [8]. Seriál obsahuje mimo úvod i povídání o výrazech, definicích, typech, datových strukturách a příklad s Hanoiskými věžemi. Všechny tyto aspekty jsou velmi podobně popsány i ve skriptech Zápisky z přednášek. Text je psán česky. Oproti Zápiskům z přednášek nepřináší nic nového. 2.5.4 Haskell na Wikibooks Velice rozsáhlá wiki jak o programování v Haskellu, tak o teorii okolo něj [3]. Obsah wiki je velmi přehledný, články jsou provázány odkazy. Celá wiki se dá stáhnout jako kniha v PDF o 290 stranách. Pro úplné začátečníky je ale obsah příliš podrobný. Texty jsou v angličtině. 2.5.5 Beginning Haskell – An introduction to functional programming Výčet základních znalostí o Haskellu od IBM [1]. Tutoriál předpokládá znalost alespoň jednoho imperativního jazyka, takže je v rozebírání základů programování dost stručný. Tento zdroj je dobrý pro programátory, kteří již umějí programovat imperativně a chtějí si rychle rozšířit své obzory. Text je psán v angličtině. 2.5.6 Korespondenční seminář z programování MFF, XV. ročník V roce 2003 vydala Matematicko-fyzikální fakulta Karlovy univerzity brožuru patnáctého ročníku Korespondenčního semináře z programování [12]. Tato publikace obsahuje i jednu úlohu na programování v Haskellu včetně vysvětlení základních věcí, které jsou k jejímu úspěšnému naprogramování zapotřebí. Text je v češtině. 10
2. Dostupné studijní materiály 2.5.7 Další internetové zdroje Pěkný přehled dalších materiálů, odkud lze čerpat při zdokonalování funkcionálně-programátorského umu, sepsal uživatel nanothief na webu Stack Overflow, jako odpověď na dotaz How to learn Haskell.11
11. http://stackoverflow.com/questions/1012573/how-to-learn-haskell
11
3 Rysy učebnice Cílem práce je vytvořit učební pomůcku, která pomůže čtenáři vytvořit si kladný vztah k funkcionálnímu programování, bude jej motivovat ke studiu a poskytne mu prostředky k následnému využití takto nabyté motivace. Vytvoření kladného vztahu k FP Pro vytvoření kladného vztahu k funkcionálnímu programování je zapotřebí v první řadě čtenáři ukázat, že jeho pochopení není nemožné. A to navzdory faktu, že předmět IB015 na podzim roku 2009 úspěšně ukončilo jen 48 % studentů.1 Nové informace by tedy měly být podávány opatrně, přátelským stylem, aby nechocházelo k frustraci z nepochopení. Problematika by měla být vysvětlena tak, aby ji měl šanci pochopit i čtenář, který se s programováním nikdy předtím nesetkal. Jelikož je čtenář úplným nováčkem, s pochopením látky mu výrazně pomůže, když v textu bude vyznačeno to nejdůležitější. Čtenář by měl mít možnost si každou novou věc vyzkoušet v praxi a být za tento pokrok odměněn. Motivace Nyní jsme ve stavu, kdy máme čtenáře, který se na funkcionální programování dívá pozitivně. Je tedy namotivován ke studiu. Tuto motivaci je u něj zapotřebí udržet. Čtenář by měl mít možnost zeptat se (ostatních čtenářů nebo tvůrců), když mu bude něco nejasné. Což zároveň tvůrcům umožňuje mít přehled o tom, co je vysvětleno dostatečně a co by si naopak zasloužilo více pozornosti. Pokud čtenáři poskytneme možnost srovnání s ostatními, bude jej ke studiu navíc motivovat příležitost k obsazení lepšího postavení mezi dalšími čtenáři.
1.
zdroj: předmětová anketa informačního systému MUNI is.muni.cz
13
3. Rysy učebnice Prostředky k využití motivace Nyní máme motivovaného čtenáře, který dychtí po znalostech. Poskytneme mu tedy texty, které budou pokrývat rozsah předmětu a vysvětlí vše k úspěšnému zvládnutí polosemestrální i závěrečné zkoušky. V průběhu studia bude mít čtenář stále možnost vyzkoušet si, zda látce správně porozuměl.
3.1
Krabičková metoda
Krabičková metoda je mým autorským dílem, jež jsem vymýšlel původně pro své vlastní zpříjemnění studia. Byla spontánně vyvíjena v podzimním semestru 2008, kdy jsem předmět IB015 absolvoval. Její představení proběhlo ve čtyřech seminárních skupinách podzimního semestru roku 2009, které jsem vedl. Sklidila zde úspěch. „Paráda, mašinky a krabičky jsou dobrý nápad :-)“ „Líbil se mi krabičkový učební styl a vůbec celý výklad látky, byl jasný a srozumitelný.“
vybráno z předmětové ankety
3.1.1 O co jde? Krabičková metoda představuje model vizualizace prvků funkcionálního programování pomocí krabiček. Krabičkami se dají znázornit konstanty, funkce, typy i typové třídy. Dokonce zachycuje i vztah mezi funkcemi a konstantami, jakožto nulárními funkcemi. Účelem krabičkové metody je pomoci studentům vytvořit si představu o základních principech funkcionálního programování. Spousta studentů se totiž při prvním pohledu na funkcionální kód zděsí, prohlásí, že je to jen náhodná změť písmen, číslic, pomlček a většítek, a zavrhne celý předmět. Krabičková metoda jim v tomto ohledu přináší jak motivaci, tak učební pomůcku. 14
3. Rysy učebnice
Obrázek 3.1: Znázornění konstant pomocí krabiček
3.1.2 Konstanty jako krabičky Nejjednodušším prvkem krabičkového modelu jsou konstanty. Jsou znázorněny jednoduchou krabičkou. Tvar krabičky určuje typ znázorňované hodnoty. Například celá čísla jsou znázorněna krychlí a znaky válcem. Jak ostatně ukazuje obrázek 3.1. 3.1.3 Funkce jako krabičky Funkce jsou v krabičkovém modelu zobrazeny krabičkou, jež má ve vrchní stěně vstupní otvory a ve stěně na pravém boku otvor výstupní. Chování krabičky je prosté. Naplníme otvory ve vrchní stěně příslušnými geometrickými tělesy, zatřepeme krabičkou a jako výsledek vezmeme těleso, které vypadne z pravé stěny krabičky. Počet děr ve vrchní stěně krabičky určuje aritu funkce. Tvary otvorů zleva určují typy argumentů funkce. Tvar bočního otvoru pak určuje typ výsledku. Například funkce (+) si jako argumenty bere dvě čísla a vrací číslo. Řečeno v krabičkovém modelu – vhazují se do ní dvě krychličky a vypadává z ní krychlička. Tato situace je znázorněna na obrázku 3.2. Podobně znázorňuje funkce i Simon Thompson v [15]. Jeho model ale nedostatečně vyjadřuje význam datových typů. Ukázka Thompsonova znázornění funkce (+) je na obrázku 3.3. Pomocí krabiček se dají znázornit i složené funkce, jak je vidět na obrázku 3.4. Na tomto obrázku jsou obzvláště dobře vidět základní vlastnosti složené funkce. Totiž že následující výrazy musí být typově kompatibilní: •
vstup funkce (f . g) se vstupem funkce g
•
výstup funkce (f . g) s výstupem funkce f 15
3. Rysy učebnice
Obrázek 3.2: Funkce (+) jako krabička
Obrázek 3.3: Znázornění funkce (+) Simonem Thompsonem
16
3. Rysy učebnice
Obrázek 3.4: Krabičkové znázornění složené funkce (f . g)
•
výstup funkce g se vstupem funkce f
I Thompson v [15] graficky znázorňuje složenou funkci. Opět ale z jeho modelu nejsou zřejmé typové závislosti. Thompsonovo znázornění složené funkce je zachyceno na obrázku 3.5. Krabičkami se dají vyjádřit dokonce i funkce vyšších řádů. Tedy funkce, které si jako argumenty berou funkce. Jednoduše se vytvoří krabička, do které se jako argumenty vkládají další krabičky, coby funkce. 3.1.4 Typy jako krabičky Datový typ je množina hodnot, například čísel nebo obrázků, s podobnými vlastnostmi. Ačkoli jsou tyto hodnoty odlišné (2 není totéž jako 17
3. Rysy učebnice
Obrázek 3.5: Znázornění složené funkce Simonem Thompsonem
Obrázek 3.6: Krabičkové znázornění základních typů
567), spadají obě do stejné kategorie hodnot, na které můžeme aplikovat stejné funkce. Má smysl ptát se, které ze dvou porovnávaných čísel je větší, na druhou stranu ale nemá smysl porovnávat například číslo a obrázek. [15] V krabičkovém modelu je typ znázorněn krabičkou, která obsahuje všechny hodnoty stejného typu. Znázornění základních typů ukazuje obrázek 3.6. Krabičkami můžeme znázornit i typové třídy. Typová třída je druh rozhraní, které definuje nějaké chování. Pokud je typ součástí nějaké typové třídy, znamená to, že podporuje a implementuje chování, jež ta typová třída definuje. [6] V krabičkovém modelu je typová třída znázorněna krabičkou, která obsahuje typy, jež do ní spadají. Příkladem může být třída Eq, jak 18
3. Rysy učebnice
Obrázek 3.7: Typové třídy jako krabičky
ukazuje obrázek 3.7. 3.1.5 Seznam jako vláček Seznam je v krabičkové metodě znázorněn vláčkem. Od běžného vlaku se liší tím, že místo cestujících převáží data a mašinka vagóny netáhne, ale tlačí je před sebou. Seznam jako vláček je znázorněn na obrázku 3.8. Vláčková symbolika byla zavedena hlavně pro snazší pochopení principu funkce map, jak je vidět na obrázku 3.9.
3.2
Texty k lekcím
Učební text svým rozsahem plně pokrývá náplň předmětu IB015 v podzimním semestru roku 2010. K datu 4. května 2011 je rozdělen do 32 lekcí, ve kterých vysvětluje látku od úvodního seznámení se základními pojmy až po analýzu časové složitosti. Text nepředpokládá žádné předchozí znalosti, pouze zvládnutí práce s počítačem na uživatelské úrovni 19
3. Rysy učebnice
Obrázek 3.8: Znázornění seznamu pomocí vláčku
Obrázek 3.9: Vláčkové znázornění aplikace funkce map
a základy středoškolské matematiky. Všechny odborné pojmy, se kterými učebnice pracuje, jsou při prvním výskytu náležitě vysvětleny. Struktura i obsah textů volně vychází z miniskript Zápisky z přednášek [9] a slajdů k přednáškám [10]. Texty jsou psány s velkým důrazem na srozumitelnost. Setkání s nimi by nemělo čtenáře vylekat. Pokud čtenář narazí na odstavec, kterému nerozumí, neměl by cítit odpor k jeho opětovnému přečtení a snaze o jeho pochopení. Obsah textu je zkontrolován Liborem Škarvadou. V případech, kdy se dá probíraná látka znázornit graficky, je text doplněn názornými obrázky.
Námět k rozšíření: Implementovat navigaci mezi lekcemi. Na konec každé lekce umístit odkazy Následující lekce a Předchozí lekce. Zvýraznit v levém menu aktuálně zobrazenou lekci. 20
3. Rysy učebnice
3.3
Systém sledování postupu učebnicí
Systém sledování postupu učebnicí (zkráceně též levelový systém) slouží k udržení čtenářovy motivace ke studiu. Předpokládá přirozenou soutěživost, která bude čtenáře hnát za dobýváním vyšších příček v žebříčku, kterým učebnice disponuje. K ohodnocení čtenáře za úspěchy při průchodu učebnicí slouží zkušenostní body (xp body, zkráceně pouze xp). Podle získaného množství xp bodů je studentovi přidělen stupeň postupu (level) a pozice v žebříčku. Tyto body je možné získat za •
řešení příkladů k lekcím (uděluje systém)
•
vkládáním hodnotných příspěvků do diskuzí (udělují administrátoři)
3.4
Hodnocení odstavců
Každý registrovaný uživatel má možnost osobního ohodnocení odstavců textu v jednotlivých lekcích. Na výběr má ze tří stupňů pochopení. Pochopený odstavec Označení odstavce za pochopený se provede kliknutím na tlačítko zeleného zátržítka. Pokud si čtenář odstavec takto označí, znamená to, že látce v odstavci plně porozuměl a nemusí se k němu více vracet. Částečně pochopený odstavec Pro označení odstavce jako částečně pochopeného slouží oranžová pomlčka. Toto ohodnocení by měl čtenář zvolit ve chvíli, kdy má pocit, že rozumí, o čem se v odstavci píše, ale ještě si není úplně jistý, zda látku pochopil úplně. Nepochopený odstavec Pokud čtenář při čtení odstavce vůbec netuší, o co se jedná, je zde ohodnocení červeným křížkem. Jak používat hodnocení odstavců a co které ohodnocení znamená, je popsáno v první lekci webové podoby učebnice. Hodnocení odstavců slouží čtenářům pro osobní představu o chápání probírané látky. Využijí ho ale i administrátoři starající se o podobu 21
3. Rysy učebnice učebních textů, kterým poslouží jako zpětná vazba. Pokud velké množství čtenářů označí odstavec jako nepochopený, je potřeba přepracovat jeho obsah. Za označení odstavců jako pochopených nejsou přidělovány xp body. Tato varianta byla zvolena zejména proto, aby v zápalu honby za vyššími příčkami nedocházelo k rychlému naklikání všech odstavců jako pochopených. Tím by došlo ke zkreslení jak čtenářovy osobní představy o postupu učebnicí, tak výčtu nejméně chápaných odstavců. Náměty k rozšíření: Implementovat hodnocení v AJAXu, bez nutnosti načítat stránku znovu. Implementovat statistiku pochopení odstavců jako přehled o kvalitě jejich obsahu pro tvůrce.
3.5
Diskuze k lekcím
Pokud čtenář narazí na část textu, které nerozumí, má po přihlášení možnost vložit příspěvek do diskuze, která se nachází na konci každé lekce. V případě, že bude příspěvek mimořádně hodnotný, může čtenář obdržet bodové ohodnocení příspěvku od administrátora. Za mimořádně hodnotný příspěvek je považována buď kvalitní odpověď na dotaz jiného čtenáře, nebo upozornění na chybu v textu. Takový příspěvek je pak ohodnocen 5 až 20 xp body v závislosti na rozhodnutí administrátora. Příspěvky administrátorů jsou zobrazeny tučně a nelze je hodnotit xp body.
3.6
Příklady k procvičení
Aby si čtenář mohl ověřit, zda látce opravdu porozuměl, nacházejí se pod každou lekcí příklady k procvičení. Příklad se skládá ze zadání, počtu xp bodů, které čtenář vyřešením získá, a výsledku reprezentovaného jednoznačným řetězcem. Aby čtenář získal motivaci příklady řešit, k vyřešení prvního příkladu pod první lekcí není zapotřebí žádná znalost funkcionálního programování. Dá se vyřešit ihned. K prvnímu příkladu druhé lekce je 22
3. Rysy učebnice zapotřebí (podle doporučeného postupu) nainstalovat Hugs2 a k vyřešení druhého příkladu je zapotřebí základní znalost angličtiny. Tímto by měl být čtenář dostatečně motivován k řešení příkladů složitějších. V současné době jsou k dispozici pouze tyto tři příklady. Doplnění dalších příkladů ke každé lekci by vydalo na další bakalářskou práci. Námět k rozšíření: Doplnit každou lekci učebnice o příklady k procvičení.
2.
interpret Haskellu, http://www.haskell.org/hugs/
23
4 Implementace 4.1
Požadavky na systém
Pro vytvoření učebnice se zmíněnými rysy je zapotřebí systém, který bude splňovat následující požadavky. Role uživatelů Úkony jako zasahování do učebního textu nebo hodnocení diskuzních příspěvků by měli mít právo provádět pouze administrátoři. Ukládat si osobní ohodnocení odstavců by zase měli mít povoleno jen registrovaní uživatelé, ne náhodní návštěvníci. Diskuze s hodnocením příspěvků Hodnocení příspěvků je rys určený pro motivaci čtenářů účastnit se diskuzí a vkládat hodnotné příspěvky. Možnost snadného nasazení Systém by měl být ideálně nasaditelný na fakultní server. A to z důvodu snadného a rychlého přístupu čtenářů a jednoduše proveditelných úprav v implementaci počas vývoje. Možnost dynamické editace textů Jelikož jsou v průběhu vývoje učební texty často měněny, bylo by nepraktické editovat jejich obsah jako statické soubory na serveru.
4.2
Srovnání existujících systémů
4.2.1 Wiki Wiki je označení webů (nebo obecněji hypertextových dokumentů), které umožňují uživatelům přidávat obsah podobně jako v internetových diskuzích, ale navíc jim také umožňují měnit stávající obsah; v přeneseném smyslu se jako wiki označuje software, který takovéto weby vytváří. [5] Systém wiki umožňuje snadnou editaci textu včetně jeho formátování. Podporuje také diskuzi u každé stránky a jednotlivé stránky se dají provázat odkazy. Systém je také jednoduše nasaditelný na libovolný PHP server s přístupem k databázi. 25
4. Implementace Na druhou stranu wiki nepodporuje bodované diskuze a hodnocení částí textu. Dále by bylo potřeba implementovat rozhraní pro odpovídání na příklady k procvičení a jejich editaci.
4.2.2 Redakční systém / blog Blog je webová aplikace obsahující příspěvky většinou jednoho editora na jedné webové stránce. Nejčastěji, nikoli však nezbytně, bývají zobrazovány v obráceném chronologickém pořadí, (tj. nejnovější nahoře). Autor se nazývá blogger,1 veškeré blogy a jejich vzájemné vztahy blogosféra. [2] Použití redakčního systému by umožnilo rychlé a nenáročné editování textů. Většina redakčních systémů navíc podporuje i diskuze pod články a hodnocení článků. Diskuzní příspěvky ale nejsou ohodnotitelné a hodnocení článků by nepřinášelo čtenáři žádnou výhodu, neboť se dá provést pouze jednou a dále je neměnné.
4.3
Použitý systém
Protože nebyl nalezen žádný systém, který by splňoval všechny požadavky, rozhodl jsem se vytvořit systém nový. K implementaci byl zvolen jazyk PHP.2 Aplikace využívá MySQL3 databázi na stroji db.fi.muni.cz. Generovaný kód odpovídá deskriptoru HTML 4.01 Transitional.4 Vzhled stránek je optimalizován pro prohlížeče Google Chrome 10, Opera 10.60, Mozilla Firefox 3.6 a Internet Explorer 8. Kód aplikace je plně zdokumentován. Programátorovi, který se rozhodne aplikaci rozšířit, by nemělo činit potíže pochopit, jak jednotlivé části pracují.
1. někteří Češi píší pouze jedno g 2. http://www.php.net 3. http://www.mysql.com 4. http://www.w3.org/TR/html4/sgml/loosedtd.html
26
4. Implementace
4.4
Uživatelské účty
Uživatelé učebnice jsou rozděleni do čtyř kategorií: •
neregistrovaní uživatelé
•
registrovaní uživatelé
•
administrátoři
•
webmaster
Neregistrovaní uživatelé mohou pouze číst učební texty, prohlížet příklady k procvičení a nahlížet do diskuzí. Registrovaní uživatelé mají navíc možnost hodnotit odstavce učebního textu podle míry pochopení, odpovídat na příklady k procvičení a přidávat příspěvky do diskuzí. Každý registrovaný uživatel má i svou profilovou stránku. Administrátoři mají oproti registrovaným uživatelům navíc právo přidávat, odebírat a zveřejňovat lekce, odstavce a příklady k procvičení. Dále mohou mazat diskuzní příspěvky a ty hodnotné odměňovat xp body. U webmastera se předpokládá, že má zároveň vytvořený administrátorský účet v učebnici. Navíc může zasahovat do zdrojů aplikace včetně manipulace s obrázky. Uživatelské jméno a heslo jsou uloženy v tabulce user. Vrámci bezpečnosti se místo hesla jako řetězce ukládá pouze jeho otisk generovaný algoritmem sha1.5 Přenos osobních údajů je prováděn nešifrovaně pomocí protokolu HTTP.6 Uživatel je na tuto skutečnost upozorněn při registraci a je mu doporučeno, aby nevolil stejné heslo, jako má např. k e-mailové schránce či do ISu. K získání co možná nejvíce zpětné vazby v průběhu vývoje je dovolena registrace libovolnému čtenáři, tedy i nestudentům FI. Z tohoto důvodu jsou uživatelské účty čtenářů učebnice nezávislé na informačním systému MU. Údaje o přihlášeném čtenáři jsou uloženy v proměnné $_SESSION. 5. http://en.wikipedia.org/wiki/SHA-1 6. http://www.w3.org/Protocols
27
4. Implementace
4.5
Texty k lekcím
Učební texty jsou uloženy v tabulce paragraph. Odstavec textu se skládá z nadpisu, pořadového čísla a samotného textu. Text je formátován pomocí HTML značek. Příklad:
Binární strom Binární strom je datová struktura. Může být buďto prázdný nebo neprázdný. Neprázdný strom se skládá z
- kořene a hodnoty v kořeni
- levého podstromu
- pravého podstromu
V Haskellu jej budeme definovat následovně: <pre> data BinTree a
=
Empty | Node a (BinTree a) (BinTree a)
Obrázky jsou uloženy ve složce images. Jejich přidávání a odebírání se musí provádět ručně – vzdáleným přístupem do složky. Vložení obrázku do textu se provádí standardní HTML značkou img s atributem class nastaveným na lessonImg. Obrázky jsou uloženy ve formátu GIF. Jejich názvy mají tvar LxxPyy.gif, kde xx označuje pořadové číslo lekce, k níž obrázek patří, a yy značí pořadí obrázku v lekci. Námět k rozšíření: Implementovat webového správce obrázků. 28
4. Implementace
4.6
Příklady
Příklad je tvořen svým zadáním, počtem xp bodů za správné zodpovězení a jednoznačnou odpovědí reprezentovanou řetězcem. Zadání příkladu je, stejně jako učební texty, napsáno ve standardním HTML kódu. Námět k rozšíření: Rozšiřte příklady s jednoznačnou odpovědí o příklady typu „Definujte funkci. . . “ nebo příklady typu „Jaký je nejobecnější typ funkce. . . “
4.7
Diskuze
Text diskuzního příspěvku je uložen jako prostý text. Při ukládání jsou znaky ‘<’, resp. ‘>’ nahrazeny HTML entitami <, resp. >, aby nedocházelo k nechtěnému čtení jako značek HTML. Dále jsou symboly nového řádku nahrazovány značkou
. Náměty k rozšíření: Implementovat editování a mazání diskuzních příspěvků samotným uživatelem, který příspěvek napsal. Implementovat tzv. „archiv příspěvků,“ do kterého se budou přesouvat např. příspěvky upozorňující na chybu v textu, která již byla opravena. U delších diskuzí toto rozšíření povede k výraznému zpřehlednění. Současně by měl mít čtenář možnost zobrazit celou diskuzi, včetně archivovaných příspěvků. Naprogramovat stránku, která bude zobrazovat všechny diskuzní příspěvky od nejnovějšího po nejstarší. Administrátorovi tato stránka ušetří čas, který by strávil proklikáváním lekcí po jedné.
4.8
Návrh databáze
Tabulka user Informace o registrovaném uživateli. userid ID uživatele, primární klíč password otisk hesla uživatele zašifrovaný algoritmem sha1 29
4. Implementace login login uživatele uco UČO uživatele, pokud ho při registraci vyplnil, jinak prázdný řetězec email e-mail uživatele pokud jej při registraci vyplnil, jinak prázdný řetězec isAdmin True, pokud je uživatel administrátor, jinak False isSubscribed True, pokud má uživatel nastaveno posílání novinek emailem, jinak False Tabulka lesson Lekce učebnice. lessonid ID lekce, primární klíč number pořadí lekce pro účely řazení, pokud mají dvě lekce tento atribut shodný, řadí se podle lessonid name název lekce public True, pokud je lekce zveřejněná, jinak False Tabulka paragraph Odstavec lekce. paragraphid ID odstavce lessonid ID lekce, ke které odstavec patří, cizí klíč number pořadí odstavce v rámci lekce, pokud mají dva odstavce tento atribut shodný, řadí se podle paragraphid name název odstavce text text odstavce 30
4. Implementace Tabulka paragraphrating Osobní ohodnocení odstavce uživatelem. userid ID uživatele, cizí klíč paragraphid ID odstavce, cizí klíč rating 1, pokud je odstavec zcela pochopený, 2, pokud je částečně pochopený, 3, pokud je nepochopený Tabulka discussion Diskuzní příspěvek. discussionid ID diskuzního příspěvku, primární klíč lessonid ID lekce, ke které příspěvek patří, cizí klíč userid ID uživatele, který příspěvek napsal, cizí klíč timestamp časová známka doby zaslání příspěvku text text příspěvku xp počet zkušenostních bodů, za kolik byl příspěvek ohodnocen Tabulka problem Příklad k procvičení. problemid ID příkladu, primární klíč lessonid ID lekce, ke které příklad patří, cizí klíč number pořadí příkladu v rámci lekce, pokud jsou dva příklady, které mají tento atribut stejný, řadí se podle problemid task zadání příkladu answer řetězec reprezentující řešení příkladu xp počet zkušenostních bodů, které čtenář od systému obdrží, když příklad vyřeší public True, pokud je příklad zveřejněný, jinak False 31
4. Implementace Tabulka problemsolve Záznam o vyřešení příkladu uživatelem. userid ID uživatele, primární klíč, cizí klíč problemid ID příkladu, primární klíč, cizí klíč
4.9
Struktura webu
Zde jsou popsány jednotlivé soubory, ze kterých je generován obsah webových stránek učebnice. Značení v obrázcích Černý nápis začínající tečkou (např. .footer) označuje název třídy CSS. Šedý nápis uzavřený do špičatých závorek (např. <main.php>) udává odkaz na soubor, jehož obsah se vloží na uvedené místo. 4.9.1 Šablonové stránky index.php Kořenová stránka. Vypíše hlavičku a tělo stránky. Tělo se skládá ze základního rozvržení – hlavičky, části s hlavním obsahem a patičky. Struktura stránky je znázorněna na obrázku 4.1. header.php Zobrazí hlavičku stránky, která obsahuje odkazy hlavního menu a obrázek pozadí s logem. Odkazy v menu se mění podle role přihlášeného uživatele. Odkaz na právě zobrazenou stránku je zvýrazněn tučným písmem. footer.php Statický soubor obsahující text patičky. main.php Soubor vypisující hlavní část stránky. Pokud se v parametru page nachází název existující stránky, vypíše ji, jinak vypíše chybové hlášení, že stránka neexistuje. Pokud není parametr page nastaven, zobrazovaná stránka se nastaví na news. V případě stránky lesson se v hlavní části vykreslí levé menu a obsah vybrané lekce, což je znázorněno na obrázku 4.2. 32
4. Implementace
Obrázek 4.1: Struktura souboru index.php
Obrázek 4.2: Struktura souboru main.php
33
4. Implementace V případě stránky about je do rámečku třídy about vložen obsah souboru about.php. U stránek news, login, register, logout, profile, ladder a admin je vypsán rámeček třídy container a do něj vložen obsah souboru příslušného názvu s příponou php. 4.9.2 Statické stránky about.php Informace o projektu a výčet levelů. news.php Novinky v učebnici, úvodní stránka. 4.9.3 Uživatelské stránky login.php Zobrazí přihlašovací formulář nebo provede přihlašovací proceduru, pokud již byl formulář vyplněn. register.php Zobrazí registrační formulář, nebo registruje nového uživatele, pokud v parametrech metody POST přišly informace z již vyplněného formuláře. profile.php Zobrazí profilovou stránku uživatele, jehož ID je shodné s parametrem userid. Pokud je parametr userid shodný s ID přihlášeného uživatele, zobrazí se formulář umožňující změnu nastavení zasílání hromadných emailů. 4.9.4 Lesson stránky lesson.php Zobrazí text lekce, jejíž ID je shodné s obsahem parametru lesson. Pokud parametr lesson není vyplněn, zobrazí se poslední zobrazená lekce uložená v proměnné $_SESSION["lastlesson"]. Pokud proměnná není instanciována, vypíše se hlášení „Vítej v učebnici.“ Pokud přijde požadavek na oznámkování odstavce, oznámkování se provede. Pokud je uživatel administrátor, místo hodnocení se u každého odstavce zobrazí tlačítka Upravit a Smazat. Na konci lekce přibude tlačítko Přidat odstavec. 34
4. Implementace problems.php Zobrazí příklady k lekci, jejíž ID je uvedeno v parametru lesson. Pokud si stránku prohlíží nepřihlášený uživatel, vypíše se pouze zadání příkladu. V případě přihlášeného uživatele se navíc zobrazí i formulář pro zaslání odpovědi. Pokud je přihlášený uživatel administrátor, příklad se zobrazí v editačním režimu. Provádí také vyhodnocení nově přijaté odpovědi na příklad a administrátorské změny. discussion.php Zobrazí diskuzní příspěvky k aktuální lekci. Pokud je příspěvek obodovaný, zobrazí se počet bodů, které mu byly přiděleny. Pokud je přihlášený uživatel administrátor, provedou se příchozí požadavky na administrátorské zásahy (obodování, smazání) a u příspěvků se zobrazí administrátorské možnosti. 4.9.5 Admin stránky Následující soubory se až na soubor admin.php nacházejí ve složce adminPages. admin.php Šablonová stránka, která zobrazí administrátorské menu ze souboru adminMenu.php a stránku administrátorské sekce, jejíž název se nachází v parametru section. Pokud stránka neexistuje nebo uživatel není administrátor, vypíše se chybová hláška. adminMenu.php Statická stránka zobrazující menu administrátorských voleb. lessons.php Stránka pro práci s lekcemi – jejich přidávání, odebírání, změna názvu, pořadového čísla a údajů o zveřejnění. paragraph.php Stránka pro úpravu odstavce. Zobrazí jeho aktuální podobu v HTML kódu i náhled odstavce, jak bude zobrazen po uložení. Pokud se při ukládání zatrhne políčko Velká změna, smažou se uživatelům u odstavce jejich osobní ohodnocení. Obsahuje obslužné funkce i pro mazání a přidání odstavce. 35
4. Implementace users.php Stránka pro práci s uživateli – mazání uživatelů, přidělování a odebírání administrátorských práv. email.php Stránka pro napsání a rozeslání hromadného emailu všem uživatelům, kteří jsou aktuálně přihlášeni k odběru těchto zpráv.
36
5 Příručka administrátora Následující řádky popisují postup, jak nainstalovat učebnici na server či na localhost (pro účely vývoje). Čtenář se zde dále dozví, jak z pohledu administrátora pracovat s kapitolami, odstavci a příklady.
5.1
Instalace
Instalace učebnice je rychlá a nenáročná. Budeme potřebovat MySQL databázi a prostředí umožňující spouštění PHP skriptů. Nejdříve rozbalíme archiv HaskellHero-webapp.zip na místo, odkud bude jeho obsah viditelný PHP prostředím. Například /home/xnovak/public_html/HaskellHero Dále nastavíme práva pro spuštění souborům index.php, install/index.php a install/install.php. V případě potřeby na začátku zmíněných souborů odkomentujeme informaci o tom, že se má soubor provést jako PHP skript: #!/packages/run/php/bin/php Tímto je ukončena práce se soubory a můžeme se pustit do instalace databáze. Tu provedeme zobrazením stránky install/index.php. To znamená, že do internetového prohlížeče napíšeme jako adresu například http://localhost/HaskellHero/install/ Dále se stačí řídit pokyny uvedenými na této stránce, které zahrnují zbývající část instalace. Tato část obsahuje i vytvoření prvního administrátorského účtu, ke kterému je zapotřebí se přihlásit, aby se zpřístupnily možnosti popisované dále.
5.2
Práce s lekcemi
Do nabídky umožňující přidávání, odebírání a editování lekcí je možné se dostat dvěma způsoby. První možností je položka Administrace, nacházející se v hlavním menu, a následné kliknutí na položku Spravovat 37
5. Příručka administrátora
Obrázek 5.1: První způsob, jak zobrazit nabídku práce s lekcemi
Obrázek 5.2: Druhý způsob, jak zobrazit nabídku práce s lekcemi
lekce, jak ukazuje obrázek 5.1. Druhou možností je pak vstup do sekce Učebnice a následné kliknutí na odkaz Správa lekcí, což je znázorněno na obrázku 5.2. Na této stránce je pak jednoduše možné přidat novou lekci a smazat či upravit lekce existující. Nezveřejněné lekce vidí pouze administrátor. V nabídce jsou pak zobrazeny odlišnou barvou. Tabulka lekcí je zachycena na obrázku 5.3.
5.3
Práce s odstavci
Po přihlášení pod administrátorským účtem se na konci každého odstavce objeví tlačítka Upravit a Smazat. Pod posledním odstavcem navíc přibude položka Přidat odstavec, jak je ukázáno na obrázku 5.4. 38
5. Příručka administrátora
Obrázek 5.3: Tabulka lekcí pro jejich možnou editaci
Obrázek 5.4: Administrátorská nabídka pro práci s odstavci
Tato tlačítka vykonávají příslušné funkce – tlačítko Smazat odkáže na stránku s potvrzením smazání, tlačítko Upravit odkáže na stránku s úpravou odstavce a položka Přidat odstavec přidá nový odstavec a zobrazí stránku s jeho editací. Editace odstavce Na stránce pro úpravu odstavce je možné změnit jeho pořadové číslo, název a samotný text. Pořadové číslo udává pořadí odstavce v rámci lekce. Zobrazuje se pouze administrátorům v nadpisu odstavce pro lepší přehled, jinak se nevyužívá. V průběhu editace je možné kliknout na tlačítko Náhled/provést změny, které provede zobrazení náhledu odstavce, jak bude zobrazován na svém místě v učebnici, ve spodní části stránky. Pro uložení pak stačí stisknout tlačítko Uložit změny. Pozor! Tlačítko Uložit změny uloží odstavec ve stavu, jaký je zobrazen ve spodní části stránky! Před stiskem tlačítka Uložit změny je tedy nezbytné nejprve stisknout tlačítko Náhled/provést změny.
39
5. Příručka administrátora
Obrázek 5.5: Výřez stránky pro editaci odstavce
Jakým způsobem má vypadat text odstavce je podrobněji popsáno v kapitole 3. Obrázky k lekcím nahrává webmaster. Webový správce obrázků zatím není implementován.
5.4
Práce s příklady
Práce s příklady je velice podobná práci s odstavci. Kromě změny pořadového čísla, stavu zveřejnění, uložení změn a smazání příkladu jsou zde ještě navíc možnosti změny počtu xp bodů za správné zodpovězení, editace zadání a odpovědi. Nový příklad se přidává příslušným tlačítkem za posledním příkladem. Vzhled příkladu v administrativním zobrazení je na obrázku 5.6.
5.5
Práce s diskuzí
Administrátor může diskuzní příspěvky mazat a přidělovat jim xp body. Tyto úkony se provádějí pomocí rozhraní vyobrazené na obrázku 5.7.
5.6
Administrátorská sekce
Do administrátorské sekce se vchází přes položku Administrace v hlavním menu. Mimo správu lekcí nabízí i správu uživatelů a zaslání hro40
5. Příručka administrátora
Obrázek 5.6: Příklad k lekci v administrátorském zobrazení
Obrázek 5.7: Diskuzní příspěvek v administrátorském zobrazení
41
5. Příručka administrátora
Obrázek 5.8: Správa uživatelů
madného e-mailu. Správa uživatelů Administrátor má právo přidělovat administrátorská práva dalším uživatelům a mazat uživatele. Oba tyto úkony se provádějí ve formuláři ukázaném na obrázku 5.8. Hromadný e-mail Zaslání hromadného e-mailu se provádí vyplněním jeho předmětu, samotného textu a kliknutím na tlačítko Odeslat email. E-mail se odešle všem uživatelům, kteří při registraci vyplnili svou e-mailovou adresu a zároveň mají nastaven odběr novinek e-mailem.
42
6 Závěr Cílem práce bylo vytvořit učební pomůcku, která studentům pomůže vybudovat si kladný vztah k funkcionálnímu programování, bude je motivovat ke studiu a poskytne jim prostředky k následnému využití takto nabyté motivace. V průběhu devíti měsíců byla postupně vyvíjena webová aplikace interaktivní učebnice funkcionálního programování. 22. září 2010 byla učebnice spuštěna na fakultním serveru1 a dále rozšiřována, čímž bylo umožněno sbírání zpětné vazby od uživatelů. Tyto náměty byly následně zpracovány. V současné době jsou implementovány rysy popsané v kapitole 3. Po stránce obsahové je učebnice ke dni 14. května 2011 naplněna 32 lekcemi, které svým obsahem plně pokrývají rozsah předmětu. Drobné náměty k rozšíření jsou zaznamenány přímo v textu. Jako námět na další bakalářskou práci vidím vytvoření příkladů k jednotlivým lekcím a následné vyvážení levelového systému, aby u čtenáře docházelo k největší možné míře motivovanosti. Jelikož je programová část téměř nezávislá na obsahové, dala by se tato nezávislost dovést k úplnosti a vytvořit tak obecný rámec pro jednoduché zprovoznění interaktivní učebnice libovolného předmětu. Z vývoje aplikace, psaní učebního textu i psaní textu bakalářské práce si odnáším cenné zkušenosti jak z programátorské oblasti, tak z oblasti písemného vyjadřování a komunikace s vedoucím. Studentovi, který se rozhodne po mně tento projekt převzít, přeji hodně pěkných chvil strávených nad dalším rozšiřováním učebnice a co nejméně nechápavých mimických výrazů nad mým zdrojovým kódem!
1. http://www.fi.muni.cz/~xnovak34/haskellhero
43
6. Závěr
Obrázek 6.1: Žabička [14]
44
Obsah přiloženého CD •
zdrojové soubory aplikace včetně instalačních skriptů
•
učební text v pdf vysázený v LATEXu
•
obrázky k lekcím ve vektorovém formátu zmf
45
Literatura [1] Beginning Haskell [online]. [cit. 2011-05-17]. URL
[2] Blog – Wikipedie [online]. [cit. 2011-05-17]. URL [3] Haskell – Wikibooks [online]. [cit. 2011-05-17]. URL [4] Learn Haskell in 10 minutes [online]. [cit. 2011-05-17]. URL [5] Wiki – Wikipedie [online]. [cit. 2011-05-17]. URL [6] Dvořák, P.: Naučte se Haskell! [online]. [cit. 2011-05-17]. URL [7] Hutton, G.: Programming in Haskell. University of Nottingham: Cambridge University Press, 2007, ISBN 0521692695, více informací na . [8] Škarvada, L.: Webový seriál o programování v Haskellu [online]. [cit. 2011-05-17]. URL [9] Škarvada, L.: Zápisky z přednášek [online]. Masarykova univerzita, 2002, [cit. 2011-05-16]. URL [10] Škarvada, L.: Doprovodný text k přednáškám [online]. Masarykova univerzita, podzim 2010, [cit. 2011-05-16]. URL 47
6. Závěr [11] Lipovača, M.: Learn You a Haskell for Great Good! [online]. [cit. 2011-05-17]. URL [12] Mareš, M.: Korespondenční seminář z programování [online]. Str. 9 – 13, [cit. 2011-05-17]. URL [13] O’Sullivan, B.; Stewart, D.; Goerzen, J.: Real World Haskell. O’Reilly Media, 2008, ISBN 978-0596514983, více informací na . [14] Pavelka, A.: Funkční anotace proteinových segmentů. Bakalářská práce. 2006, str. 21, [cit. 2011-05-17]. URL [15] Thompson, S.: Haskell: The Craft of Functional Programming. Harlow: Addison-Wesley, 1996, ISBN 0-201-40357-9, více informací na .
48