Weblog about my projects

  • Vývoj Pacmana – Den 4

    Hru programuji v C++ s knihovnou Qt, se kterou už mám pár dobrých zkušeností. Sice bych to měl správně programovat v kombinaci C# + .NET, ale zkusil jsem napsat cvičícímu a záměna mu nevadila. Ušetřil jsem si tím lapálie spojené s programováním ve Windows, Qt je totiž na rozdíl od .NETu multiplatformní. Při psaní mi trochu chybělo debugování Visual Studia, používal jsem totiž IDE zvané QDevelop, které v tomhle ohledu dost zaostává.

    Dnes v 8 hodin vypršel čas na odevzdání finální verze zápočtového programu. Špatně jsem odhadnul práci, posledních pár dnů proflákal a strávil pařbou na Let it roll, takže jsem v noci spal jenom asi 3 hodiny. Můj mail ale odešel včas, přesně v 8:00. Včera po desáté hodině jsem dodělal základní třídy starající se o zobrazení objektů na hrací ploše a jejich pohyb  v rámci dlaždicové mapy. Nezbylo mi tedy moc času na nejtěžší část Pacmana, AI. V časové tísni jsem se  sice pokusil napsat nalezení nejkratší cesty k Pacmanovi za pomocí prohledávání do šířky, jenže moc nefunguje a příšerky chodí chvíli pseudonáhodně, dokud se trvale nezaseknou v jedné části bludiště.

    Snažil jsem se dodělat základní featury hry, mezi které patří i jezení “žracích kuliček”. Chovají se podobně jako normální jídlo, problém ale spočívá v tom, že zvýší rychlost Pacmana. Ve vyšší rychlosti pak hráč často nemůže změnit směr, protože musí stisknout šipku ve chvíli, kdy se nachází do 20 pixelů od křižovatky (má na to přibližně 180ms). Co se týče žracích kuliček, dokonce se mi dvakrát stalo, že mi po jejich snědení úplně vytuhnul počítač. Nemám zdání, co se v tu chvíli stalo, jen doufám, že tahle nedebugovatelná chyba sama zmizí.

    Poznámka na okraj: Při psaní tohoto příspěvku se mi poprvé v životě kvůli přehřátí vypnul počítač. Teplota se pohybovala vysoko, o tom žádná. Na pozadí běžel `emerge -vu world`. Myslím si ale, že teplota tohohle notebooku už během uplynulých tří a půl let dosáhla vyšších hodnot. Zřejmě je vypínání při přehřátí vychytávka nového kernelu 2.6.30.

    Dnes v 8 hodin byl termín odevzdání finální verze zápočtového programu. Spal jsem asi 3 hodiny a
  • Vývoj Pacmana – Den 1

    Dneškem začínám psát zápočtový program na programování, hru Pacman. Nebaví mě hrát nové hry spoléhající se na grafiku a super efekty. Mám rád jednoduché old-school hry, které člověka nevcucnou a měsíc nebo rok nepustí. Mezi takové hry patří i Pacman, známá jednoduchá hra se žlutou koulí, duchy a fascinujícím zvukem “waka waka”. O popularitě a kulturním vlivu svědčí i fakt, že videohra Pacman vystupuje v zásadní roli v jednom dílu kultovního seriálu Přátelé.

    Co jsem tedy dnes udělal?

    • UI v designeru a napojení na akce (které ale ještě nic nedělají)
    • namaloval obrázek Pacmana, přidal ho do zdrojů a vložil ho do QGraphicsView
    • sehnal pár zvuků a rozchodil knihovnu pro audio (Phonon)
  • Popup upozornění na změnu písničky v MPD

    Zkouškové je období, kdy se má student učit. Bohužel zjišťuji, že se o zkouškovém učím ještě míň než v průběhu semestru. Moje nechuť dělat cokoliv do školy tak dala vzniknout další utilitě pro MPD.

    Zachtělo se mi vědět, jaké písničky moje MPD právě přehrává. Po chvilce hledání jsem našel skript, který používá Galago notification-daemona. Přišlo mi ale zbytečné používat dalšího daemona, když už mám standardně puštěného knotify4 kvůli aplikacím KDE. Napsal jsem si tedy vlastní KDE aplikaci, která zobrazuje pěkné popupy včetně album arts.

    Screenshot
    Screenshot

    Další info na http://mpd.wikia.com/wiki/Client:MpdKNotifier

    UPDATE:  xaizek vylepšil můj MpdKNotifier a zveřejnil kód na GitHubu. Doporučuji použít tuto verzi.

  • Zobrazování textů písní pro MPD

    Narazil jsem na další problém přehrávače MPD. Kvůli absenci grafického rozhraní nemá jak zobrazovat texty písní. Zkoušel jsem různé skripty, které mají texty zobrazovat, ale žádný nefungoval, takže jsem se rozhodl obětovat chvíli času a napsat si skript vlastní.

    Zajímavé bylo řešit, jak texty získat. Existuje totiž spoustu webů s databázemi textů, které jsou ale značně pochybné a texty se z nich špatně vytahují. Napadlo mě použít nejlepší výsledek vyhledávání v Yahoo! a zobrazit ho v prohlížeči. Yahoo! poskytuje webovou vyhledávací službu BOSS, pomocí níž by se toto implementovalo velice snadno. Bohužel testování ukázalo, že v praxi Yahoo! na první pozici často nedá správný odkaz. Škoda… Ještě v souvislosti s vyhledávači a jejich službami mě překvapila skutečnost, že Google tu svojí přestal poskytovat.

    Vzpomněl jsem si na Amarok a na jeho řešení vyhledávání textů písní, které ve verzi 2.0+ funǵuje docela spolehlivě. Po chvilce pátrání ve zdrojácích jsem objevil službu lyricwiki.org. LyricWiki.org podporuje vyhledávání textů pomocí SOAP, což je pro programátora velká výhra 🙂 Zbytek práce už bylo jenom skládání v Ruby.

    Více o skriptu na oficiálních stránkách MPD

  • MPD hack v Ruby

    Vždy jsem byl příznivcem hudebního přehrávače Amarok. Nedávno mě ale jeho autoři naštvali. V nové verzi 2.0 jako databázový backend použili MySQL embedded. To je sice pěkné, ale tahle vlastnost je dostupná jenom v nejnovějších experimentálních verzích MySQL 5.1. Vzhledem k tomu, že MySQL potřebuji do práce, nechci nainstalovat nestabilní verzi, která se chová jinak než verze MySQL na ostrém serveru.

    Před pár lety jsem používal jako hudební přehrávač MPD, a tak mě napadlo, že bych se mohl podívat, jak se za tu dobu změnil. Přehrávač MPD je zajímavý hlavně svojí architekturou — vlastní MPD se chová jako server a existuje spousta klientů, které se k němu připojují a doplňují přehrávací GUI. Vzhledem k tomu, že dávám přednost rychlým konzolovým aplikacím, vybral jsem si klienta ncmpcpp, který má jednoduché, ale přitom efektivní rozhraní.

    Oproti Amaroku mi ale chyběla jedna důležitá vlastnost hudebního přehrávače — možnost přehrávat hudbu z externího disku. Amarok to řeší tím způsobem, že kromě songů z vlastní databáze umí přehrát i soubory vybrané v integrovaném prohlížeči souborů (KPart). Pro MPD je tohle bohužel docela velký problém. Rozhodl jsem se proto napsat si vlastní hack 🙂

    Můj oblíbený filemanager Midnight Commander umí samozřejmě spustit hudební soubory jakýmkoliv programem mu řeknu. Takže mi stačilo napsat prográmek, který vybrané hudební soubory přidá do playlistu MPD. V praxi to provádím tak, že ve složce na lokálním disku, kam MPD může, vytvořím symbolický odkaz na soubor z externího disku. Když pak MPD pustí aktualizaci databáze, zaindexuje i tyto soubory a tím pádem už je možné je snadno přidat do playlistu a přehrát.

    Napsat takový krátký program v kompilovaném jazyce mi přišlo nevhodné a v PHP zas jako naprostá prasárna. Ze skriptovacích jazyků se podle mě k tomuto účelu nejvíc hodí jeden z jazyků Perl, Python nebo Ruby. Ačkoliv každý z této trojice jazyků má něco do sebe, nakonec jsem si vybral Ruby. Na Ruby se mi líbí jeho filozofie “Všechno je objekt” a “Princip menšího překvapení”. Ruby má také interaktivní shell zvaný IRB, což je docela pěkná věc, ve které se dají zkoušet rozmanité jazykové konstrukty a kterou používám místo kalkulačky.

    Zdrojový kód hacku je ke stažení zde. Pro ovládání MPD používám knihovnu librmpd.rb.

    Instalace

    Otevřete mpdplay.rb v editoru a nastavte MUSIC_DIR na složku s hudbou, jakou máte v konfiguraci MPD.

    $  vi mpdplay.rb

    Dále spusťte:

    #  mv mpdplay.rb /usr/local/bin/mpdplay
    #  chmod +x /usr/local/bin/mpdplay.rb
    #  mv librmpd.rb /usr/local/lib/
    $  vi .mc/menu

    Na konec souboru .mc/menu přidejte text:

    |   Enqueue
    mpdplay -a %f
    \   Play
    mpdplay %f

    Otevřete .mc/bindings

    $  vi .mc/bindings

    Upravte

    regex/\.([mM][pP]3)$
    View=%view{ascii} mpg123 -vtn1 %f 2>&1 | sed -n '/^Title/,/^Comment/p;/^MPEG/,/^Audio/p'
    Open=mpdplay %f
    
    regex/\.([oO][gG][gG])$
    View=%view{ascii} ogginfo %s
    Open=mpdplay %f

    A je to! Kdykoliv teď chci přehrát soubor, zmáčknu v Midnight Commanderu F2 a \ pro přehrání nebo | pro zařazení do playlistu.

  • Catching up

    Od publikování posledního příspěvku už uběhly 2 měsíce, což je docela dlouhá doba. Bohužel s nástupem do školy se radikálně změnil můj časový plán a ubylo chvil na programování pro zábavu. Dneska se ve škole konal Den otevřených dveří, díky němuž nám náhodou odpadla odpolední přednáška. Rozpadla se nám i úterní pivní seance, a tak jsem si vzpomněl na svůj blog 😉 Škola sice žere ohromnou porci času, na druhou stranu ale s postupujícím studiem teorie programování cítím, že kvalita mnou psaných algoritmů roste, a to mě skutečně těší. Tento přímý důsledek studia mi dodává motivaci k překonání všech ostatních šílených předmětů, ze kterých budu muset v lednu skládat zkoušku.

    A cože to dělám, když zrovna nepracuji nebo nejsem ve škole? Kromě občasných prací na novém Bloogu píšu PHP třídu pro posílání zpráv přes XMPP. Musím říct, že možnosti tohoto protokolu mě značně překvapily. Doteď mi není zcela jasné, proč se tenhle stavový protokol používá ve větší míře pouze pro kecálky. Místo toho, abych brouzal webem, kdykoli chci zjistit nové informace, by mi stačilo použít malého a efektivního speciálního klienta. Kámen úrazu takového přístupu spočívá zřejmě v tom, jak donutit uživatele, aby si stáhnul, nainstaloval a používal klienta, když na webu může cokoliv snadno ovládat pomocí okna prohlížeče.

    Tu třídu na posílání zpráv (momentálně ve stavu \(\alpha\) verze) chci použít k usnadnění administrace Bloogu – nechám si totiž pravidelně posílat na Jabber zprávy o přírůstcích do databáze. Díky tomu budu moci administrovat portál pouze v případě potřeby. Zároveň se zrychlí odezva mých administračních kroků, která je nyní kvůli mé lenosti vcelku bídná.

    Dále se chystám na jeden zvláštní projekt, který potřebuji do školy – zápočtový program. Zadání už jsem si vybral. Budu programovat úlohu

    Pretty printer

    zdrojový text v Pascalu převede do HTML s tím, že
    – zvýrazní klíčová slova
    – rozdělí do řádek
    – odsadí vnořené příkazy

    Výběr jazyků máme omezený na Pascal a C#, což je snad nejhorší výběr, jaký jsem si mohl přát. O víkendu jsem měl tu čest se seznámit s MS Visual Studiem a musím podotknout, že se mi v C# a .NETu pracovalo vskutku příjemně. C# přebírá to, co je dobré z Javy, C++ i Pascalu. .NET pak doplňuje knihovny pro usnadnění práce. Škoda jen, že kvůli “skvělé” politice jeho tvůrce, Microsoftu, není .NET nativně podporován jinde než na XPčkách a ve Vistě. Můj odpor k prehistorickému Pascalu ale překoná i nepohodlí plynoucí z občasného nabootování Windows.

    Ačkoliv se jedná o projekt menších rozměrů, věřím, že má smysl. Vstup bude sice v Pascalu, ale nebude velký problém změnit pár podmínek a umožnit vstup v rozumnějším jazyce.

  • LaTeX, WordPress a freehosting

    Pokud jste se s LaTeXem ještě nesetkali, tak vězte, že LaTeX je značkovací jazyk umožňující sázet dokumenty ve vysoké kvalitě. Kvalita a krása vysázených dokumentů (např. v porovnání s Wordem), prakticky neomezená kontrola nad vším, co se objeví na papíře, stejně jako jednoduchost zápisu symbolů a matematických výrazů činí z tohoto jazyku neocenitelnou pomůcku. Pro psaní v TeXu stačí umět pár příkazů a vědět, kam je napsat, aby se kód přeložil.  Největší výhodou LaTeXu je pro mě jednoduché psaní zápisků ve škole. Víc info o \(\TeX\)u najdete v tomhle článku.

    Při psaní blogu muselo dříve či později dojít k situaci, kdy jsem chtěl zapsat TeXovský symbol. Teď se sice jedná jenom o malou šipku vpravo, myslím ale, že čisté řešení je nalézt/naprogramovat algoritmus, který se postará o vyhledání příkazů LaTeXu a nahradí je správně vysázeným výrazem. Pro WordPress, což je blog software, na kterém běží tenhle web, existují 2 pluginy, které se snaží tento problémem řešit. Bohužel, první vyžaduje na serveru nainstalovanou hromadu TeXových knihoven, které na mém freehostingu nejsou, a druhý stahuje obrázek LaTeXového výrazu z veřejných služeb (jedna běží shodou okolností na serveru wordpress.com) do cache a z té ho poté zobrazuje. Ukázalo se ale, že na mém freehostingu se nelze připojovat z PHP k vzdáleným serverům, takže plugin nemůže fungovat. Musel jsem tedy naprogramovat něco vlastního.

    Rozhodl jsem se zachovat funkci cache obrázků, protože nechci svým malým blogem ohromně zvýšit zátěž na generování obrázků na veřejné službě. Problém jsem vyřešil tak, že jsem na svém normálním hostingu na Bloogu umístil skript, který se stará o mirroring. Využil jsem plugin Latex for WordPess a upravil jsem kód tak, že pouze nahrazuje TeXovský zápis obrázky, které jsou v prohlížeči uživatele požadovány z mé mirror služby na Bloogu. Mirror služba pak funguje tak, že se podívá na disk, jestli už daný výraz někdy generovala a pokud již obrázek existuje, pouze ho vrátí. Když obrázek neexistuje, tak ho stáhne z generovací služby na wordpress.com.

    Tohle řešení mi taky umožňuje používání TeXu na jiných stránkách a fórech, které LaTeX defaultně nepodporují. Stačí mi vložit obrázek, jehož zdroj se skládá z http://tex.beta.bloog.cz/? a požadovaného výrazu. Výsledek pak vypadá třeba takto: \(\frac{1}{\pi} \cdot \frac{5}{2}\)

    Jestli jste narazili na stejný problém, kód si můžete stáhnout zde.

  • Nově ZEE.cz™

    Pravidelně jednou za rok, vždycky ke konci na přelomu srpna a září, dostávám zálusk na novou doménu. Při výběru koukám na to, aby doménové jméno mělo určitý potenciál značky. Předloni jsem zaregistroval bloog.cz. Už si nepamatuji, jestli to bylo před nápadem naprogramovat RSS agregátor nebo po něm, ale doména “bloog” byla pro ten účel dle mého názoru ideální. Loni jsem za pomoci důmyslného programu objevil pár domén, které se mi zdály cenné. Kritéria byla jasná – hledal jsem cosi krátkého a srozumitelného, aby se to rychle psalo do řádku s adresou a také aby se to dobře pamatovalo. Moje chytrá utilitka mi přes noc vyplivla seznam pěkných domén, z nichž jsem uvažoval o koupi domén dyne.cz a/nebo kul.cz. Nakonec jsem se k jejich registraci neodhodlal. Dneska jsou už obě registrované, na dyne.cz je jakýsi inzertní server a kul.cz je na prodej s redirectem na eshop se zbožím z Nepálu.

    Letos se situace změnila mimo jiné tím, že registrace české domény stojí místo 450 zhruba 270 korun. Také jsem si založil tenhle blog a začalo mi vadit, že vždy, když mám do profilu vyplnit web, rozhoduji se mezi bloog.cz, což ovšem není můj osobní web, nebo horec.bloog.cz, což je zase adresa, která nevypadá příliš profesionálně. Hledal jsem tedy doménu, která by splňovala moje nároky jak z hlediska eventuální prodejnosti, tak s tím, že ji využiji k vlastní prezentaci. Bohužel, letos už jsou WHOIS servery vybavené omezeními, které můj prográmek blokují. Musel jsem tedy testovat napůl ručně. Napůl proto, že jsem si napsal jiný prográmek, který mi přednášel nápady na domény a já z nich testoval ty, které jsem uznal za vhodné.

    Kromě evidentního úlovku zee.cz jsem přemýšlel nad yay.cz. Yay je sice lepší v tom, že je to slovo, má nepochybně i lepší statistiky hledanosti, ale vadí mi na něm jeho význam citoslovce. Jako perličku jsem objevil taky to, že “yay” je v USA výraz pro kokain. Schválně, jestli si doménu někdo do příštího roku koupí 🙂

  • Hořec zase bloguje

    Název obsahuje tu informaci, že jsem dostal nápad, založit si blog. Zase. Přiznivce svého 2 a půl roku starého blogu Horec.tk ale bohužel musím zklamat. “Back to basics” se totiž nekoná.

    Ráno jsem vstal a napadlo mě, že by bylo docela cool, kdybych si založil vlastní blog po vzoru vývojového týmu Opery. Dneska má totiž každý správný developer a každý pořádný projekt vlastní blog. Výhoda blogu spočívá v tomhle případě naprosto jasně v tom, že přirozeně vytváří dokumentaci. Poznámky, které jsem čas od času napsal do CVSka, už dávno nepíšu. Mnohem příjemnější se mi zdá psát dokumentaci ve formě článků. Výhod je mnoho. Za prvé si procvičím psaní, což se jistě bude hodit zhruba za 2 a půl roku, kdy přijde čas zdolat bakalářku. Za druhé CVS umožňuje popsat provedené změny pouze zpětně až po jejich provedení. S přibývajícími zkušenostmi v programování větších projektů jsem došel k názoru, že nejefektivnějšího tvoření softwaru se dá dosáhnout jedině důslednou analýzou požadavků, promyšlením správné koncepce a také domyšlením detailů, které se, ačkoliv to v počátku nemusí nikdo předvídat, můžou časem rozvinout a sehrát zásadní úlohu v aplikaci nebo se stát největším lákadlem pro uživatele. Právě psaní článků mi v tomhle ohledu přijde jako skvělý nástroj. Předem důkladně promyšlený a popsaný návrh s jasně daným cílem má daleko větší šanci na úspěch než chvilkové zápalení se pro určitou věc, která ale nemá žádnou budoucnost. Člověk musí vědět, co má aplikace ve výsledku dělat, a tím, že to napíše na papír nebo pověsí na internet se svým způsobem zavazuje k tomu, že danou věc udělá. Dobrý nápad, jak se motivovat k práci je slíbit sobě, popřípadě někomu jinému, že bude něco v tu a tu dobu hotové. To se pak většinou stane. Takže když slíbím virtuálním a mně zcela neznámým návštěvníkům svého bloogu, že do konce roku spustím novou verzi agregátoru Bloog.cz, musí se tak stát.

    Další aspekt blogu se týká čitelnosti a srozumitelnosti článků. Už jsem zmiňoval, že mě nebaví psát komentáře do CVS, ještě jsem ale nenapsal, že taky nesnáším čtení těch stručných tagů. Přílišná stručnost, neznalost příčin a důsledků úprav způsobuje, že po pár letech se v nashromážděných patchích a bugfixech nevyzná nikdo, dokonce ani já sám. Myslím, že výhody srozumitelné dokumentace nemusím vypisovat. Důležité je, že se v projektu zorientuji jak já, tak případně někdo jiný, kdo by se k mého projektu připojil nebo by v něm pokračoval, kdybych ho já z nějakého důvodu opustil.

    Základní pohnutka, stojící za celým tímhle blogovacím nápadem, se týká mých příprav k programování druhé verze blogportálu. Druhá verze bude disponovat jednodušším ovládáním, hezčím designem (snad) a také několika novými funkcemi. Nejvíce změn se dočká administrace, kterou sice vy nevidíte, ale do které se teďka děsím chodit do té míry, že radši spravuji portál přímo v databázi přes phpMyAdmina. Zatím pracuji na návrhu nového designu, podle kterého pak vymyslím strukturu tříd a šablon, o tom ale zřejmě napíšu více až v některém z příštích příspěvků, které se budou týkat speciálně blogportálu. Další problém, o kterém bych na tomto místě rád poreferoval, má název KPortable a jedná se o můj maturitní projekt na informatiku. Jedná se o správce baterky notebooků pro Linux, konkrétně pro grafické prostředí KDE verze 4. K maturitě sice program posloužil dobře a dokonce ho sám používám, rád bych ho chtěl ale dodělat do takové fáze, aby se z něj stal balíček, který by mohli používat i ostatní. K tomu účelu bych chtěl, aby se balíček zařadil do repozitářů distribucí (stačilo by Gentoo). Web k tomuhle projektu si můžete prohlédnout zde, nedočtete se tam ale o jeho nedostatcích. Program by potřeboval otestovat na něčem jiném než na mém počítači, což ovšem není jednoduché, protože zatím neznám nikoho, kdo by měl funkční linuxový notebook s KDE4. Pak také musím program upravit tak, aby mohl zobrazovat i jiné jazyky než angličtinu. Na KPortable mě čeká ještě mnoho práce. Kolik, to je ve hvězdách. Teď ale zpět na zem.

    Neočekávejte, že bych sem psal pravidelně každý den, týden nebo měsíc. O svém životě se veřejně šířit nechci, novinky z různých oblastí kultury/vědy/společnosti si můžete najít sami, takové blogy přece už spoustu lidí píše. Tady naleznete akorát mě a moje projekty.