Sedím na SLO/WP a strašně se nudím…

Když jsem si zapsal předmět SLO/WP (Webová prezentace), čekal jsem něco podobného, jako SLO/PROG2 (Programování v jazyce C pro fyziky), tedy předmět, kde se snad opravdu něco naučím.

Přednáší tady jeden zarostlý chlapík, který s trochou nadsázky vypadá, jako kdyby jej před chvílí někdo třesením odtrhl od piva v nějaké zapadlé putice (ne že by na fakultě byl jedinný ;-)).

Výklad mi přijde trochu nelogický, nevím, jestli jsme tady všichni začátečníci, ale předpokládal jsem, že budeme nejdříve probírat čistě statické html, a pak se přejde na dynamické technologie. Začal sice historií, ale koho zajímá HTML 2 nebo nějaké miniML. Když už mluvil o sgi nebo php souborech (pominu-li to, že na asp zapomněl), mohl naznačit princip cesty webové stránky k uživateli. To je přeci základ.

Odbočka: Právě se nás ptá, jaký máme názor na rámy. Co je SVG neví nikdo, ale rámy bere jako naprostou samozřejmost. Nechápu. Konec odbočky.

Takže tady sedím a koukám, chrlí do nás standarty (o kterých jsem já osobně v životě neslyšel ani nečetl) na šíleně nepřehledných slajdech („tady může být Transitional, ale pak tady nesmí být standart, ale loose, nebo …“), a to tak, že si máme upravovat výchozí hlavičky vygenerované PSPadem.

Ale úplně bych vraždil, když místo slova prohlížeč říká „prohlížečky“ a po každém druhém slajdu přehodí přes projektor nějaký papír, aby mohl přepnout na editor – to má na ploše tolik porna? 😀

Jinak je nás tu asi tak 10, z toho 2 informatici (jeden člověk dokonce vůbec neodtrhl oči od monitoru, ba dokonce sedí zády k přednášejícímu), takže se nesnažím nějak na sebe upoutávat pozornost ani při dotazech na například SVG.

