LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (64) - Projekt - čtečka sportovních výsledků

Perl Protože jsme se dosud zabývali výhradně teorií, věnujeme následujících 6 dílů na napsání snad prvního smysluplného programu v tomto seriálu.

5.10.2007 06:00 | Jiří Václavík | Články autora | přečteno 13836×

Dosud jsme v seriálu uváděli pouze minimum příkladů. Byly to příklady pro příklady - tedy vesměs co nejstručnější vyumělkované programy bez většího smyslu. Jejich účelem bylo pouze demonstrovat určitou část syntaxe.

Dnes zahájíme práci na textové čtečce sportovních výsledků, což by mělo přinést zpetření seriálu.

Práci na každém větším projektu lze rozdělit do několika etap. Programování je pouze jednou z nich. Podle velikosti projektu se těmto etapám přisoudí důležitost, která se projeví zejména na časové organizaci. Čím větší projekt, tím je obvykle čas na programování v porovnání s analyzováním a přípravou menší. Na velikosti projektu také záleží to, z kterých fází se bude postup skládat.

Nás toto členění však zase tolik trápit nemusí, protože půjde pouze o poměrně malý projekt. Spoustu fází, jako například hardwarové nároky tak nemusíme řešit vůbec.

První věcí, kterou bychom si tedy nyní měli ujasnit je, co vlastně budeme psát.

Cíl projektu

Jak již bylo řečeno, napíšeme program pro čtení výsledků kopané. Výsledky budeme získávat extrakcí z vybrané internetové stránky. Zmiňme rovnou, že to bude napevno www.livescore.com. Toto řešení má sice několik zásadních nevýhod, ale ukážeme si na něm některé zajímavé postupy.

Prvotní představa o tom, co by náš program měl umět, je taková:

  • vypsat všechny zápasy, které se hrají dnes (tedy v podstatě seznam zápasů na www.livescore.com/default.dll?page=home)
  • vypsat všechny zápasy z národních resp. mezinárodních soutěží (získávat je budeme z www.livescore.com/default.dll?page=jméno_soutěže)
  • každý zápas může být v době volání v jedné ze tří fází.
    1. zápas ještě nezačal
    2. zápas se právě hraje
    3. zápas se již dohrál
    Tyto fáze musíme ve výpisech zápasů zřetelně odlišíme
  • u každého zápasu by měla být informace o názvu soutěže, údaj kdy zápas začne a pokud již začal tak buď průběžný nebo konečný výsledek.
  • zobrazit detail vybraného zápasu - střelci branek, případně karty apod. (tedy to, co je dostupné na www.livescore.com/default.dll/Game?comp=soutěž&game=id_hry)
  • sledovat zápas online, pokud se hraje

Použití programu by mělo být nanejvýš jednoduché a intuitivní. Jediným zadaným příkazem do shellu bychom měli obdržet požadovanou informaci. Abychom získali alespoň jistou představu, uveďme si, jak by taková volání mohla vypadat.

Program pojmenujeme live a bude se spouštět stejnojmenným příkazem. Bude k dispozici několik možností volání. Pro zobrazení zápasů, které se hrají dnes bude sloužit tento příkaz.

$ live

Pokud zadáme argument, vypíše se pouze zápasy, které vyhovují vzoru.

$ live manchester

Dále bude program přijímat několik argumentů z příkazového řádku. Pomocí volby -league nebo -l zadáme stát nebo mezinárodní soutěž, jejíž zápasy se mají vypisovat a to v takovém tvaru, v jakém ji uvádí livescore.com. Tedy například tento příkaz zobrazí zápasy v Anglii.

$ live -l england

Dále zde bude volba -o nebo -online, která bude zobrazovat detail zápasu. V případě, že se zápas hraje, spustí se online přenos. Pokud se již dohrál, zobrazí se střelci branek, průběh apod.

$ live -o

Pokud nezadáme žádný argument, program zobrazí seznam zápasů a zeptá se, který z nich chceme zobrazit. Zadávat mu budeme část názvu týmu, podle kterého již program požadovaný zápas určí. Pokud nebude zadání jednoznačné, zeptá se na další informaci. Pokud však hodnotu vložíme, program podle ní zápas určí automaticky.

$ live -o manchester

A nakonec zde bude volba -r nebo -refresh, pomocí které nastavíme sekundový interval pro aktualizaci při online přenosu. Nicméně protože nastravíme nějakou rozumnou implicitní hodnotu, bude používán jen zřídka.

$ live -r 30 -o manchester

Rozbor

Ponechme stranou pro nás irelevantní (jinak však nezbytné) otázky typu "v čem psát" a pojďme udělat několik důležitých rozhodnutí o tom "jak psát".