Velice mile na mě však působí prostředí výuky. Ta totiž probíhá v jedné z optických laboratoří, řekl bych spíš v laboratoři elektroniky. Náramně mi to tu připomíná laboratoře měření ze střední – akorát samozřejmě 100x modernější. Moderní digitální osciloskopy (tlačítko „AutoScale“ je smozřejmostí na každém) na každém rohu měřícího stolu, všude spousty zásuvek (bohužel obsazených další měřící technikou.

Když si vzpomenu na staré počítače s Windows 95 připojenými přes gamePort na obrovskou topící a cvakající UNIMU, která stejně nic nenaměřila a tady vidím krabici „velkou“ jak dva smartphony se dvojnásobným počtem vstupů a výstupů připojenou přes sériový port k počítači s LCD monitorem, xpéčky, USB konektory na flešku (už žádné diskety!) a připojením k internetu, trošku mě mrzí, že se mi nezdařila Elektřina a magnetizmus, neboť v této laboratoři probíhají praktika z tohoto předmětu.

Skončili jsme dřív, což mne moc netěší akorát mi tu vznikla díra moc krátká na nicnedělání a moc dlouhá na dělání něčeho…

Další hodinu po nás dokonce i něco chtěl, ale u mě viděl, že tam něco datlím, tak jsem během asi 8 vteřin nacpal pár html tagů do souboru s nějakými hlavičkami a doufal, že po mě nebude chtít prohnat to validátorem. Ve volných chvílích si jezdím nahoru a dolu s židlí a uvažuji o tom, že bych se natáhl po zadání měření úlohy „Nelineární a řízené prvky“ a začal vzpomínat na střední …

Nejneužitečnější aplikace na světě

Na internetu se nachází spousty videí s takzvanými „naprosto zbytečnými“, „nejzbytečnějšími“, „nejneužitečnějšími“ či doslovně „nejméně použitelnými“ věcmi, jako je třeba tato:

Všechny tyto předměty mají stejnou funkci. Každý obsahuje nějaký vypínač, po jehož zapnutí se zařízení uvede do chodu a začne konat svou běžnou činnost. Jenže tou není nic jiného, než co nejrychleji onen vypínač znovu vypnout.

Když jsem to viděl poprvé, začal jsem s úžasem slintat, že takto geniální vynález musím mít. Ale nebyl čas, materiál, kapitál, podmínky a ani nějaká velká motivace – k čemu vám taky ta nejneužitečnější věc na světě taky bude, když vlastně nemá žádné užití, že?

Časem jsem však na tento magický předmět narazil znovu a zrovna jsem měl alespoň ten čas a hlavou mi problesklo: „Vždyť to půjde realizovat i softwarově!“.  A během pár vteřin jsem si zakládal html soubor a začal vzpomínat na html, css a jQerry (které jsem vlastně nikdy pořádně neuměl).

Hrál jsem si s tím asi 2 dny a tady je výsledek:

Nejneužitečnější aplikace online

A nebo v anglickém provedení:

The most unuselless app online

Me Blogista aneb kterak jsem začal psát blog

Ano, psaní mě vždycky bavilo. A to nejen zdrojových kódů. Docela slušně si můžete počíst třeba v kampani Drag Race, obvykle jsem se rozepsal taky v protokolech (především do měření)  a nebo vlastně na tomhle celém webu.

I když jsem z češtiny většinou neměl zrovna nejlepší známky (už na prvním stupni jsem byl jeden z těch, co neměli na vysvědčení „samé“), na střední jsem jeden čas z češtiny propadal a ze slohovek jsem míval věčně trojky až čtverky. Ale že jsem střelec, tak jsem to občas i nějak vytrollil, takže pamatuji, kdy jsem jednu ze slohových prací (jak nečekaně odborný popis blikače) napsal snad jen s jednou jedinou chybou.

Když jsem si šel pro maturitní vysvědčení, potkal jsem cestou pana profesora z češtiny, který mi opravovoval písemku a pochválil mne za moc pěknou práci (což slovy Cermatu znamenalo 100% bodový zisk). K mému překvapení mi pak na maturitním vysvědčení zářila jednička ze Základní úrovně z Českého jazyka.

Me Blogista

Bylo rozhodnuto. Budu psát. Bohužel ze začátku nebylo moc času, jen jsem sem tam něco přihodil sem (a to většinou něco o programování nebo Linuxu). Když už mi v hlavě kolovalo několik návrhů, kterým bych přiblížil mé zážitky z vysoké (už jen proto, abych nemusel všem všechno vysvětlovat), založil jsem si skromně alespoň rubriku Deník studenta Univerzity Palackého.

Ani ta však svým názvem moc neumožňovala psát obecné články na aktuální dění a tak jsem teď, když jsem dokončil Anny’s Lab založil rubriku Me Blogista (původ tohoto sousloví vám jistě není třeba vysvětlovat) a začnu sem postupně, jak bude čas, přidávat různé články, které se mi v tuto chvíli honí hlavou.

Za celý tým martlin’s webu (pohled doleva, pohled doprava), tak dobře, já jako autor, admin, editor, designer, vlastník  a správce martlin’s webu vám přeji  zábavné počtení a očekávám spousty komentářů, sdílení a lajků (bože, to zní jak na nějaké laciné facebokové stránce).

Moje nová hra! Bludišťovka Anny’s Lab

Když jsem se letos (rok 2012) někdy koncem června vrhl na C++ s tím, že se jej přes prázdniny naučím, ať toho nemám poté v zimním semestru moc, opět jsem plánoval jaký to větší projekt si v něm napíši. Původně jsem si chtěl reimplementovat knihovnu clmg (Common Lisp Micro Graphics) sloužící k jednoduché grafice na základě objektové struktury, kterou jsem používali v Předmětu Paradigmata Programování 2.

Logo Anny's Lab
Logo Anny’s Lab

Ale přecházet z okenního rozhraní do klasického textového terminálu není u grafické knihovny úplně to nejideálnější a tak mi z clmg zůstala jen třída Point. Poté jsem si k ní začal dopisovat další tři třídy a bludišťovka se pomalu začala rýsovat.

Pod původním názvem Labyrinth tak začala vznikat obyčejná konzolová bludišťovka pro večery na chatě, kde nemám internet, nebo na přednášky, kde internet obvykle mám, ale zase mi většinou nestačí baterie notebooku na nějaké náročnější grafické hry.

Postupem času mi název Labyrinth přišel poněkud nevhodný a obyčejný (i když se zpětně zamyslím nad názvy Drag race a Předměstí Simulátor, nebylo by to nic neobvyklého). Vzhledem k tomu, že postavička, která se v labyrintu pohybuje je reprezentována zavináčem, vznikl návrh na zakomponování nějakého jména začínajícího na ‚A‘ do názvu programu. Když jsem hledal vhodný  znak, kterým se budou vykreslovat zdi, mi ze spousty znaků, které jsem zkoušel, padlo do oka velké písmeno W, které až náramně připomíná nějakou rostlinu nebo keřík.

Naštve
Naštve

A bylo jasno.  Mí skalní fanoušci navíc totiž ví, že do každého svého programu zakomponovávám nějakou osobu ženského pohlaví z mého okolí. A není proto divu, že předmětem kampaně Anny’s Lab se stala bioložka Anny pracující ve své laboratoři, které se poněkud přemnožil zmutovaný a geneticky upravený jinak úplně obyčejný trávník, který podobně jako v pohádce o Šípkové Růžence zaroste celým areálem (a vytvoří tak labyrint, kterým se musí Anny dostat ven). Od té doby jsem Anny’s Lab nenazýval jinak, než „Anča a Lenča“.

Kampaň je však jen jedna z mála funkcí, kterou Anny’s Lab nabízí. Celá hra je vlastně založená na tom, že se zvolí tzv. číslo labyrintu, podle kterého je poté labyrint náhodně vygenerován. Můžete tak hrát téměř nekonečný počet různých náhodných a pseudonáhodných labyrintů, různých velikostí a uspořádání.

Jednoduchý labyrint
Labyrint s jednoduchou strukturou

Vzhledem k tomu, že hra byla komplet vyvíjena na platformě GNU/Linux, je linuxu přímo šita na míru. Naopak na Windows s ní byly nemalé komplikace. Bohužel právě proto si nebudete moct pořádně užít hru Anny’s s použitím knihovny ncurses, kdy se hra vůbec neseká, každou klávesu nemusíte potvrzovat Enterem a dokonce se setkáte i se skromným barevným provedením.

Program používá starou knihovnu z MS DOS, kterou však na Windows za boha neseženete, zatímco na Linuxu ji nainstalujete jedním příkazem.

Střeva programu

Program je sice oficiálně psán v jazyce C++, já osbně bych spíš použil označení C/C++. Když jsem totiž chtěl načítat stisknuté klávesy bez potvrzování Enterem, vygooglil jsem funkci getch() z knihovny ncurses. Jenže tato knihovna byla určená pro jazyk C a nikoliv C++, takže většina vstupně-výstupních operací je realizována funkcemi jako printw a getch, držel jsem se standartu a kde nebyla použita knihovna ncurses, používal jsem funkce z knihovny cstdio – printf, getchar  a podob.

Čistého času jsem na Anny’s Lab pracoval něco kolem dvou a půl měsíce, kde z toho jsem ale fyzicky pracoval v průměru tak hodinu až dvě denně (to víte, prázdniny). Asi vás nepřekvapí, že nejvíce času padlo na jádro celé aplikace – metoda třídy Map na generování labyrintu.  Chtěl jsem být profesionální a najít si nějaký slušný algoritmus na generování. Tato diplomová práce věnující se přesně této problematice  mě však pouze přesvědčila, že opravdu nejlepším řešením bude úplně obyčejný hloubkově rekurzivní algoritmus typu „horník“.

První hra
První dohraná hra (17. srpna), můžete vidět tuny ladících výpisů

Nicméně pořád jsem je v reálném čase nedostal na Labyrint větší než 800×800. A bylo mi naprosto jasné proč. Ta metoda, která se starala o průchod jedním uzlem je sice na pochopení velmi jednoduchá, ale implementačně poněkud složitější. Neustálé kopírování konstantních parametrů a vytváření stále nových proměnných, jako iterační proměnná i na začátku každého volání zkrátka zbytečně žerou obrovské množství času.

Začal jsem tedy vzpomínat na cvičení z algoritmiky, jak přepsat hloubkovou rekurzi. Nejdřív jsem si ji přepsal použitím fronty na průchod do šířky, dokázal jsem generovat labyrint až do velikosti asi 12000×12000, nicméně vypadal jak hvězdice se středem ve startu. Po několika dnech intenzivního algoritmování jsem na to přišel.

Na zásobník si bude ukládat vždy čtveřici uzlů, do kterých se vydat (v pospřeházeném pořadí), také uzel, ze kterého se do tohoto „aktuálního“  došlo a ukazatel (index i), kterým z těch směrů se má nyní vydat. Pokud došel do validního uzlu, vytvořil si posloupnost s ním sousedících, spolu s ní na zásobník uložil bod, ze kterého tam došel, a index prvního z nich, načeš se do něj hned vydá. Pokud validní uzel nenašel, šel na další v pořadí (zvýšil index aktuálního uzlu o 1) a pokud další takový nebyl (byl poslední), odebere tuto celou skupinu ze zásobníku a jde o úroveň výš.

Toto řešení je taktéž celkem elegantní (obzvlášť, když je v C++ zásobník implementován ve standartní knihovně), a především velmi efektivní. Paměť mi většinu dojde, až když se snažím generovat labyrint větší než 14000×14000.

Až nebudu mít týden co dělat, nakoupím energiťáky, nachystám si rozvoz pizzy na rychlou volbu, vygeneruju si labyrint 10000×10000 a budu hrát…

Zbytek už byl celkem hračka. Až na pár drobností, jako třeba metoda, která k uzlu vrátila některý náhodný sousední uzel tak, aby ležel na mapě. Nejdřív jsem se snažil testovat, jestli není moc blízko okraji mapy, ale kraje mapy jsou 4 a navíc se můžou kombinovat (rohy), takže po asi 20 řádkách testování a ifování, jsem skončil tím, že jsem náhodně vygeneroval některý z okolích bodů (na to stačily 2 řádky) a to opakoval, dokud se tento náhodný uzel nenacházel v mapě.

Docela mě překvapilo i parsování argumentů z příkazové řádky. Když jsem si uvědomil, jako všelijaké kombinace chybných stavů můžou nastat, sáhl jsem až na dno kapsy a vytáhl výjimky a díky nim se kód rozrostl o pouhých 240 řádků.

A úplně zabilo, když jsem vlastně poprvé tvořil program rozdělený do více souborů (což jsem poněkud nešikovně dělal úplně nakonec), a vůbec to nechtělo fungovat. Nedošlo mi, že se soubory (a tedy i bloky funkcí celého programu) na sobě sice závisí, ale víceméně řetězovitě a ne každý na všech ostatních. Takže soubor s deklaracemi maker je naprosto nezávislý a tak jde zkompilovat rovnou. Na něm závisí soubor s deklaracemi všech funkcí, na něm pak definice pomocných funkcí, díky ní pak půjdou zkompilovat třídy Point a DrawabePoint, … až přes definice hlavních, „jaderních“ funkcí (a z nich ta úplně nejhlavnější – Hlavní Menu) až po samotnou funkci main.

Pak už stačilo jen napsat Makefile (a dva dny řešit, proč to nelinkuje knihovnu ncurses, ikdyž ji jistojistě inkluduji), zabalit, zkompilovat i na Windows (i to byla celkem estráda) no a napsat to, co si nyní čtete.

Ke stažení

Ke stažení dodávám jak zkompilované verze pro MS Windows, tak i balíčky zdrojových kódů pro obě platformy.

Anny’s Lab Verze pro Windows 32bit (.exe)

Anny’s Lab Verze pro Windows 64bit (.exe)

Kdo má koule na labyrint 5000x5000?
Kdo má koule na labyrint 5000×5000?

Anny’s Lab je totiž distribuován pod licencí GNU/GPL a je Open Source, tedy je volně ke stažení včetně zdrojových kódů.

Zdrojové kódy Pro Windows (Přibalen soubor pro Microsoft (c) Visual Studio)

Zdrojové kódy Pro Linux (Přibalen Makefile)

Ty předkládám především pro uživatele operačního systému GNU/Linux – v programu je přibalen také Makefile a tak si jej prostě zkompilujete pomocí programu make.

Pokud nemáte nainstalovanou knihovnu ncurses, musíte programu make říct, že Anny’s Lab funkce z ncurses nemá používat a to:

Nebo zakomentováním řádku

v souboru declarations.cpp. Více o používání knihovny v souboru COMPILATION a v hlavičkových komentářích souborů declarations.cpp a main.cpp.