Nejprve poznámku o stylu programování. Program nebudeme ladit až k naprosté dokonalosti. Budeme dbát zejména na názornost. Pokud narazíme na problém, který bude chod programu ovlivňovat jen minimálně, ale jehož řešení by zabralo relativně mnoho času, pouze ho zmíníme, případně nastíníme řešení a většinou necháme být.

Koncepce

K návrhu programu použijeme objektově orientované programování. Program se bude sestávat z několika částí. Je třeba se rozhodnout pro konkrétní variantu.

Předně vytvoříme modul s názvem Livescore, který se bude starat o získávání a zpracovávání dat. Nebude řešit věci jako je zobrazování dat, data bude pouze poskytovat.

Zpracování dat můžeme udělat několika způsoby. Buď můžeme napsat mezičlánek mezi modulem Livescore a programem live, např. modul Livescore::Text, který bude řešit zobrazování dat podle požadavků programu live. Výhodou tohoto postupu je, že bychom později mohli dopsat např. moduly Livescore::Qt, Livescore::Curses apod., které bychom mohli snadno použít při tvorbě uživatelských rozhraní.

A nebo napíšeme pouze program live, který bude zpracovávat data od Livescore sám.

Druhá varianta je jednodušší a protože našemu zadání plně postačuje, zvolíme právě ji.

Modul Livescore

Co by měl umět modul? Shrňme požadavky na něj do několika bodů.

  • Základním požadavkem na modul je získat data. Proto zde bude existovat funkce ziskej_zdrojovy_kod, která stáhne z www.livescore.com tu stránku, která bude zrovna požadována.
  • S předcházejícím bodem tane na mysli další otázka. Otázka perzistence. Budeme stahovat pokaždé, když bude program volán nebo si stránku "někam" uložíme? Tento problém je třeba důkladně zvážit, neboť bude program pravděpodobně často volán opakovaně. Rozhodněme se pro následující řešení. Každý stažený soubor uložíme do adresáře /tmp a po každém volání se podíváme, zda náhodou již vhodný soubor nemáme. Budeme muset brát zřetel na stáří souboru. Další podotázka je, jak se budeme zbavovat starých tmp souborů? Vyřešíme to jednoduše. Nijak. Moc místa zabírat nebudou a čas od času každý stejně tempy maže...
  • Dále by měl modul extrahovat data na základě zdrojového kódu. K tomu budeme muset pečlivě prostudovat HTML kódy z livescore.com.
  • Další vlastností bude hledání zápasu podle daných kritérií.
  • A na závěr se nabízí otázka, jak udělat online přenos? Protože o formu zobrazování dat se modul nestará, tak se tato otázka vyřeší sama. Odpovědnost za online přenos bude mít program live. Modul Livescore bude pouze na požádání posílat průběžná (nebo konečná) data.

Program live

Jak již bylo řečeno, live se stará o kontakt uživatelem a formu zobrazování dat. Vytvořme opět nějakou osnovu, na které budeme moci stavět. I když tentokrát nebude příliš konkrétní.

  • Je třeba obsloužit volání uživatele.
  • Na základě dat z modulu Livescore bude třeba zobrazit aktuální zápasy, případně detail zápasu. Online přenos bude řešen cyklickým doplňováním nových informací.
  • V zadání projektu jsme rozdělili zápasy na 3 typy, podle toho, v jakém jsou stavu z hlediska časového postupu. Tyto druhy rozlišíme barvami.

Správa projektu

Budeme se zabývat pouze programováním. Nicméně nepíšeme program na 10 řádků a asi by tedy bylo žádoucí použít nějaký program na správu verzí.

Dokumentace

Použití našeho programu bude poměrně jednoduché, u modulu to bude složitější. Měli bychom vytvořit dvě manuálové stránky ve formátu POD. Jednu pro modul a další pro příkaz live. Dokumentací POD se v rámci seriálu ještě budeme podrobně zabývat.

Co se týče komentářů v kódu, tak je samozřejmě dobré komentovat nejasná místa. Protože používáme objektově orientované programování, neměly by být u dobře navrženého projektu nároky na komentáře příliš vysoké. Nelze říct, že dobrý kód komentáře nepotřebuje, ale že v dobrém kódu je na první pohled jasné, co se právě děje a nejasná místa vznikají daleko méně.

Závěr

Úspěšně jsme dokončili naši minianalýzu a příště se pustíme již do programování.

Verze pro tisk

pridej.cz

 

DISKUZE

Super článek 9.10.2007 17:17 Petr Zajíc




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

9.4.2016 9:43 / jiwopene@gmail.com
Re: problém s dpkg a nemožností instalovat

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze