Automatický rezervační systém. Bc. Jan Búda

Rozměr: px
Začít zobrazení ze stránky:

Download "Automatický rezervační systém. Bc. Jan Búda"

Transkript

1

2

3 České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů Diplomová práce Automatický rezervační systém Bc. Jan Búda Vedoucí práce: Ing. Martin Šlapák Studijní program: Elektrotechnika a informatika, strukturovaný, Navazující magisterský Obor: Výpočetní technika květen 2012

4

5 Poděkování Děkuji vedoucímu práce, Ing. Martinu Šlapákovi, za přínosné rady k vývoji aplikace, doporučení vhodných technologií a také za podrobné připomínky k textu této práce. iii

6 Prohlášení Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informační zdroje v souladu s Metodickým pokynem o dodržování etických principů při přípravě vysokoškolských závěrečných prací. Nemám závažný důvod proti užití tohoto školního díla ve smyslu 60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Českých Budějovicích dne iv

7 Abstract This thesis deals with the analysis and design of an application for automated booking of free seats on Student Agency, s.r.o. lines. The application is designed to allow easy implementation of new plug-in modules. A module for checking free seats for theatre performances at the Žižkovské Divadlo Járy Cimrmana was implemented too. The thesis includes a programmer s guide to creating new plug-in modules as well as tests of usability. Abstrakt Tato diplomová práce se zabývá analýzou a návrhem programu pro automatickou kontrolu a rezervaci volných míst ve spojích společnosti Student Agency, s.r.o. Program je navržen tak, aby umožňoval jednoduché rozšíření v podobě zásuvných modulů. Byl implementován také zásuvný modul pro kontrolu volných míst na představení Žižkovského Divadla Járy Cimrmana. Součástí práce je programátorská příručka pro tvorbu nových zásuvných modulů a testy použitelnosti aplikace. v

8 vi

9 Obsah 1 Úvod Motivace Struktura a forma textu Používané pojmy Popis aplikace, požadavky na řešení Existující řešení Automatická detekce volného místa v autobusech na lince Liberec Praha SA Notify SA Checker PHP Skript Rozšíření ReloadEvery Srovnání existujících řešení Popis aplikace Cíloví uživatelé a jejich počítačová gramotnost Obecné požadavky, forma aplikace Specifikace požadavků Nefunkční požadavky Funkční požadavky Analýza a návrh řešení Použité technologie Java SWT MigLayout Jsoup Eclipse JFace Data Binding Analytický model Základní struktura aplikace Menu aplikace Správa pluginů Menu pluginů Univerzální třídy Statické vs. Dynamické třídy

10 OBSAH 3.3 Návrh grafického rozhraní aplikace Implementace Univerzální třídy ImageHandler Messenger Sounds UpdateChecker a UpdateInterface CommentedProperties a Commons Menu aplikace Mnemonic Akcelerátory Menu Soubor Menu Nastavení Menu Nastavení Možnosti Menu Nápověda Logování chyb aplikace Pluginy Soubory pluginů Plugin menu Tělo pluginu Položky hledání Kontrola volných míst Nastavení pluginů Historie hledání Přehled tříd pluginu Různé Texty v dialozích Jediná instance programu Přístupnost Název aplikace Komentáře Plugin SA Notify Analýza a návrh řešení pluginu SA Notify Specifikace požadavků Případy užití Diagram aktivit - přidání spoje Analytický model Grafický návrh pluginu Implementace pluginu Rezervační systém Student Agency Grafické rozhraní Implementace grafického rozhraní Kontrola volných míst Automatická rezervace viii

11 OBSAH Úspěšné hledání Přestupní spoje Chyby při hledání volných míst Chyby v synchronizaci vláken Nastavení pluginu Testování Simple Code Metrics Lack of Cohesion in Methods Cyclomatic complexity Uživatelské testy Testování aplikace na různých platformách Testování použitelnosti aplikace Metoda kognitivního průchodu Persony Zadané úkoly Úkol 1 nastavení rodičovské aplikace Úkol 2 práce s pluginem SA Notify Výsledky testování Plugin Divadlo Járy Cimrmana Analýza a návrh řešení pluginu Funkční požadavky Implementace pluginu Grafické rozhraní Tlačítka Minimální počet míst Interval kontroly volných míst Distribuce Licence: Verze knihovny SWT Spuštění aplikace Launch4j Spouštění přes příkazovou řádku Spuštění bez GUI Adresářová struktura Závěr Přínos práce A Použité zkratky a pojmy 97 A.1 Zkratky A.2 Pojmy B Adresářová struktura přiloženého CD 99 ix

12 OBSAH C Výsledky testování metodou kognitivního průchodu 101 C.1 Úkol 1 nastavení rodičovské aplikace C Spusťte aplikaci C Nastavte minimalizaci programu do oznamovací oblasti (tj. do pravého dolního rohu obrazovky) C Otevřete dialog Možnosti a nastavte přehrávání libovolného zvuku u všech vyskakovacích dialogů C Zkontrolujte, zda je k dispozici novější verze programu C Otevřete dialog Možnosti a zkontrolujte, zda je vypnuto přehrávání všech zvuků v Tichém režimu C Zapněte Tichý režim C.2 Úkol 2 práce s pluginem SA Notify C Přepněte na plugin SA Notify C Zahajte hledání volných míst v libovolném spoji na trase Praha Brno C V nastavení pluginu vypněte zobrazování starých hledání C V nastavení pluginu nastavte preferovaná sedadla V uličce C V nastavení pluginu nastavte automatickou rezervaci. Použijte libovolné přihlašovací údaje C Zahajte vyhledávání volných míst v libovolném spoji na trase Brno Praha C Zobrazte historii hledaných spojů D Programátorská příručka 115 D.1 Úvod D.1.1 Technologie D.1.2 Knihovny D.1.3 Pojmy D.2 Struktura aplikace D.3 Jak začít D.4 Univerzální třídy D.5 Logování chyb D.6 Jazykové verze Literatura 121 x

13 Seznam obrázků 2.1 Existující řešení - SA Notify Existující řešení - SA Notify, výběr spoje Existující řešení - SA Checker Popis aplikace - Počítačová gramotnost Případy užití - Nastavení Případy užití - Nastavení - Možnosti Případy užití - Nápověda Analytický model - základní struktura Analytický model - menu Analytický model - správa pluginů Analytický model - menu pluginů Analytický model - univerzální třídy Návrh GUI Návrh GUI - Splash Screen Menu Nápověda Menu v oznamovací oblasti Dialog Možnosti - Obecné Dialog Možnosti - Zvuky a upozornění Třídní diagram pluginu StyledText výchozí kurzor StyledText - vybraný text Dialog Aplikace je již spuštěna Plugin SA Notify - případy užití Plugin SA Notify - případy užití Plugin SA Notify - diagram aktivit Plugin SA Notify - Analytický model - Hledání Plugin SA Notify - Analytický model - Nastavení, historie Plugin SA Notify - Analytický model - Chyby a obrázky Plugin SA Notify - Tabulka Spoje Plugin SA Notify - CCombo chyba Plugin SA Notify - Tabulka hledání Plugin SA Notify - Srovnání GUI návrhu s GUI aplikace

14 SEZNAM OBRÁZKŮ 5.11 Plugin SA Notify - Tabulka hledání Plugin SA Notify - Úspěšné hledání Plugin SA Notify - Úspěšné hledání Plugin SA Notify - Rezervace odstraněného spoje Plugin SA Notify - Ztracené spojení Plugin SA Notify - Dialog Nastavení Plugin DJC - Přihlašovací údaje Plugin DJC - Hlavní část těla pluginu Distribuce - Adresářová struktura Distribuce - Obsah kořenového adresáře aplikace B.1 Obsah přiloženého CD C.1 Testy použitelnosti Adresář aplikace C.2 Testy použitelnosti Menu Nastavení C.3 Testy použitelnosti Dialog Možnosti, záložka Zvuky a upozornění C.4 Testy použitelnosti Menu Nápověda C.5 Testy použitelnosti Dialog Možnosti, záložka Zvuky a upozornění C.6 Testy použitelnosti Tichý režim C.7 Testy použitelnosti Výběr pluginu C.8 Testy použitelnosti Plugin SA Notify C.9 Testy použitelnosti Dialog Nastavení pluginu SA Notify, záložka Obecná nastavení C.10 Testy použitelnosti Dialog Nastavení pluginu SA Notify, záložka Výchozí hledání C.11 Testy použitelnosti Dialog Nastavení pluginu SA Notify, záložka Automatická rezervace C.12 Testy použitelnosti Nepodařilo se rezervovat preferované sedadlo C.13 Testy použitelnosti Menu pluginu s tlačítkem Historie D.1 Programátorská příručka Menu pluginů D.2 Třídní diagram pluginu xii

15 KAPITOLA 1. ÚVOD Kapitola 1 Úvod Tématem této implementační diplomové práce (viz [6]) je Automatický rezervační systém v podobě volně šiřitelné, modulární desktopové aplikace, která umožní automatické ověřování dostupnosti volných míst v internetových rezervačních systémech, zejména v rezervačním systému vnitrostátní autobusové a vlakové dopravy společnosti Student Agency s.r.o. 1.1 Motivace Společnost Student Agency s.r.o. (dále jen Student Agency) provozuje stále se zvětšující síť autobusové a vlakové dopravy, nabízející ve většině případů na české poměry nadprůměrný komfort a příznivé ceny, včetně cenových zvýhodnění pro studenty. Služeb Student Agency proto využívá i značné množství dojíždějících studentů. V exponované dny, jako je neděle, pondělí dopoledne, čtvrtek odpoledne a pátek, bývají spoje Student Agency vyprodané na některých trasách i na několik týdnů dopředu. Mnoho cestujících ale své rezervace těsně před cestou ruší, na což čeká množství těch, na které se lístek nedostal a ihned rezervuje uvolněné lístky. Tím ovšem dochází ke stavu, kdy při uvolnění místa ve spoji je toto místo opět zarezervováno během maximálně několika málo minut. Cestující, který doufá v uvolnění místa ve vyhlédnutém spoji tak musí sedět u počítače, neustále aktualizovat webovou stránku rezervačního systému a snažit se být první, kdo objeví případné uvolněné místo. Rozhodl jsem se proto vytvořit aplikaci, která by umožňovala automatické kontrolování volných míst ve spojích Student Agency, případně i následné automatické zarezervování uvolněného místa. Analogie s vyprodanými spoji Student Agency lze ovšem nalézt i u dalších webových služeb: Například některá oblíbená divadla (za všechny Žižkovské divadlo Járy Cimrmana nebo Divadlo v Dlouhé) mívají zarezervována všechna volná místa během několika málo hodin od zveřejnění nového programu. I zde pak dochází k situacím, kdy si lidé rezervaci nevyzvednou a místa se opět uvolní. Aplikaci jsem proto navrhoval tak, aby bylo možné formou zásuvných modulů (pluginů) přidat podporu pro další rezervační systémy. 1

16 1.2. STRUKTURA A FORMA TEXTU 1.2 Struktura a forma textu Všechny odkazy v PDF verzi této práce jsou interaktivní. To platí jak pro interní (odkazy na jinou kapitolu, obrázek apod.), tak internetové odkazy. Internetové odkazy jsou od okolního textu odlišeny neproporcionálním fontem. Použitá literatura je uváděna ve formátu odpovídajícím normě ISO 690 [1]. V textu jsou použity některé ikony z kolekce Function Icon Set ze stránek Kolekce je zdarma k použití pod Royalty free licencí [30]. Dále jsou použity ikony od uživatele Tatice ze stránky pod licencí CC Attribution-Noncommercial-No Derivate 3.0 [18] Používané pojmy Použité zkratky a pojmy jsou pro větší přehlednost definovány v příloze A. Některé běžně užívané programátorské pojmy v příloze neuvádím například getter, setter, listener (zde obecně konstrukce spouštěná v reakci na definovanou akci uživatele), fields (také počeštěný tvar fieldy - data třídy) ad. 2

17 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Kapitola 2 Existující řešení, Popis aplikace, Specifikace požadavků 2.1 Existující řešení Primárním důvodem vývoje aplikace je potřeba programu, který by dokázal upozorňovat na volná místa ve spojích společnosti Student Agency. Nicméně, jak již bylo zmíněno výše, předpokládám, že upotřebení najdou i další pluginy, pro ověřování volných míst či automatickou rezervaci míst například v oblíbených divadlech. V době psaní tohoto textu neexistuje v České Republice žádný program, který by umožňoval automatickou rezervaci ve více různých službách a který by bylo možné modulárním způsobem dále rozšiřovat. Pokud se ale zaměříme na programy pro automatické ověřování volných míst v autobusech Student Agency, je situace odlišná. Takových programů existuje hned několik. Bohužel žádný z nich není v současné době funkční. Společnost Student Agency neposkytuje žádné API (A.2) pro přístup k rezervačnímu systému. Všechny uváděné programy proto fungují na stejném principu nejprve načtou celou webovou stránku s vypsanými časy spojů pro zvolenou trasu a den a následně syntaktickou analýzou naleznou požadovaný čas spoje a číslo, udávající počet volných míst. Student Agency však v minulosti svůj webový rezervační systém několikrát změnila a tvůrci své programy již neupravili tak, aby nadále fungovaly. Následně popisované existující programy jsou tedy již nepoužitelné, je ale vhodné je vzájemně porovnat pro získání lepší představy o požadavcích na aplikaci a především o podobě pluginu pro autobusy a vlaky Student Agency. V době vzniku všech níže uváděných programů společnost Student Agency provozovala pouze autobusové spoje, vlakové spoje proto v této kapitole nejsou brány v úvahu Automatická detekce volného místa v autobusech na lince Liberec Praha Student Katedry měření Fakulty elektrotechnické ČVUT Jan Breuer na své osobní stránce (http://jaybee.cz) v březnu 2008 zveřejnil v článku Automatická detekce volného 3

18 2.1. EXISTUJÍCÍ ŘEŠENÍ místa v autobusech na lince Liberec Praha [8] php skript pro detekci míst v autobusech Student Agency. Během následujícího roku a půl byl skript postupně vylepšován. Byla přidána podpora pro všechny tuzemské linky Student Agency a pro autobusy DPMLJ na lince Praha Liberec. Po změně webu rezervačního systému Student Agency v roce 2009 byl celý skript přepracován a fungoval až do roku V roce 2010 došlo k další změně webu Student Agency, skript se díky tomu stal nefunkčním a jeho další vývoj byl zastaven Použití Skript se spouští přes příkazovou řádku, jako parametr je nutné zadat ID požadovaného spoje, které lze zjistit z URL adresy rezervačního systému. Při nalezení volného místa je pomocí PHP funkce exec() spuštěn program notify-send, který v Linuxových operačních systémech zobrazí upozornění na volné místo. Skript je tedy určen pouze pro OS Linux s nainstalovaným notify-send (je součástí balíku libnotify-bin). Umožňuje sledování více autobusových spojů najednou. Sleduje pouze volná místa, neumožňuje žádné nastavení preferovaných míst apod. Kontrola, zda se ve sledovaném spoji uvolnilo místo, probíhá periodicky každých 20 vteřin. Takto krátký interval je výhodný pro uživatele, zejména v případě většího rozšíření aplikace by ale mohl způsobovat nadměrné zatížení serverů rezervačního systému a vyvolat případné protiopatření ze strany Student Agency. Klady a zápory skriptu z webu + Lze sledovat více spojů najednou - Použití pouze pod OS Linux + Kontroluje volná místa každých 20 s - Použití pouze přes příkazovou řádku + Umí sledovat i autobusy DPMLJ na lince Praha Liberec - Nutné ručně kopírovat ID spoje z URL adresy - Nelze zadat preferované sedadlo - Na volné místo pouze upozorní SA Notify Matěj Humpál vytvořil, inspirován skriptem od Jan Breuera, prográmek SA Notify (obr. 2.1), který zveřejnil na svých osobních stránkách v polovině roku Program má jednoduché a přehledné grafické rozhraní, je psán v programu C# za použití frameworku.net

19 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Obrázek 2.1: Prográmek SA Notify, verze Prošel poměrně dlouhým vývojem: první verze uměla hlídat pouze spoje na trase Praha - Liberec a vstupní parametry bylo, podobně jako v předchozím případě, nutné ručně kopírovat z URL adresy rezervačního systému. Nejnovější verze již zvládá všechny tuzemské trasy Student Agency a požadovaný spoj lze vybrat z kontextového rozbalovacího menu. Příjemné také je, že program nevyžaduje instalaci a má pouhých 33 kb. Po stažení je ihned připraven k použití. Vyžaduje pouze přítomnost.net 2.0 frameworku (OS Windows) nebo MONO frameworku pro Unixové operační systémy (Linux, Mac OS)..NET framework je zapotřebí pro běh velkého množství aplikací pod OS Windows, většina počítačů s tímto OS ho tedy nainstalovaný již má. Obrázek 2.2: Prográmek SA Notify, výběr spoje 5

20 2.1. EXISTUJÍCÍ ŘEŠENÍ Použití Po spuštění si uživatel výběrem z kontextových menu (obr. 2.2) jednoduše navolí požadovanou trasu, výchozí a cílovou stanici a čas zvoleného spoje. Časy spojů jsou načítány přímo z webu Student Agency, jsou tedy vždy aktuální, nevýhodou je někdy delší doba odezvy. Oproti tomu dostupné trasy autobusů jsou do programu napevno zakomponovány a není možné jednoduchým způsobem přidat trasy nové. Ke změnám obsluhovaných tras a především k zavedení tras nových přitom dochází relativně často (i několikrát do roka). Volná místa jsou kontrolována každých 90 vteřin, v případě úspěchu se zobrazí upozornění a ozve zvukový signál. 90 vteřin je znatelně větší interval než 20 vteřin v předchozím případě, i tak se ale autor na stránkách zamýšlí, zda interval a datová náročnost programu není příliš velká a v případě většího rozšíření nebude pro web Student Agency znamenat příliš velkou zátěž. Zdá se, že se tato obava nenaplnila. Ovšem, stejně jako v případě skriptu z kapitoly 2.1.1, po změně rezervačního systému v roce 2010 program přestal fungovat. Klady a zápory programu SA Notify (verze 1.7.1): + Online načítání času spojů - Načtení spojů někdy trvá delší dobu + Lze sledovat více spojů najednou - Nelze aktualizovat trasy spojů + Jednoduché grafické rozhraní - Na volné místo pouze upozorní + Funguje pod všemi rozšířenějšími OS - Nelze zadat preferované sedadlo + Na OS Windows běží schován v pravé dolní liště SA Checker 2011 SA Checker 2011 (obr. 2.3) od Lukáše Hakulina je funkčností velmi podobný programu SA Notify, je ale psán v jazyce Java. Je nutné jej instalovat, instalační soubor má velikost 1,04 MB. Byl zveřejněn začátkem roku 2011, bohužel již v létě téhož roku web Student Agency doznal dalších změn, které by vyžadovaly přepracování větší části programu. Novou, funkční verzi proto zatím autor neplánuje. Za největší změnu oproti programu SA Notify považuji možnost uživatelů doplnit jednoduchým zásahem do části zdrojových kódů případné nové autobusové trasy Použití Použití je prakticky totožné s programem SA Notify, největší funkční změnou, kterou uživatel pocítí, je kontrolování volných míst pouze jednou za 3 minuty. 6

21 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Obrázek 2.3: Prográmek SA Checker 2011, verze 1.1 (zdroj: U nejvíce exponovaných spojů je tento interval příliš velký. Například několik hodin před odjezdem vyprodaného autobusu je případné uvolněné místo zabráno zpravidla během minuty či dvou. To přitom platilo i v době, kdy žádný ze zde uváděných programů nebyl funkční a zájemci o místo v daném spoji museli stránku rezervačního systému manuálně aktualizovat. Díky lépe zpracovanému grafickému rozhraní se s programem pracuje příjemně a velmi intuitivně Hlavní rozdíly programu SA Checker 2011 oproti SA Notify: Umožňuje jednoduchou úpravou XML souboru implementovat nové trasy. Na stránkách autora je podrobný a přehledný návod doplněný obrázky, přidat požadovanou trasu trasu by měl být bez větších obtíží schopen i ne-programátor. Fungoval pod novějším rezervačním systémem Student Agency, který byl v provozu v letech Kontroluje volné spoje pouze každé 3 minuty (z obavy před přetížením serveru). Existuje-li více spojů ve stejný čas, program prohledává pouze poslední spoj v řadě. Na mnoha trasách je ve špičce více autobusů ve stejný čas nasazováno běžně. Například 7

22 2.1. EXISTUJÍCÍ ŘEŠENÍ na trase Praha-Brno odjíždí v obou směrech dva autobusy najednou hned 4x každý všední den. Jedná se tedy o poměrně vážný nedostatek. Program dokáže sledovat i spoje, které mají volná místa (viz obr. 2.3). Vylepšené grafické rozhraní Program se instaluje a pro jeho funkčnost je nutné mít nainstalovanou Java Virtual Machine. SA Notify instalaci nevyžaduje, pro svou funkčnost potřebuje nainstalovaný.net 2.0 framework. Výraznější zvukový signál při nalezení volného místa. Ten lze navíc v případě potřeby jednoduše změnit nahrazením souboru alarm.wav v kořenovém adresáři programu. Na OS Windows při minimalizování zůstane na hlavní liště, SA Notify se minimalizuje do oznamovací oblasti v pravém dolním rohu. Klady a zápory programu SA Checker 2011 (verze 1.1): + Lze manuálně přidat nové trasy - Kontroluje spoje jen 1 za 3 minuty + Jazyk Java snadná přenositelnost mezi platformami - Při více spojích ve stejný čas umí hlídat pouze jeden + Lze sledovat více spojů najednou - Na volné místo pouze upozorní + Přehledné grafické rozhraní - Nelze zadat preferované sedadlo O existenci SA Checker 2011 jsem se, na rozdíl od programu SA Notify, dozvěděl až v době, kdy již byl kvůli změněnému webu pro rezervace nefunkční. Nemohl jsem proto zahrnout jeho hodnocení z hlediska rychlosti načítání spojů PHP Skript Začátkem roku 2011, kdy nebyl funkční žádný z dosud uvedených programů, jsem napsal svůj vlastní PHP skript pro hlídání volných míst v autobusech Student Agency. Můj skript je v zásadě velmi podobným se skriptem, který popisuji v kapitole Hlavní rozdíl spočívá v určení pro webový server a spouštění přes běžný webový prohlížeč. Pro spuštění na osobním počítači je vhodné použít balíček EasyPHP ( org/ ). Skript byl určen pro mé osobní použití, případně pro několik málo mých známých, kterým jsem mohl osobně ukázat instalaci i použití. Při jeho vývoji byl hlavní důraz kladen na rychlost vývoje (pouze několik hodin). Není proto příliš uživatelsky přívětivý neexistuje žádné uživatelské rozhraní, parametry spoje se zadávají ručně do zdrojového kódu. 8

23 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Při nalezení volného místa je uživatel upozorněn spuštěním Javascriptového příkazu alert(). Jeho nevýhodou je, že v novějších verzích webových prohlížečů není alert doprovázen zvukem, uživatel si proto upozornění nemusí všimnout z nejpoužívanějších prohlížečů je zvuk pouze u Internet Exploreru 9. Prohlížeče Mozilla Firefox v. 10, Google Chrome v. 17, Opera v ani Safari v. 5.2 zvukové upozornění nevydají. Skript kontroluje volná místa každých 90 sekund, parametr je ale možné jednoduše změnit. Experimentováním jsem zjistil, že u nejvytíženějších spojů je vhodné změnit interval na 60 s, jinak roste nebezpečí propásnutí volného místa. Klady a zápory PHP skriptu: + Při umístění na webový server lze skript spouštět vzdáleně z libovolného zařízení s přístupem na internet - Složitější na zprovoznění - Nutné ručně kopírovat parametry spoje z URL adresy - Umí sledovat jen jeden spoj - Nelze zadat preferované sedadlo - Na volné místo pouze upozorní Rozšíření ReloadEvery ReloadEvery je rozšíření pro prohlížeč Mozilla Firefox, které lze použít pro pohodlnější manuální sledování volného místa, uvádím ho zde pouze pro úplnost. Protože v současné době žádný z uvedených programů nelze použít, zájemci o uvolněná místa ve vyprodaných spojí musí tyto spoje sledovat ručně. Pomocníkem může být toto rozšíření, které v zadaném intervalu aktualizuje webovou stránku. Okno prohlížeče pak stačí zmenšit a umístit na viditelné místo tak aby nepřekáželo v další činnosti na PC a pouze průběžně sledovat počet volných míst bez nutnosti neustálého ručního aktualizování stránky a zdlouhavého čekání, až se stránka opět načte. 9

24 2.1. EXISTUJÍCÍ ŘEŠENÍ Srovnání existujících řešení PHP Skript 1 (2.1.1) PHP Skript 2 (2.1.4) SA Notify (2.1.2) SA Checker (2.1.3) Programovací jazyk PHP PHP C# Java Velikost 8 kb 6 kb 33 kb 1,04 MB Multi-platformní Grafické rozhraní Sledování více spojů najednou Online načítání času spojů Možnost zadat nové trasy spojů Poradí si s více spoji v 1 čas Minimalizace do oznamovací oblasti (OS Windows-pravý dolní roh) Lze změnit interval hledání Výrazné nebo nastavitelné zvukové upozornění při úspěchu Volné místo zarezervuje Lze zadat preferovaná sedadla Lze zadat preferovaný spoj (Při více spojích v 1 čas mívá tzv. posilový spoj méně služeb pro cestující) Jak je vidět z tabulky, všechna řešení mají některé výrazné nedostatky, zároveň ale také každé řešení nabízí i funkcionalitu, kterou zbylá řešení nemají. 10

25 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Analýza existujících řešení proto poskytla dobrý základ pro specifikaci požadavků na plugin pro hlídání volných míst v autobusech Student Agency. 2.2 Popis aplikace Cíloví uživatelé a jejich počítačová gramotnost Obrázek 2.4: Počítačová gramotnost v ČR (zdroj: Předpokládanými cílovými uživateli jsou v první řadě všichni zákazníci Student Agency. Mezi lidmi, kteří se Student Agency cestují pravidelně, se dá o aplikaci očekávat poměrně vysoký zájem. Provedl jsem menší orientační průzkum potenciálního zájmu o aplikaci. Respondenty bylo 10 studentů vysoké školy, kteří služeb Student Agency pravidelně využívají (typicky nejméně několikrát do měsíce). Všichni uvedli velký zájem o podobnou aplikaci. Vzhledem k tomu, že jediný společný předpoklad pro uživatele je cestování se společností Student Agency, mohou být uživatelé velmi rozmanití. Silnou skupinu budou jistě tvořit studenti vysokých škol. Zájem o podobnou aplikaci může ale mít kdokoli. S vývojem dalších pluginů, např. pro rezervaci divadel, můžeme navíc očekávat i více uživatelů středního či vyššího věku. Na obrázku 2.4 je graf počítačové gramotnosti obyvatel v ČR (Více o metodice průzkumu a údajích z obrázku viz článek na serveru Živě.cz [11]. Průzkum byl prováděn v roce 2005, dnes tedy může být skutečnost mírně odlišná, pro přibližnou orientaci ale postačí. 11

26 2.3. SPECIFIKACE POŽADAVKŮ Ve věku let je pouze přibližně třetina populace považována za počítačově gramotnou, třetina neumí s počítačem pracovat vůbec Obecné požadavky, forma aplikace Vzhledem ke skutečnostem uvedeným v podkapitole by navrhovaná aplikace měla být jednoduše spustitelná a maximálně uživatelsky přívětivá předpokládá se velké množství potenciálních uživatelů, z nichž mnozí mohou mít velmi malé nebo žádné zkušenosti s instalací programů apod. Jednou z uvažovaných forem aplikace bylo i rozšíření pro webové prohlížeče. Výhodou této formy je především možnost používání bez nutnosti instalovat či spouštět samostatnou aplikaci, která zabírá více systémových prostředků a místo na obrazovce či v systémové liště. Nevýhodou je nutnost vývoje pro každý prohlížeč zvlášť a malé obecné povědomí o možnostech rozšíření pro webové prohlížeče. Také zamýšlená modularita aplikace by se obtížně realizovala. Toto řešení by bylo vhodné spíše pro jednoúčelový program pro kontrolu volných míst ve spojích Student Agency. Vzhledem k předpokládaným běžným uživatelům jsem se proto rozhodl pro samostatnou, desktopovou aplikaci, ideálně spustitelnou bez nutnosti instalace. 2.3 Specifikace požadavků Následující požadavky jsou pro rodičovskou aplikaci, poskytující rozhraní pro jednotlivé pluginy. Specifikace požadavků pro plugin SA Notify je v kapitole Nefunkční požadavky Uživatelsky přívětivá. Aplikace by měla být přehledná a jednoduše ovladatelná. Přenositelná a multiplatformní. Aplikace musí být spustitelná na nejrozšířenějších operačních systémech MS Windows, MacOS a Linux. Modulární. Měla by být rozšiřitelná formou zásuvných modulů a poskytovat API rozhraní usnadňující tvorbu nových pluginů Funkční požadavky Při sestavování funkčních požadavků jsem vycházel z obvyklých funkcí desktopových programů (zejména pro menu Nápověda) a také z funkcí rozsahem či účelem podobných aplikací, například programu FreeRapid Downloader (http://wordrider.net/freerapid/) od studenta ČVUT-FEL Ing. Ladislava Vitáska. Autor program zveřejnil pod licencí GNU General Public License verze 2 [19] a psal o něm svou diplomovou práci [13], kterou jsem také použil jako literaturu při výběru jednotlivých technologií. 12

27 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Uživatelské role Aplikace nevyžaduje žádnou údržbu, nezahrnuje správu uživatelských účtů a obecně neobsahuje funkce, které by měly být přístupné jen některým uživatelům. Existuje proto jen jedna uživatelská role Případy užití Následující UML diagramy zahrnují všechny základní případy užití aplikace. Při tvorbě diagramů jsem se snažil respektovat obecná doporučení pro tvorbu UML diagramů udržovat diagramy přehledné, v jednom diagramu mít ideálně nejvíce 7 položek Nastavení programu Obrázek 2.5: Nastavení programu Zapnout Tichý režim - aplikace v Tichém režimu nevydává žádné zvuky - v Nastavení aplikace je možné upřesnit chování Tichého režimu 13

28 2.3. SPECIFIKACE POŽADAVKŮ Ukládat při ukončení - uživatel může zvolit ukládání stávajících hledání při ukončení aplikace. - ve výchozím nastavení je tato možnost zapnutá Spouštět při startu - uživatel může zvolit automatické spouštění aplikace po startu operačního systému - ve výchozím nastavení je tato možnost vypnutá Nastavit minimalizaci do oznamovací oblasti - aplikace se při minimalizaci skryje do oznamovací oblasti v pravém dolním rohu (OS Windows) Zobrazit Možnosti - aplikace zobrazí okno s možnostmi nastavení. Více viz diagram Nastavení Možnosti Diagram na obrázku 2.6 představuje konkrétní možnosti případu užití Zobrazit Možnosti z obrázku 2.5. Kontrolovat aktualizace po spuštění - aplikace po spuštění zkontroluje, zda je k dispozici nová verze. - pokud ano, upozorní uživatele na existenci nové verze Změnit jazyk - uživatel může změnit jazyk aplikace - výchozím jazykem je čeština Správa pluginů Aplikace zobrazí seznam instalovaných pluginů s těmito informacemi: - jméno pluginu - verze - stav pluginu Aktivní, nebo Neaktivní (uživatel může stav změnit) - autor pluginu Změnit vzhled Uživatel může upravit vzhled aplikace: - může změnit velikost ikon v menu - může změnit barvy pozadí jednotlivých pluginů 14

29 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Obrázek 2.6: Možnosti nastavení programu Vytvořit zástupce - uživatel může zvolit vytvoření zástupce programu na Ploše, v nabídce Start nebo ve složce Po spuštění (vše pouze na OS Windows) Zvuky a upozornění Uživatel může: - změnit nebo vypnout zvuk aplikace při nalezení volného místa pluginem. Může si vybrat z přednastavených zvuků, nebo vybrat zvuk vlastní. - změnit nebo vypnout zvuk aplikace při zobrazování upozornění nebo chyb. Může si vybrat z přednastavených zvuků, nebo vybrat zvuk vlastní. - vypnout upozorňování na běžící vyhledávání při vypínání programu. - specifikovat chování aplikace v Tichém režimu: - vypnout, nebo zapnout zvuky v Tichém režimu - vypnout, nebo zapnout vyskakující upozornění v Tichém režimu 15

30 2.3. SPECIFIKACE POŽADAVKŮ Program může být spuštěn dlouhou dobu, po kterou se může měnit okolní prostředí. Je proto důležité, aby si uživatel mohl nastavit vlastní profil (vyhovující systém upozornění a zvukových upozornění) a aby tento mohl jednoduše měnit, respektive vypínat všechny zvuky zapnutím Tichého režimu Nápověda Obrázek 2.7: Nápověda Zobrazit nápovědu - aplikace otevře nápovědu ve webovém prohlížeči Rozhodl jsem se pro nápovědu k rodičovské aplikaci i nápovědu k pluginům ve formě HTML a k jejich umístění na webový server. Tuto formu využívají i jiné programy. Většinou se jedná o lokální HTML stránky, distribuované spolu s programem. Má aplikace je ale použitelná pouze s funkčním internetovým připojením, není tedy důvod distribuovat nápovědu spolu s aplikací. Umístění na webových stránkách má navíc výhodu ve snadnější správě nápovědy a možnosti rychle reflektovat časté problémy uživatelů např. doplněním sekce Často kladené otázky. Nápověda k pluginům - aplikace otevře ve webovém prohlížeči nápovědu k jednotlivým pluginům 16

31 KAPITOLA 2. POPIS APLIKACE, POŽADAVKY NA ŘEŠENÍ Zkontrolovat aktualizace - aplikace zkontroluje, zda je k dispozici novější verze. Pokud ano, nabídne možnost přejít na webovou stránku s novou verzí. Přejít na domovskou stránku - aplikace otevře ve webovém prohlížeči svojí domovskou stránku Zobrazit licenční ujednání - aplikace zobrazí název licence, pod kterou je distribuována a její stručný popis - zobrazí také webový odkaz na plné znění licenčního ujednání Zobrazit info o programu Aplikace zobrazí informace o programu, zejména: - aktuální verze - datum vydání aktuální verze - autor aplikace - krátké info o pozadí vzniku aplikace 17

32 SPECIFIKACE POŽADAVKŮ

33 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Kapitola 3 Analýza a návrh řešení 3.1 Použité technologie Java 1.7 Vzhledem k požadavku na snadnou přenositelnost a multiplatformnost aplikace jsem zvolil programovací jazyk Java 1.7. Verze 1.7 dosud není mezi uživateli příliš rozšířená, oficiálně uvedena a nabídnuta ke stažení na serveru Java.com na stránce Download (http://www.java.com/download/) byla v květnu Např. server Slunečnice.cz ale verzi 1.7. nabízí již od února Odkaz na server Slunečnice je přitom na prvním místě vyhledávání hesla java download ve dvou dominantních webových vyhledávačích v ČR (Seznam a Google). Lze tedy očekávat brzké rozšíření této verze. Uživatelům, kteří Javu 1.7 dosud nemají, by zprovoznění aplikace nemělo dělat přílišné problémy ani při případné distribuci bez Java Runtime Enviroment. Nejnovější verze má řadu výhod (plný výčet nových vlastností viz [4]). Vedle těch obecných (vylepšená stabilita, výkon, bezpečnost) obsahuje množství drobných vylepšení, která usnadňují programování. Z nových vlastností se ukázaly přínosné například: Zjednodušený zápis generických instancí Místo lze nyní použít List <String > s t r i n g s = new ArrayList<String >(); List <String > s t r i n g s = new ArrayList ( ) ; 19

34 3.1. POUŽITÉ TECHNOLOGIE Řetězení výjimek V konstrukci try{ } catch{ } lze použít zřetězení výjimek. Chceme-li odchytit více výjimek, není nutné psát pro každou vlastní catch{ } : try { Class a = Class. forname ( " wrongclassname " ) ; } catch ( ClassNotFoundException I l l e g a l A c c e s s E x c e p t i o n I n s t a n t i a t i o n E x c e p t i o n ex ) {... } Tuto vlastnost považuji z nových syntaktických vlastností za nejužitečnější, velmi pomáhá zlepšit přehlednost kódu. Switch pro String Dosud bylo možné příkaz switch použít pouze pro proměnné typu integer. Konstrukce try-with-resources Nová konstrukce umožňuje vynechat blok finally { } při otevírání resources. Použijemeli try-with-resources, Java se sama postará o zavření např. příslušného InputStreamu, ať už blok try{ } skončí chybou, nebo ne: try ( BufferedReader in=new BufferedReader ( new FileReader ( " f i l e " ) ) ) { S t r i n g l i n e = n u l l ; while ( ( l i n e = in. readline ( ) )!= n u l l ) { System. out. p r i n t l n ( l i n e ) ; } } catch ( IOException ex ) {... } SWT Standard Widget Toolkit je open-source knihovna pro tvorbu grafických aplikací v Javě, která je ve správě nadace Eclipse Foundation. Je alternativou ke knihovně Swing, jenž je součástí Java SE. Knihovna SWT je uvolněna pod licencí Eclipse Public License v 1.0 [3]. Tato licence umožňuje libovolné použití knihovny, jedinou podmínkou je, že při zveřejnění zdrojových kódů musí být tyto zveřejněny pod stejnou licencí Výhody SWT Komponenty Operačního sytému SWT na rozdíl od knihovny Swing nevykresluje jednotlivé GUI komponenty samostatně, ale používá komponenty operačního systému. Vykreslování je proto rychlejší a SWT má mnohem menší paměťové nároky. Například autoři přednášky SWT & MigLayout z cyklu přednášek Czech Java User Group uvádí příklad, kdy při testování stejné aplikace napsané v SWT i ve Swingu zabírala 20

35 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ aplikace používající knihovnu Swing stabilně 9 MB operační paměti, zatímco verze používající SWT maximálně 800 kb [22]. Univerzální konstanty SWT také nabízí funkce pro jednoduchou tvorbu multiplatformních GUI. Například při definování klávesových zkratek nebo jejich vypisování uživateli lze použít konstanty místo názvů kláves tedy např. místo použití klávesy Ctrl, která na některých platformách není, lze použít konstantu SWT.MOD1. Knihovna při spuštění konstantu nahradí odpovídajícím tlačítkem na dané platformě. Obdobně lze použít konstanty i pro další funkční klávesy, ale také pro ikony: Univerzální ikony Konstrukce display.getsystemimage(swt.icon_error) vrátí ikonu, kterou daná platforma používá pro chybové hlášky. Při využití těchto vlastností tak aplikace spuštěná na určitě platformě vypadá, jako by byla psaná nativně pro tuto platformu. Tato vlastnost může významně zvýšit uživatelský komfort při práci s aplikací umožňuje uživatelům pracovat v prostředí, na které jsou zvyklí. SWT Snippets SWT Snippets je sbírka příkladů použití SWT komponent, dostupná na a poskytovaná pod stejnou licencí jako SWT ([3]). Sbírka obsahuje velké množství jednoduchých i složitějších příkladů implementace nejrůznějších komponent a jejich vlastností. Spolu s kvalitní dokumentací je tak další výhodou SWT knihovny Nevýhody SWT Různé verze pro různé platformy Hlavní nevýhoda plyne z první uváděné výhody SWT: díky používání systémových komponent je třeba používat pro každou platformu jinou verzi SWT a dále na zvolené platformě používat verzi podle bitovosti JRE (32, nebo 64 bitů). Je tedy nutné vytvořit samostatný distribuční balíček pro každou platformu nebo vytvořit balíček univerzální, obsahující všechny verze SWT, a manuálně načíst správnou verzi podle platformy, na které je aplikace spuštěna. Nelze dědit Další nevýhodou je nemožnost dědění ze základních komponent. Tato vlastnost opět souvisí s více verzemi SWT jedna GUI komponenta bude mít různé implementace pro různé platformy. I námi vytvořená podtřída by proto musela brát tyto odlišnosti v úvahu a mít různé verze pro různé platformy. SWT má ale komponenty Composite a Canvas, které dědění umožňují (komponenta, dále také widget, Composite je nadtřídou všech ostatních komponent). Ruční uvolňování prostředků Poslední významnou nevýhodou je nutnost ručního uvolňování systémových prostředků [14]. Konkrétně všechny vytvořené fonty, barvy a obrázky je nutné ručně uvolnit zavoláním jejich metody.dispose(), jinak by došlo k úniku paměti (memory leak). Tím je omezena jedna 21

36 3.1. POUŽITÉ TECHNOLOGIE z velkých výhod Javy např. oproti jazykům C/C++. Jedno vlákno SWT běží pouze v jednom vlákně a pokus o přístup k widgetům z jiného vlákna skončí chybou přístup je nutné provádět pomocí konstrukce Display. g e t D e f a u l t ( ). asyncexec (new Runnable ( ) p u b l i c void run ( ) { //kód p ř i s t u p u j í c í k SWT komponentům // i n i c i a l i z o v a n ý m v jiném vlákně } } ) ; Klady a zápory SWT (ve srovnání s knihovnou Swing): + Nativní vzhled na všech platformách - Nelze dědit + Nativní chování na všech platformách (funkční tlačítka, ikony) - Složitější distribuce (jiná verze SWT pro každou platformu) + Rychlejší načítání - Ruční uvolňování prostředků + Menší systémové nároky - Jedno vlákno Použití nativních komponent operačního systému, zajišťující Look&Feel odpovídající danému OS a rychlejší vykreslování, dle mého názoru daleko převáží všechny nevýhody SWT, které jsou navíc nevýhodami především pro vývojáře a ne pro cílového uživatele MigLayout MigLayout je open source Java Layout Manager pro Swing i SWT, který je volně ke stažení na stránce Jeho tvůrce se snažil o vytvoření Layout Manageru, který dokáže nahradit všechny standardní Java Layout Managery (FillLayout, GridLayout atd.) a přitom si zachová jednoduchost a přehlednost. MigLayout je šířen pod BSD [28] nebo GNU GPL [20] licencí (autor dává uživatelům na vybranou) a pravděpodobně bude přidán do Javy SE (má nejvíce hlasů mezi požadavky na změny v Javě na Existuje pro něj i plugin do IDE NetBeans, umožňující tvorbu GUI ve vizuálním editoru, systémem Drag&Drop, při vývoje aplikace jsem se ale rozhodl dát přednost manuálnímu programování MigLayoutu. 22

37 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Rychlost MigLayoutu s SWT V benchmarcích (např. [10] nebo již zmiňovaná přednáška o SWT a MigLayoutu [22]) vycházejí rychlejší aplikace za použití MigLayoutu v kombinaci s knihovnou Swing, rozdíly nejsou ale příliš výrazné (kolem 10%) a velmi závisí na použitém Look&Feel ve Swingu. Při použití SWT s MigLayoutem aplikace navíc rychleji startuje (v benchmarku [10] trvá start 203 ms versus 360 až 390 ms pro Swing+MigLayout). Při testování demo aplikace psané pomocí SWT a MigLayoutu (k dispozici na miglayout.com) mi odezva přišla subjektivně velice dobrá, srovnatelná s odezvou oken operačního systému Použití MigLayoutu MigLayout nabízí mnoho způsobů nastavení layoutu pomocí mnoha různých parametrů. Jednotlivé parametry se v SWT zadávají pomocí konstrukce widget. setlayoutdata ( S t r i n g [ zřetězené_parametry ] ) ; Jistou nevýhodou je, že díky zadávání parametrů a jejich hodnot ve Stringu MigLayout neumožňuje typovou kontrolu, programátor je upozorněn na syntaktickou chybu až při překladu. Přehled všech parametrů MigLayoutu je k dispozici na jeho domovské stránce. Obecně layout umožňuje jednoduše definovat pozici komponent relativní i absolutní, jejich zarovnání i zarovnání jejich vnitřku, odsazení, mezery mezi řádky i sloupci, způsob vyplňování volného místa, minimální, preferovanou a maximální velikost komponenty atd. K zajímavým parametrům layoutu patří např.: debug: Tento parametr způsobí vykreslení čárkovaného rámečku okolo všech komponent. Lze tak snadno zkontrolovat jejich rozložení a zjistit, která komponenta narušuje zamýšlené rozložení. sizegroup [group_name]: Komponenty se stejnou sizegroup budou mít stejnou velikost (velikost největšího z nich). hidemode: Lze nastavit chování skryté komponenty (widget.setvisible(false);): hidemode 0: S neviditelnou komponentou je zacházeno stejně jako s viditelnou (zabírá místo) hidemode 1: Velikost komponenty je nastavena na 0 0. hidemode 2: Velikost komponenty je nastavena na 0 0 a mezery kolem ní (margin) také na 0. hidemode 3: Komponenta se neúčastní layoutu, není brána v úvahu. 23

38 3.1. POUŽITÉ TECHNOLOGIE Jsoup Vzhledem k tomu, že základem činnosti všech zamýšlených pluginů bude pravděpodobně syntaktická analýza webových stránek a extrahování informací na nich uvedených, bylo důležité vybrat vhodnou technologii usnadňující tuto činnost. Jsoup (http://jsoup.org/)) je Java HTML parser, poskytovaný pod MIT licencí [23], který umožňuje: Načíst HTML stránku z URL, Stringu nebo souboru Procházet a extrahovat data pomocí HTML DOM (A.2) nebo za použití CSS selektorů Odesílat a přijímat HTML requesty, nastavovat jejich parametry (hlavičky, cookies, data,...) a další (viz Jsoup umožňuje nejen jednoduché a rychlé extrahování hledaných dat z HTML dokumentu, ale díky možnosti odesílat HTML requesty a libovolně nastavovat jejich parametry také dokáže věrně simulovat webový prohlížeč, včetně odesílání GET či POST requestů apod Eclipse JFace Data Binding Aplikace obsahuje množství formulářů s možnostmi nastavení a další formuláře lze očekávat pro předvolby pluginů. Je proto vhodné použít knihovnu usnadňující provázání hodnot navolených ve formuláři s objekty, které daný formulář reprezentují. Pro knihovnu Swing existuje JGoodies binding [5], snažil jsem se proto najít alternativu pro SWT. Jednou ze zvažovaných možností byla knihovna SWT Binding od Mathiase Mullera [29]. SWT Binding je uvolněn pod BSD licencí [28] a je založen na zmiňovaném JGoodies binding, které portuje pro SWT. Nejnovější verze (0.2) je ovšem z roku 2009 a je nekompletní (umí obsluhovat jen některé widgets). Nekompletní je také dokumentace. Existuje sice oficiální javadoc dokumentace, většina funkcí ale komentář postrádá. Rozhodl jsem se proto pro použití JFace Data Binding. JFace Data Binding je součástí vývojového prostředí Eclipse. Pro vývoj aplikace jsem používal prostředí NetBeans, bylo proto nutné importovat potřebné knihovny. Framework umožňuje pomocí jednoduchých konstrukcí provázat GUI komponenty s Java bean, respektive s jakýmkoli objektem, který má pro parametr provázaný s komponentou getter a setter. Není tak nutné přidávat pro každou komponenty ve formuláři selection nebo modification listenery ani ji ručně aktualizovat při změně hodnoty příslušného fieldu, o vše se postará JFace Data Binding. 24

39 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ 3.2 Analytický model V této kapitole je rozebrán analytický model aplikace. Popisuji zde jednotlivé třídy a jejich vzájemné vztahy Základní struktura aplikace Struktura základní části aplikace je zobrazena na obrázku 3.1. Obrázek 3.1: Základní struktura aplikace MainClass je statická třída (obsahuje pouze statické metody a fieldy diskuzi o použití statických vs. dynamických tříd jsem provedl v kapitole 3.2.6) obsahující metodu main (). Dále obsahuje proměnné s informacemi o programu např. verze programu, autor apod. Tyto informace jsou tak jednoduše přístupné z kterékoli části aplikace. BaseAppGui je třída, instanciovaná třídou MainClass, která vytvoří a otevře GUI aplikace. Stará se tedy o inicializaci všech potřebných komponent, včetně jednotlivých pluginů k tomu jí slouží třída PluginLoader. PluginLoader má na starosti načítání jednotlivých pluginů i jejich ukončování (implementuje případ užití Ukládat při ukončení ). 25

40 3.2. ANALYTICKÝ MODEL MyMenu je abstraktní třída, která je nadtřídou všech položek v hlavním menu aplikace. Obsahuje společné metody pro položky menu. MyFileMenu reprezentuje menu Soubor. reprezentuje menu Nastavení a implementuje tak případy užití z kapi- MySettingsMenu toly MyHelpMenu reprezentuje menu Nápověda a případy užití z kapitoly Podrobnější zobrazení návrhu menu aplikace je v kapitole Menu aplikace Obrázek 3.2: Menu aplikace 26

41 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Na obrázku 3.2 je menu aplikace 1. Třídy, které jsou inicializovány v objektech MySettingsMenu a MyHelpMenu reprezentují jednotlivé případy užití: MyMenu_Save... případ užití Ukládat při ukončení MyMenu_Startup... Spouštět při startu MyMenu_Minimize... Nastavit minimalizaci do oznamovací oblasi Preferences... Zobrazit Možnosti a všechny související případy užití z kapitoly UpdateChecker... Zkontrolovat aktualizace About... Zobrazit info o programu About_license... Zobrazit licenční ujednání Správa pluginů Obrázek 3.3: Správa pluginů Jak je vidět na obrázku 3.3, třída PluginLoader obsahuje 0...* referencí na interface PluginInterface, který implementují všechny pluginy. PluginLoader obsluhuje pluginy (může 1 Dvojtečka před jménem třídy značí, že se jedná o instanci dané třídy 27

42 3.2. ANALYTICKÝ MODEL je inicializovat, zobrazit, uložit atd.) přes PluginInterface, nezáleží proto, o jaký konkrétní plugin se jedná. Abstraktní třída Plugin obsahuje společné metody pluginů, aby nedocházelo ke zbytečným duplicitám kódu v jednotlivých pluginech Menu pluginů Obrázek 3.4: Menu pluginů Menu pluginů představuje zároveň jakousi záložku, přes kterou uživatel vybere daný plugin (viz návrh GUI aplikace na obrázku 3.6). Menu tedy může mít 2 stavy menu aktivního pluginu (plugin je vybrán, jeho tělo je momentálně zobrazeno uživateli) a menu neaktivního pluginu. Pro menu byl proto použit návrhový vzor Stav. PluginLoader zavolá metodu PluginInterface.getMenu(), která vrátí příslušné menu pro aktivní, nebo neaktivní plugin. Každý plugin má vlastní třídu pro aktivní menu, díky čemuž může být aktivní menu libovolně uzpůsobené konkrétnímu pluginu (na obr. 3.6 je jako příklad menu pluginu SA Notify SAMenu). 28

43 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Naopak neaktivní menu mají všechny pluginy společné a reprezentuje ho třída IdleMenu. Tím je zajištěn jednotný vzhled lišty s menu jednotlivých pluginů. Dále jsem navrhl dvě abstraktní třídy, PluginMenu a PluginActiveMenu, které obsahují metody společné pro všechny druhy menu (PluginMenu) a metody společné pro menu aktivního pluginu (PluginActiveMenu) Univerzální třídy Obrázek 3.5: Univerzální třídy Na obrázku 3.5 jsou třídy, které mohou být instanciovány v kterékoli části aplikace nebo se jedná o třídy statické. V obou případech jsou to třídy poskytující nějakou univerzální funkci, která je potřeba v různých částech aplikace. ImageHandler je statická třída, určená k načítání všech obrázků. Vzhledem k nutnosti ručního disposingu (viz odstranění objektu a uvolnění jeho systémových prostředků) obrázků jsem se rozhodl pro umístění všech objektů typu Image do této třídy. Tím je zajištěna snadnější správa všech obrázků a sníženo nebezpečí, že některé obrázky nebudou disposovány. Při zavírání aplikace je zavolána metoda ImageHandler.dispose(), která zajistí disposing všech obrázků. ImageHandler má veřejné (public) metody pro načtení obrázku ze složky zadané v parametru metody. Jednotlivé pluginy tak mohou mít vlastní obrázky ve své složce a vlastní třídu pro načítání obrázků, dědící od třídy ImageHandler a využívající její public metody. ErrorHandler je metoda pro zobrazování chyb aplikace uživateli. Obsahuje statický objekt Messenger messenger, inicializovaný při spouštění aplikace, který zajišťuje zobrazení chyb v dialogovém okně. Objekt messenger je public, pluginy tedy opět mohou dědit od této třídy a využívat její, již inicializovaný, Messenger. 29

44 3.2. ANALYTICKÝ MODEL CommentedProperties Aplikace potřebuje při ukončení ukládat mnoho proměnných. K tomu je vhodná třída Properties, poskytující jednoduché API pro načtení konfiguračního souboru a získávání hodnot z tohoto souboru. Nevýhodou třídy Properties, která je součástí Javy SE, je mazání komentářů: načteme-li obsah souboru, který kromě hodnot obsahuje i komentáře nebo prázdné řádky, do objektu Properties, ten upravíme a opět uložíme, původní soubor je přepsán a přijdeme o uložené komentáře a formátování konfiguračního souboru. Použil jsem proto upravenou verzi CommentedProperties extends Properties z diskuzního fóra kde ji uživatel waltf zveřejnil k volnému použití. Tato třída zachovává komentáře i volné řádky v konfiguračním souboru. Rozdíly CommentedProperties oproti Properties: metoda setproperty(string key, String value) funguje jen pokud už Commented- Properties daný klíč obsahuje, jinak neudělá nic (Properties.setProperty() v takovém případě klíč vytvoří). CommentedProperties mají proto metodu add(string key, String value), která vloží na konec souboru novou položku. Nekontroluje přitom, zda už se použitý klíč v properties nachází. Upravil jsem proto tuto metodu tak aby zkontrolovala, zda se zadaný klíč v properties již nachází a následně ho buď vytvořila, nebo pouze změnila jeho hodnotu zavoláním metody setproperty(). CommentedProperties mají metody addline(string line), která na konec souboru přidá komentář. Při vytváření nového klíče je tak možné před něj programově přidat i komentář. MenuListeners obsahuje množství metod s návratovou hodnotou Listener, které vrací Listenery opakovaně používané zejména v menu aplikace. Jsou to například Listenery zajišťující zobrazení, nebo skrytí textu ve stavovém řádku (za tímto účelem má MenuListeners statický field Label statusbar, inicializovaný při startu aplikace) nebo Listenery zajišťující otevření URL adresy ve webovém prohlížeči. Messenger zajišťuje zobrazování zpráv uživateli a to jak chybových, tak informačních. Vytvoří nový Shell dialog se zprávou a ten zobrazí uprostřed okna aplikace. Buttons je třída usnadňující tvorbu tlačítek (SWT Button). U většiny vytvářených tlačítek jsou nastavovány vždy ty samé parametry, třída Buttons proto obsahuje univerzální metody pro vytvoření tlačítka a nastavení nejobvyklejších parametrů, jako jsou Text, ToolTipText, StatusBarText ad. Sounds obsahuje metody pro přehrávání zvuků a také hodnoty z CommentedProperties pro nastavení zvuků (jaké zvuky a kdy se mají přehrávat). Její instance je předávána jednotlivým pluginům, plugin tedy v případě potřeby může použít vlastní třídu a přehrávat vlastní zvuky. 30

45 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Výchozí nastavení zvuků, včetně cest k přehrávaným zvukům, je načteno z Commented- Properties v konstruktoru této třídy. Pro případ, že v CommentedProperties požadované položky nejsou, jsou nastaveny výchozí hodnoty. Commons je statická třída obsahující univerzální metody, které není vhodné zařadit do žádné z předchozích tříd. Její součástí jsou metody int getintegerproperty() boolean getboolproperty() String getstringproperty(), které mají shodné parametry CommentedProperties properties, String key, String default- Value. Všechny tři vracejí hodnotu z CommentedProperties, parsovanou do návratového typu metody. V případě, že properties hledaný parametr neobsahují, nebo dojde k chybě parsování (např. položka, která má obsahovat číslo, obsahuje text) vrátí defaultvalue a tuto hodnotu také uloží do properties Statické vs. Dynamické třídy Pozn.: Java nezná statické třídy, tímto pojmem označuji třídy, které mají statické všechny fieldy i metody. Obecně není doporučováno nadměrné použití statických metod či fieldů ([9], [7]). Například budou-li všechna konfigurační data aplikace v podobě statických fieldů v jedné třídě, není možné spouštět aplikaci nebo části aplikace simultánně v různých konfiguracích. Naopak použití centrálních, statických fieldů velmi zjednodušuje jejich úpravu, přístup k nim apod. U atributů typu název aplikace lze přitom snadno předpokládat, že si i do budoucna vystačíme s jediným statickým fieldem. Všechny univerzální třídy uvedené v předchozí kapitole by teoreticky mohly být dynamické i statické. Snažil jsem se proto u každé z nich zvážit konkrétní situaci a způsob použití a zvolit výhodnější možnost. Pokud jsem nenašel konkrétní důvody pro statičnost třídy nebo jejích fieldů, navrhl jsem je jako dynamické. Třídy ErrorHandler, Buttons nebo MenuListeners jsou dynamické. ErrorHandler má ale statický field Messenger messenger. Messenger pro inicializaci potřebuje jako parametr Display a Shell, ErrorHandler může být ale volán z libovolného místa aplikace, kde Shell ani Display nemusí být k dispozici. Jednoduchým a účelným řešením je tedy deklarovat field Messenger jako statický a inicializovat ho při startu aplikace. MenuListeners původně měly po vzoru SWT Snippet 152 některé Listenery jako statické fieldy: p u b l i c s t a t i c L i s t e n e r showlistener = new L i s t e n e r ( ) p u b l i c void handleevent ( Event event ) {.... } } ; 31

46 3.3. NÁVRH GRAFICKÉHO ROZHRANÍ APLIKACE V takovém případě by se ale zbytečně všechny tyto Listenery inicializovaly při vytvoření každé instance MenuListener (i těch, které potřebují jiný Listener, tzn. např. tento field Listener showlistener vůbec nepoužijí). Raději jsem proto pro každý Listener vytvořil dynamickou metodu s návratovou hodnotou Listener. Třída ImageHandler je z dříve uvedených důvodů statická (snadnější správa obrázků). CommentedProperties jsou předávány objektům jako parametr. Zde by mohlo dojít k výše popsané situaci, kdy budeme chtít určité části programu předat pozměněná konfigurační data, je tedy bezpečnější předávat je jako parametr instanci třídy CommentedProperties. Label statusbar, reprezentující stavový řádek aplikace, je statický. Nepředpokládám potřebu více různých stavových řádků a vzhledem k tomu, že ke stavovému řádku potřebuje přístup mnoho různých tříd, statický Label výrazně usnadňuje programování. Konfigurace Tichého režimu, včetně booleanu isqm, který udává, zda je Tichý režim zapnutý, je z podobných důvodů jako statusbar statická. Zde je dokonce žádoucí, aby část aplikace nemohla použít jiné nastavení zapne-li uživatel Tichý režim, pravděpodobně nebude chtít, aby např. některý plugin měl vlastní nastavení Tichého režimu a globální nastavení ignoroval. 3.3 Návrh grafického rozhraní aplikace Na obrázku 3.6 je návrh GUI rodičovské aplikace a pluginu SA Notify 2, v této kapitole se zabývám pouze GUI rodičovské aplikace, které je tvořeno systémovým menu, menu s výběrem pluginů (dále jako menu pluginů nebo plugin menu) a stavovým řádkem (ten na obrázku není). Při návrhu jsem se snažil ponechat maximum místa pro tělo pluginu, zároveň ale udělat plugin menu dostatečně výrazné a velké, aby si ho uživatel ihned všiml. Jednotlivé položky v plugin menu mají různé barvy a jejich barva je zároveň použita jako podkladová pro tělo konkrétního pluginu (plugin body). Díky tomu si uživatel může asociovat barvy s jednotlivými pluginy a i při letmém pohledu na otevřenou aplikaci ihned pozná, který plugin je právě zvolen. To může být důležité zejména v případě vzniku většího množství pluginů, které budou mít podobné funkce (např. rezervaci autobusových spojů, kdy každý plugin bude umět rezervaci jiného dopravce) a budou mít tedy velice podobné rozložení prvků v plugin body. Na obrázku 3.7 je Splash Screen aplikace obrázek, který se zobrazí ihned po startu aplikace a je zavřen po načtení celé aplikace. Slouží tedy jako ukazatel pro uživatele, že aplikace byla spuštěna a probíhá její načítání. 2 Návrh je určen především ke znázornění rozložení jednotlivých komponent. Jejich skutečná podoba (zejména rámečky, barva apod.) je závislá na platformně, na které je aplikace spuštěna. 32

47 KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ Obrázek 3.6: Návrh grafického rozhraní Obrázek 3.7: Splash Screen 33

48 NÁVRH GRAFICKÉHO ROZHRANÍ APLIKACE

49 KAPITOLA 4. IMPLEMENTACE Kapitola 4 Implementace Vývoj aplikace probíhal v IDE NetBeans 7.1 na OS Windows 7. Zároveň jsem prováděl kontrolu správného zobrazení i chování aplikace na OS Windows XP a Ubuntu (GUI GNOME). Zjištěné rozdíly uvádím v kapitole Univerzální třídy ImageHandler Obrázků jsou řádově desítky, ImageHandler proto používá Just In Time (JIT) inicializaci: Každý obrázek je uložen jako private field a má svůj getter a setter. V getteru je zkontrolováno, zda byl obrázek inicializován a pokud ne, je zavolán příslušný setter. ImageHandler odchytí výjimky způsobené špatným formátem souboru, nebo neplatným názvem souboru. V takovém případě vrátí getter pro požadovaný obrázek hodnotu null. Dále v aplikaci je proto nutné ošetřit používání obrázku, který nesmí být null. Jedná se například o metodu shell.setimages(image [ ]), která nastaví ikonu v záhlaví okna 1. Při každém nastavování ikon Shellu je tedy nutné tuto metodu obklopit konstrukcí try {... } catch ( IllegalArgumentException e ) {... } Animované GIF SWT neumí jednoduše zobrazit animovaný GIF soubor. Použili jsem proto třídu AnimatedGif, založenou na SWT Snippet 141, která spustí nové vlákno, starající se o animaci obrázku. Vlákno se ukončí, pokud zjistí, že Shell, pro který byl obrázek určen, byl ukončen (isdisposed() ). Zároveň je nastaveno jako daemon, takže se ihned ukončí v případě ukončení celé aplikace. 1 V závislosti na platformě je nastavený obrázek používán nejen v záhlaví okna, ale také na systémové liště nebo při procházení otevřených oken pomoci Alt+Tab (OS Windows). Lze proto nastavit více obrázků různých velikostí a SWT knihovna použije v konkrétních případech nejvhodnější velikost. Pro aplikaci jsem použil 2 ikony o velikosti a pixelů 35

50 4.1. UNIVERZÁLNÍ TŘÍDY Metoda getimage(string filename) Většina obrázků je ve třídě ImageHandler uložena jako samostatný field, který má svůj getter a setter. Někdy je ale potřeba načítat nové obrázky dynamicky za běhu programu. (např. výběr jazyka, viz ). K tomu slouží metoda getimage(string filename), která vrátí obrázek načtený ze zadaného souboru, který zároveň uloží do ArrayListu imagestodispose. Při ukončení aplikace jsou všechny obrázky z tohoto listu automaticky disposovány. ImageCodeGen Vytvořil jsem také jednoduchou třídu ImageCodeGen, generující kód pro ImageHandler. Kód nutný vytvořit pro každý obrázek je obdobný, mění se v zásadě pouze jméno proměnné a soubor s obrázkem, obrázků je přitom mnoho, je tedy výhodné použít generátor kódu. Velikost obrázků Snažil jsem se, aby všechny použité obrázky i ikony zabíraly co nejméně diskového prostoru. Většina obrázků je proto ve formátu GIF. Při vytváření GIF formátu jsem zároveň volil nejmenší počet barev, při kterém se subjektivně ještě nesnížila kvalita obrázku Messenger Existuje jen jedna instance třídy Messenger, která je předávána třídám jako parametr. Díky tomu v případě, že uživatel změní nastavení vyskakovacích zpráv (případ užití Zvuky a upozornění ), je tato změna promítnuta do instance třídy Messenger a změny se ihned projeví ve všech nových vyskakovacích zprávách. Messenger zobrazuje 4 základní druhy zpráv: message_info informační zpráva message_warning zpráva obsahující varování message_error zpráva o chybě message_waiting zpráva o probíhající akci, na jejíž dokončení aplikace čeká (např. pokus o aktualizaci) Díky tomuto dělení zpráv je možné budoucí rozšíření např. o přehrávání různých zvuků podle typu zprávy, pro zvýraznění jejího typu (Varování, Chyba ad.). Metoda message_waiting bývá volána z jiného vlákna, proto na začátku kontroluje, zda Shell aplikace nebyl mezitím zavřen (tento postup je doporučen v dokumentaci SWT). Všechny metody pro zobrazování zpráv mají parametr boolean successmessage, udávající, zda se jedná o zprávu o úspěchu hledání některého pluginu. Pokud je successmessage true, je přehrán zvuk nastavený pro úspěšné hledání (metoda Sound.playSuccessSound() ). Ikony Ikony zobrazované u zpráv jsou pro věrnější přizpůsobení vzhledu platformě nastavovány pomocí SWT konstant (např. display.getsystemimage(swt.icon_error), viz kapitola ). 36

51 KAPITOLA 4. IMPLEMENTACE ICON_CANCEL ICON_ERROR ICON_INFORMATION ICON_QUESTION ICON_SEARCH ICON_WARNING ICON_WORKING ne ano ano ano ne ano ano Tabulka 4.1: SWT ikony k dispozici na OS Windows 7 Některé ikony definované pomocí SWT.ICON ovšem na některých platformách nejsou k dispozici (tabulka 4.1 zobrazuje ikony, které jsou k dispozici na OS Windows 7). V takovém případě je použita odpovídající vlastní ikona, inicializovaná ve třídě ImageHandler Sounds Třída Sounds obsahuje metody pro přehrávání zvuku i pro ukončení přehrávání. Přednastavené zvuky jsou dostatečně krátké aby nebylo nutné jejich přehrávání zastavovat. Uživatel si ale může navolit i vlastní libovolně dlouhé zvuky, jejichž přehrávání musí být možné programově zastavit. Stejně tak budoucí pluginy mohou vyžadovat funkci zastavení přehrávaného zvuku. Licence použitých zvuků Některé použité zvuky jsou ze stránek od autorů Robinhood76 a ivanbailey, kteří je zveřejnili pod licencemi CC Attribution 3.0 Unported [16] a Attribution- NonCommercial 3.0 Unported [17]. Další zvuky jsou z kolekce Designer Sound FX od firmy Final Image Inc. (webové stránky videocopilot.net), zakoupené pod licencí Royalty free UpdateChecker a UpdateInterface Třída UpdateChecker spustí vlákno (daemon), které ověří dostupnost nové verze programu. Implementuje interface UpdateInterface: UpdateInterface je jednoduchý interface, obsahující metodu setcanceled(). Metoda Messenger.message_waiting() má jako jeden z parametrů tento interface. Tato metoda zobrazí dialog obsahující zprávu (další z parametrů) a tlačítko Zrušit. Při jeho stisku je dialog ihned zavřen a je zavolána metoda UpdateInterface.setCanceled(), která nastaví vláknu příznak značící, že uživatel operaci přerušil. 37

52 4.2. MENU APLIKACE Třída UpdateChecker pak pravidelně kontroluje, zda nebyla operace přerušena a případně zastaví svou činnost. Interface UpdateInterface a metodu Messenger.message_waiting() tak mohou využívat i pluginy, pokud chtějí uživateli oznámit informaci o probíhající akci s možností jejího přerušení. Protože UpdateChecker spouští kontrolu nové verze v samostatném vlákně, Messenger, který zobrazí výsledek kontroly, musí být volán přes dříve zmíněnou konstrukci Display. g e t D e f a u l t ( ). asyncexec (new Runnable ( ) {... } ) ; Pro přístup na server při samotné kontrole nové verze je použit objekt URLConnection, který na rozdíl od jednoduššího URL umí nastavit ConnectTimeout (timeout pokusu o připojení) a ReadTimeout (timeout čtení z URL) CommentedProperties a Commons Veškeré přístupy k objektům CommentedProperties (konfigurační soubory aplikace) jsou prováděny přes metody ve třídě Commons, popsané v kapitole 3.2.5, které mají jako jeden ze vstupních parametrů výchozí hodnotu hledaného klíče. Díky tomu nedojde k chybě, pokud hledaný klíč v CommentedProperties není. V případě, že uživatel nechtěně změní konfiguraci programu a bude se chtít vrátit k výchozí konfiguraci, postačí smazat konfigurační soubor. Aplikace pak při dalším spuštění použije výchozí hodnoty nastavení a při ukončení vytvoří nový konfigurační soubor. 4.2 Menu aplikace Mnemonic Všechny položky menu všech úrovní používají tzv. Mnemonic klávesové zkratky, definované ampersandem(&) před písmenem v textu položky. Například na OS Windows lze položku menu vybrat zkratkou Alt+Mnemonic. Klávesové zkratky pro jednotlivé položky jsem vybíral podobné těm používaným v OS Windows (např. položku Nápověda Zobrazit nápovědu lze stejně jako v programech MS Office vybrat zkratkou Alt+V, N). U podmenu Nápověda k pluginům, jehož položky jsou generovány při načítání pluginů, jsou Mnemonic přiřazeny automaticky program přiřadí první písmeno názvu položky, které dosud nebylo použito (vynechává mezery). Nápověda pro konkrétní plugin tedy nebude mít přiřazený Mnemonic jen pokud by už všechna písmena z jeho názvu byla použita. Výměnou za toto malé riziko nemusí programátor nového pluginu položky v menu vytvářet ručně Akcelerátory Některé položky menu používají tzv. akcelerátory klávesové zkratky, které na rozdíl od Mnemonics okamžitě vyberou příslušnou položku v menu (uživatel nemusí nejprve zadávat zkratku pro menu vyšší úrovně). Na většině platforem je tato zkratka zobrazena vedle názvu položky, se zarovnáním vpravo. 38

53 KAPITOLA 4. IMPLEMENTACE Obrázek 4.1: Menu Nápověda s Mnemonics zvýrazněnými podtržítkem a akcelerátorem F1 pro zobrazení nápovědy Menu Soubor Položka menu Soubor obsahuje pouze volbu Zavřít a to pod všemi platformami mimo MacOS X (SWT používá krycí jméno cocoa ). Na této platformě není položka Soubor Zavřít obvyklá. Na OS Windows je k položce Zavřít přiřazen i obvyklý akcelerátor Alt+F Menu Nastavení Uložit při ukončení Při výběru této položky objekt MyMenu_Save změní v menu příslušnou ikonu a nastaví v CommentedProperties hodnotu saveonexit. Je-li tato hodnota nastavena na true, při ukončení aplikace je zavolána metoda PluginInterface.save() všech načtených pluginů a při opětovném spuštění metoda PluginInterface.load() (podrobnosti viz kapitola ) Spouštět po startu systému Tato položka je platná pouze na OS Windows. Na jiných platformách v menu tato volba zůstane, ale je nastavena jako disabled, uživatel ji tedy nemůže zvolit. Za název položky je v takovém případě přidán dodatek Pouze OS Windows. Další možností by bylo položku pod jinými OS vůbec nezobrazovat, domnívám se ale, že tento postup je lepší pro uživatele. Zamezí jeho zmatení pokud by program spouštěl na dvou různých platformách a na každé viděl jiný obsah menu. Spouštění po startu je zajištěno přidáním zástupce do složky Po spuštění. Pro přidání zástupce jsem zamýšlel použít knihovnu java.nio.file, uvedenou v Javě 1.7. Při jejím použití ale nelze zapisovat do systémových adresářů, včetně složky Po spuštění (pokus vyvolá výjimku AccessDeniedException). Použil jsem proto externí knihovnu JShortcut. JShortcut (domovská stránka jimmc/jshortcut/) je šířen pod licencí GNU LGPL [21] a umožňuje jednoduše vytvořit zástupce na OS Windows. 39

54 4.2. MENU APLIKACE Jeho nevýhodou je potřeba správné verze knihovny jshortcut.dll podle architektury, na které je spuštěna (jsou celkem 3 verze jshortcut.dll: x86, x86_64 a amd64). K dispozici je verze shortcut-0.4-oberzalek, která sama vybere správnou verzi.dll knihovny. Tato verze ale při každém spuštění opětovně extrahuje.dll soubor spuštěním C++ kódu, který správnou verzi pod dočasným názvem uloží do adresáře Temp systému Windows, kde pak dochází k jejich kupení. Upravil jsem proto soubor JShellLink knihovny JShortcut tak, aby při načítání.dll knihovny po spuštění aplikace zkontroloval architekturu a načetl správný soubor ze souborů jshortcut_x86.dll, jshortcut_ia64.dll a jshortcut_amd64.dll, které jsou pod těmito jmény distribuovány spolu s aplikací Minimalizovat do oznamovací oblasti Obrázek 4.2: Menu nad ikonou v oznamovací oblasti OS Windows Tato položka menu je povolena pouze pokud platforma podporuje tzn. System tray (Display.getSystemTray()) tedy např. OS Windows, Ubuntu GNOME. V opačném případě položku nelze vybrat a k textu je přidán dodatek Není k dispozici na této platformě. Tuto položku obsluhuje třída MyMenu_Minimize. Ta se stará o změnu chování při minimalizaci, o vytvoření ikony v systémové oblasti a jednoduchého kontextového menu zobrazovaného nad touto ikonou (obr. 4.2). Při prvním vybrání položky je vytvořen objekt TrayItem, který reprezentuje ikonu v oznamovací oblasti a ten je při dalším přepínání položky již jen skrýván a zase zobrazován (zároveň je přidáván / odebírán Listener pro skrytí Shellu aplikace z hlavní systémové lišty při minimalizaci). Kontextové menu zobrazované nad ikonou v oznamovací oblasti má tyto položky: Zobrazit SA Notify otevře okno aplikace Tichý režim zapne, nebo vypne Tichý režim Skrývat při minimalizaci je-li skryté (minimalizované), zobrazí okno aplikace a schová ikonu v oznamovací oblasti Ukončit ukončí aplikaci 40

55 KAPITOLA 4. IMPLEMENTACE Při implementaci tohoto menu jsem narazil na chybu SWT: Celé menu je považováno za součást objektu TrayItem. Pokud má TrayItem přiřazený Listener pro kliknutí myší, který zobrazí menu, tak při kliknutí do libovolné části tohoto menu je opět zavolán Listener pro TrayItem a dojde k jeho opětovnému vykreslení menu na novém místě (vykresluje se vždy nad aktuální polohou kursoru myši). V metodě handleevent(event event) přiřazeného Listeneru je proto nutné provést kontrolu, zda menu již není zobrazené Menu Nastavení Možnosti Obrázek 4.3: Dialog Možnosti, záložka Obecné Vybrání položky Možnosti zobrazí dialog se všemi možnostmi nastavení aplikace. Pro položku je použit akcelerátor SWT.MOD1+P. SWT nahradí konstantu SWT.MOD1 kódem tlačítka platformy (na OS Windows Ctrl, na MacOS tlačítko Command Key). Text akcelerátoru je CTRL+P. Dle [26] 2 SWT automaticky přetíží text akcelerátoru a např. na MacOS ho nahradí textem Command + P. Jednotlivé položky nastavení jsou seřazeny tématicky do záložek dialogu Možnosti. Při rozmýšlení pořadí záložek i pořadí položek v záložkách jsem se snažil o seřazení podle důležitosti tak, aby položky, které by uživatel mohl nejspíše chtít změnit, byly co nejvýše. Položky jsou navíc v rámci záložek řazeny do Group (SWT objekt, který způsobí ohraničení svých potomků rámečkem). Na obrázku 4.3 jsou na vybrané kartě Obecné 3 Groupy: Aplikace, Jazyk a Vytvořit zástupce. 2 Kapitola 2.4: Accelerators 41

56 4.2. MENU APLIKACE Při vytváření jednotlivých záložek jsem narazil na SWT bug 16438: Všechny obrázky v záhlaví záložek mají velikost nastavenou na velikost prvního obrázku. Je proto nutné používat pro všechny záložky stejně velké obrázky Preferences.java Dialog Možnosti je reprezentován třídou Preferences.java. V ní probíhá inicializace dialogu i ukládání navolených hodnot do CommentedProperties. Této třídě jsou proto předány objekty MyMenu_Safe, MyMenu_Startup a MyMenu_Minimize obsahují aktuální hodnoty příslušných nastavení (viz 4.2.4) a také umožňují okamžité promítnutí změn, které uživatel provede Tlačítko Uložit Tlačítko Uložit je při otevření dialogu Možnosti nastaveno jako disabled. Je povoleno až ve chvíli, kdy uživatel provede změnu nastavení. Tlačítko je také nastaveno jako enabled, pokud uživatel zvolí vytvořit zástupce na záložce Obecné. To je teoreticky zbytečné, k vytvoření zástupce dojde ihned po stisknutí tlačítka. V opačném případě by se ale uživatel mohl domnívat, že k vytvoření zástupce nedošlo (nic se nezměnilo, protože tlačítko Uložit je stále nefunkční) Záložka Obecné Na tuto záložku jsem umístil i položky, které lze volit přímo z menu Nastavení. Tento přístup používají i jiné aplikace a považuji ho za přehlednější pro uživatele, který všechna nastavení najde na jednom místě. Do hlavního menu jsou pak pro urychlení umístěny pouze některé často používané volby. Výběr jazyka SWT widget Combo může obsahovat pouze text. Použil jsem proto třídu ImageCombo ze serveru poskytovanou pod licencí Eclipse Public License (respektive její vylepšenou verzi ze stránek dev.eclipse.org, zveřejněnou pod stejnou licencí). Druhá verze umožňuje zobrazení obrázku i u právě vybrané položky (viz obr. 4.3), zatímco první jen u položek v seznamu, který se rozbalí kliknutím na Combo. Obě verze používají knihovny org.eclipse.ui.forms a org.eclipse.jface, bylo proto nutné importovat je do IDE NetBeans, ve kterém probíhal vývoj aplikace. Z knihovny org.eclipse.jface je ale třeba jen třída org.eclipse.jface.util.geometry.class, v rámci úspory místa (celá knihovna má 1052 kb, samotná třída 62 kb) proto s aplikací z dané knihovny distribuuji pouze tuto třídu. ImageCombo pro výběr jazyka je generováno ze souboru available_locales.xml (načten pomocí knihovny Jsoup), kde jsou uloženy informace o dostupných jazykových verzích, včetně textu, který se zobrazí v ImageCombu a jména obrázku, který se zobrazí vedle textu. 42

57 KAPITOLA 4. IMPLEMENTACE Jazykové verze Jednotlivé jazykové verze jsou uloženy v.properties souborech, které mají v názvu příponu identifikující jazykovou verzi, kterou obsahují. Veškeré texty zobrazované uživateli jsou nahrazeny konstrukcí ResourceBundle. getbundle ( " Bundle " ). g e t S t r i n g ( [ String key ] ) Knihovna java.util.resourcebundle načte soubor odpovídající právě nastavenému jazykovému prostředí (Locale) a v něm vyhledá text pro zadaný klíč. Při prvním spuštění se aplikace pokusí nastavit jazyk odpovídající jazykovému prostředí operačního systému. Pokud tento jazyk není k dispozici, použije výchozí nastavení (v současné distribuci je výchozím jazykem čeština). Obrázek 4.4: Dialog Možnosti, záložka Zvuky a upozornění Záložka Zvuky a upozornění Vyskakovací upozornění Je-li zaškrtnuta položka Vyskakovací upozornění, třída Messenger při zobrazení všech vyskakovacích dialogů zavolá shell.forceactive() pro přenesení okna aplikace do popředí. Přesné chování se liší podle platformy. Např. na OS Windows 7 program pouze začne blikat na systémové liště operační systém záměrně nedovoluje aplikacím přivlastňovat si programově focus. Toto chování lze obejít např. programovým stisknutím kláves Windows + D (zobrazí plochu) a následnou maximalizací okna, rozhodl jsem se ale respektovat standardní chování platformy. Aplikace má navíc možnost nastavit zvuková upozornění na vyskakovací dialogy, nemělo by tedy hrozit, že si uživatel nevšimne například upozornění na úspěšné hledání pluginu. 43

58 4.3. LOGOVÁNÍ CHYB APLIKACE Zvuky Uživatel může přehrát vybrané zvuky stisknutím tlačítka Test zvuku. Listener přiřazený tomuto tlačítku se pokusí přehrát zvukový soubor vybraný v sousedícím widgetu Combo nebo Text. Tlačítko má dva stavy Přehrát a Zastavit, měnící se podle toho, zda právě probíhá přehrávání zvuku. Ke každému přehrávanému klipu je přidán Listener pro odchycení konce přehrávání a nastavení tlačítka Test zvuku zpět do stavu Přehrát. Přehrávání zvuku probíhá v samostatném vlákně, změnu stavu tlačítka je proto nutné iniciovat pomocí konstrukce zmíněné v kapitole Vlastní zvuk Uživatel může pomocí File dialogu vybrat vlastní zvuk v současnosti jsou podporovány formáty.wav a.aif Menu Nápověda Nápověda k pluginům Položka Nápověda k pluginům obsahuje podmenu s odkazy na online nápovědu ke všem pluginům. Podmenu je generováno dynamicky při načítání pluginů ve třídě PluginLoader. Každý plugin má metody gethelppage() a gethelptooltip(), definované v interfacu PluginInterface, které vrátí webovou adresu nápovědy a tooltip zobrazovaný nad položkou v menu O programu Položka O programu zobrazí dialog s informacemi o aplikaci. Na pozadí textu je vykreslen barevný přechod (gradient). Všechny texty v tomto dialogu jsou vytvořeny pomocí widgetu StyledText, který ovšem neumožňuje nastavit transparentní pozadí lze nastavit pouze zděděné pozadí Shellu pomocí konstrukce s h e l l. setbackgroundmode (SWT.INHERIT_DEFAULT) ; V takovém případě ale StyledText bere v úvahu pouze pozadí Shellu, definované obrázkem nebo jednolitou barvou. Gradient na pozadí Shellu, vykreslený pomocí GC (Graphics Context), se na pozadí StyledTextu nepromítne. Ve třídě ImageHandler.setGradientImg() je proto vytvořen nový obrázek o velikosti Shellu dialogu, na něj je nakreslen gradient a tento obrázek je nastaven na pozadí Shellu. Funkce pro vykreslení gradientu na obrázek byla převzata z [25]. 4.3 Logování chyb aplikace Aplikace využívá pro záznam chyb třídu java.util.logging.logger. Nastavení je uloženo v souboru bin/log/logging.properties a je načteno před inicializací GUI aplikace, ve třídě MainClass. 44

59 KAPITOLA 4. IMPLEMENTACE Soubor logging.properties obsahuje nastavení FileHandleru (java.util.logging.filehandler), který ukládá logy do souborů. Jsou nastaveny 2 logovací soubory s maximální velikostí bajtů. Jakmile jeden soubor dosáhne maximální velikosti, pokračuje ukládání chyb do druhého souboru (jeho minulý obsah je vymazán). Díky tomu nemůže dojít ke stavu kdy by logovací soubor neobsahoval žádné záznamy protože nedávno dosáhl maximální velikosti a byl přepsán. Do logovacích souborů jsou uloženy všechny odchycené výjimky. Při nastavení boolean proměnné MainClass.debug na true jsou zároveň všechny chyby vypsány do konzole. Zachycené výjimky, které je vhodné oznámit uživateli, (např. nefunkční internetové připojení) jsou zároveň předány tříde ErrorHandler. Celé tělo metody MainClass.main() je v bloku try{}, následovaným catch(exception e){} pro zachycení všech neočekávaných chyb aplikace a jejich uložení do.log souborů. 4.4 Pluginy Všechny pluginy jsou inicializovány ve třídě PluginLoader a uloženy do ArrayListu <PluginInterface> plugins v této třídě. Odtud se načítají při inicializaci plugin menu nebo menu Nápověda Nápověda k pluginům. PluginLoader také při načítání pluginů zkontroluje, který plugin byl vybrán při posledním zavírání aplikace a opět ho nastaví jako vybraný (hodnota je uložena v Commented- Properties, klíč lastactiveplugin) Soubory pluginů Soubory jednotlivých pluginů jsou ukládány v adresáři /plugins/<jmeno_pluginu>. Jedná se pouze o doporučení, cesta není nikde napevno daná. Každý plugin má svou cestu uloženou ve fieldu pluginfilespath své nadtřídy Plugin díky tomu může být ve třídě Plugin implementována metoda save() (viz ) Plugin menu Nejjednodušší řešení pro plugin menu by bylo použití widgetu TabFolder. Ten ale není dostatečně variabilní menu by například nemohlo obsahovat tlačítka. Jednotlivé položky menu (záložky konkrétních pluginů) jsou proto tvořeny widgetem Composite. Obsah Composite pro konkrétní plugin je z velké části dán implementací pluginu: PluginInterface má definované gettery a settery pro fieldy, které jsou použity při vykreslování menu pluginu. Některé z těchto fieldů (ty, u kterých se předpokládá, že je programátor pluginu nebude chtít měnit) jsou inicializovány v abstraktní třídě Plugin. Jsou to: borderactive barva rámečku menu u aktivního pluginu borderidle barva rámečku menu u neaktivního pluginu při najetí myší 45

60 4.4. PLUGINY whitecolor druhá barva gradientu na pozadí menu i těla pluginu V případě potřeby programátor může definovat vlastní hodnoty přetížením getterů a setterů pro tyto fieldy. Další fieldy použité pro menu, inicializované ve třídách konkrétních pluginů, jsou: name název pluginu namepaddingtop odsazení názvu pluginu odshora namecolor barva názvu pluginu font jméno fontu použitého pro vykreslení názvu pluginu fontheight velikost fontu fontheight2 velikost fontu při najetí myší na menu neaktivního pluginu labelcolor první barva gradientu na pozadí menu i těla pluginu labelcolor2 první barva gradientu na pozadí menu pluginu při najetí myší na menu Programátor si tak může libovolně uzpůsobit vzhled menu svého pluginu při současném zachování automatického vytvoření menu, včetně změny fontu, rámečku a pozadí při najetí myší na menu Tlačítka v menu pluginu Pro snadnější vytváření tlačítek v menu jsou v abstraktní třídě PluginActiveMenu implementované dvě metody addbutton(). Jedna vytvoří tlačítko s minimální šířkou zadanou v parametru, druhá s rozpínavou šířkou. Tlačítka jsou přidávána do menu vedle sebe, v případě použití druhé metody bude tedy celková šířka tlačítek rovna šířce celého menu. Všechna tlačítka přidaná pomocí některé z metod addbutton() používají vlastnost MigLayoutu sizegroup, nastavenou u všech na stejnou hodnotu. Všechna tedy mají šířku rovnou šířce největšího z nich Vybrání pluginu Jednotlivá menu jsou potomkem Composite topmenu ve třídě PluginLoader Při kliknutí myší na menu pluginu je zahozen celý obsah Composite topmenu (nad všemi potomky topmenu je zavolán dispose() ), vybranému pluginu je nastaven příznak selected a celé menu se znovu vykreslí voláním metod PluginInterface.drawMenu(). Tento způsob je náročnější na systémové prostředky než pouhé překreslení menu původně vybraného a nově vybraného pluginu. Je ale přehlednější pro programátora pluginů při pouhém překreslování menu by např. bylo nutné ukládat všechny listenery přiřazené k menu aktivního pluginu a ručně je odebírat při vybrání jiného pluginu. 46

61 KAPITOLA 4. IMPLEMENTACE Stav Aktivní Neaktivní Tabulka 4.2: Tabulka přechodů automatu pro přepínání menu Přepínání menu Menu pluginu je uloženo v proměnné PluginMenuState menu. Při změně menu z aktivního na neaktivní a naopak (tedy při přepnutí na jiný plugin) je původní menu uloženo do fieldu třídy Plugin: PluginMenuState inactive. Díky tomu se při příštím přepnutí stavu menu nemusí menu znovu inicializovat. Za tímto účelem jsem vytvořil jednoduchý automat pro 5 možných stavů menu (viz tabulka ). Možné stavy menu (ve formátu <číslo stavu>... <obsah proměnné menu>/<obsah proměnné inactive>): 0... / 1... IdleMenu / 2... ActiveMenu / IdleMenu 3... ActiveMenu / 4... IdleMenu / ActiveMenu Tělo pluginu Tělo pluginu je vykreslováno na widget Composite pluginbody, který je fieldem abstraktní třídy Plugin. PluginInterface definuje metody Composite getpluginbody() a void setpluginbody(). Díky tomu, že všechny komponenty těla pluginu jsou potomkem Compositu pluginbody, je možné při přepnutí na jiný plugin celé tělo pluginu jednoduše skrýt skrytím Compositu pluginbody. Composite pluginbody všech pluginů má nastavenu vlastnost MigLayout hidemode=3. Díky tomu se pluginbody při skrytí pomocí pluginbody.setvisible(false) neúčastní layoutu. 3 Nejedná se o konečný automat, nelze proto minimalizovat jeho stavy, přestože stavy 2 a 4 mají totožné přechody. 47

62 4.4. PLUGINY Líná inicializace Pro těla pluginů je použita líná inicializace (lazy loading) pluginbody je inicializován v abstraktní třídě Plugin, kde je nastaven jeho layout a zároveň příznak bodyinitialized na false. Až při přepnutí na daný plugin je zavolána metoda PluginInterface.setPluginBody(), která naplní pluginbody vnitřními komponenty pluginu. Volání setpluginbody() je provedeno ve třídě IdleMenu, kde je Listener pro kliknutí na menu pluginu. V těle metody Listeneru handleevent() je provedena kontrola stavu inicializace plugin- Body. Je-li bodyinitialized false, je zavolána metoda setpluginbody() a příznak je nastaven na true Přepínání pluginů Při vybrání jiného pluginu je nejprve pluginbody vybraného pluginu nastaven na visible a až poté je případně volána metoda setpluginbody() (pokud tělo dosud nebylo inicializováno). Díky tomu lze při vytváření layoutu těla pluginu v metodě setpluginbody() používat metody vracející velikost komponent, která je nulová, má-li komponenta, nebo její předek (pluginbody), nastavený příznak visible na false. Tato vlastnost je využita např. u pluginu SA Notify velikost obou zde použitých tabulek je nastavována podle velikosti dalších komponent viz kapitola 5. Využití Compositu pluginbody jako předka všech komponent těla pluginu má i další výhody: Lze jednoduše upravit layout rodičovské aplikace, aniž by byl narušen vnitřní layout pluginu. Pluginy mohou používat libovolný layout manager. Vývojář pluginů není vázán na MigLayout, může nastavit libovolný vnitřní layout Compositu pluginbody Položky hledání Abstraktní třída PluginTableItem reprezentuje jednotlivé položky v tabulce probíhajících hledání. Např. u pluginu SA Notify pro hledání míst v autobusech Student Agency tedy každá instance podtřídy PluginTableItem reprezentuje jeden konkrétní autobus, v němž se plugin snaží najít volné místo. PluginTableItem implementuje interface Serializable Ukládání probíhajících hledání Při vypnutí programu jsou uložena všechna probíhající hledání. Za tímto účelem definuje PluginInterface metodu s generickým návratovým typem: p u b l i c ArrayList <? extends PluginTableItem> gettabledata ( ) ; 48

63 KAPITOLA 4. IMPLEMENTACE Tato metoda vrátí ArrayList položek v tabulce hledání. PluginInterface dále definuje metody save() a load() pro uložení probíhajících hledání a pro jejich opětovné načtení při spuštění programu. Metoda save() je implementována v abstraktní třídě Plugin: V těle metody se zavolá gettabledata() a všechny vrácené položky jsou uloženy do souboru, jehož jméno je ve fieldu třídy Plugin savedsearchesfile. Výchozí jméno souboru je savedsearches.san a soubor je uložen do složky se soubory pluginu (v kapitole zmíněný field pluginfilespath). Programátor pluginu tak musí jen doplnit tělo metody gettabledata() a metody load(), která načte uložené položky hledání, uložené metodou save() jako objekty PluginTableItem, a přetíží je na odpovídající podtyp (svou implementaci třídy PluginTableItem) Kontrola volných míst Pozn: Nadpis této kapitoly není přesný, plugin může kontrolovat cokoli, ne pouze volná místa. Abstraktní třída CheckerThread extends Thread obsahuje metody a fieldy pro usnadnění kontroly volných míst. Obsahuje tyto fieldy: INTERVAL interval, v jakém má probíhat kontrola volných míst na serveru DEVIATION odchylka od intervalu, ve kterém probíhá kontrola INTERVAL_DEFAULT výchozí interval, field má nastaven příznak final DEVIATION_DEFAULT výchozí odchylka, field má nastaven příznak final Při opakovaném přistupování na servery třetích stran je nutné přístupy opakovat v dostatečně velkých intervalech, aby při masivnějším použití aplikace nedocházelo k přetížení těchto serverů. Zároveň je vhodné zvolený interval náhodně měnit, aby byla ztížena detekce robota ze strany provozovatelů serveru. K tomu slouží field DEVIATION. Metody implementované ve třídě CheckerThread slouží k nastavení intervalu kontroly, výpočtu náhodné odchylky, ukládání aktuálního času a zjišťování, kolik času zbývá do konce intervalu. 49

64 4.4. PLUGINY Doporučená struktura metody Run Doporučená struktura metody Run vlákna pluginu, které je podtřídou CheckerThread a slouží k periodické kontrole volných míst (uvedené metody jsou implementované ve třídě p u b l i c void run ( ) { while (! freeseatfound ){ s e t I n t e r v a l ( ) ; setlastcheck ( ) ; { / k o n t r o l a míst... / } s l e e p ( getsleeptime ( ) ) ; } } setinterval() nastaví nový interval pro kontrolu míst. Interval je vypočten podle vzorce INT ERV AL + ( DEV IAT ION + newrandom().nextint(dev IAT ION 2 + 1)) Vypočtený interval je tedy náhodné číslo v intervalu INTERVAL ± DEVIATION. setlastcheck() uloží aktuální čas. getsleeptime() vrátí čas zbývající do konce intervalu, nebo 0, pokud kontrola volných míst trvala déle, než je nastavený interval Nastavení pluginů Pro snadnější vytváření dialogu Nastavení pro jednotlivé pluginy byla navrhnuta abstraktní třída PluginPreferences, která obsahuje metody pro vytvoření dialogu podobného tomu, který se otevře při volbě položky v menu aplikace Nastavení Možnosti. PluginPreferences obsahuje metody pro vytvoření příslušného dialogu, záložkového menu (widget TabFolder), tlačítek Uložit a Storno včetně příslušných Listenerů apod. Děděním od této třídy lze tedy snadno vytvořit celý dialog, do kterého stačí doplnit obsah jednotlivých záložek. Tlačítko Uložit po stisknutí zavolá metodu save(). Na rozdíl od tlačítka Uložit u dialogu Možnosti Nastavení jeho stisk kromě zavolání metody save() nezpůsobí zavření dialogu. Dialog je nutné zavřít v těle metody save() po uložení provedených změn v nastavení. V těle metody save() tak může být provedena kontrola správnosti nastavení (např. správně zadaný login a heslo pro přístup k serveru) a v případě chyby (prázdný login, nebo heslo) se dialog neuzavře a uživatel je na chybu upozorněn. 50

65 KAPITOLA 4. IMPLEMENTACE Historie hledání Abstraktní třída PluginHistory je určená pro zjednodušení tvorby dialogu Historie hledání. Třída pracuje s instancemi abstraktní třídy PluginTableItem, která je nadtřídou položek hledání konkrétních pluginů. Díky tomu bylo možné implementovat některé metody pro práci s historií hledání: addtohistory(plugintableitem item) přidá položku do ArrayListu <PluginTableItem> historylist, obsahujícího nové položky historie. savehistory(boolean savehistory) uloží obsah listu historylist do souboru. Jméno souboru je uloženo ve fieldu historyfile, výchozí jméno je history.san. Je-li parametr savehistory false, uloží prázdný soubor. Metoda tedy slouží i k vymazání historie. createhistorydialog() vytvoří jednoduchý dialog s názvem [jméno pluginu]-historie:, tabulkou s historií a zavíracím tlačítkem. Dále třída definuje tyto abstraktní metody: ArrayList<? extends PluginTableItem> loadhistory() načte historii uloženou v souboru. ArrayList<? extends PluginTableItem> gethistory() vrátí celou historii, tedy obsah listu historylist s připojenou historií, která byla uložena do souboru Tabulka historie Tabulka s položkami historie je vytvořena v metodě createtable(string[ ] columns, String[ ] columnstoolttip, int[ ] columnswidth). Její parametry jsou názvy sloupců (columns), tooltipy názvů (columnstooltip) a šířky jednotlivých sloupců (columnswidth). Tedy pokud tělo pluginu obsahuje tabulku zobrazující probíhající hledání, jejíž parametry Název sloupce, Tooltip sloupce a Šířka sloupce jsou uloženy v polích, stačí tato pole předat metodě createtable(), která sama vytvoří tabulku historie. Dialog Historie používá, na rozdíl od zbytku aplikace, GridLayout. Díky tomu je možné použít kód z SWT Snippetu 77 pro automatický resize sloupců při změně velikosti okna dialogu při použití MigLayoutu snippet ani po složitých úpravách nefungoval. Šířka sloupců tabulky je přepočítána při každé změně velikosti okna dialogu tak, aby sloupce vyplnily celou šířku dialogu a zároveň byl zachován jejich poměr stran vypočítaný ze vstupního parametru int[ ] columnswidth. 51

66 4.4. PLUGINY Obrázek 4.5: Třídní diagram pluginu Přehled tříd pluginu Na obrázku 4.5 je třídní diagram typického pluginu. Každý plugin musí obsahovat tyto třídy (respektive implementovat jejich nadtřídy): NewPlugin třída reprezentující daný plugin, implementuje metody interfacu PluginInterface. NewPluginMenu obsahuje implementaci menu aktivního pluginu (tedy podobu menu, pokud je plugin právě vybrán). NewPluginTableItem reprezentuje jednu hledanou položku. Implementace této třídy (podtřídy PluginTableItem) povinná není, umožňuje ale využití metody safe() pro ukládání probíhajících hledání, implementované ve třídě Plugin, a také metod třídy PluginHistory pro práci s historií hledání. 52

67 KAPITOLA 4. IMPLEMENTACE Dále plugin navržený na obrázku obsahuje třídy: NewPluginPreferences otevře dialog Nastavení pluginu. NewPluginHistory zobrazí historii hledání. NewPluginChecker samostatné vlákno, které provádí cyklické hledání volných míst. Programátor nového pluginu musí implementovat pouze třídy vyznačené na obrázku 4.5 zeleně. Všechny ostatní jsou již součástí aplikace. 4.5 Různé Do této kapitoly řadím popisy implementace, které není vhodné zařadit do žádné z předchozích kapitol Texty v dialozích Texty ve vyskakovacích dialozích i v dialozích O programu, Nastavení Možnosti apod. jsou vytvořeny pomocí widgetu StyledText. Pro daný účel je možné použít i widget Label, ten ale neumožňuje text jednoduše formátovat. V případech, kdy je text formátován, je proto použit StyledText. StyledText má nastaven seteditable(false) (uživatel text nemůže editovat) a výchozí kurzor widgetu je přetížen na kurzor šipka. Obrázek 4.6: Widget StyledText kurzor myši vedle textu POZOR: I s přetíženým kurzorem myši ale uživatel na text může kliknout a v textu se objeví kurzor pro psaní (obr. 4.6). Text lze navíc i vybrat (obr. 4.7). Obrázek 4.7: Widget StyledText uživatel vybral text myší U většiny dialogů je proto StyledText nastaven jako disabled pomocí StyledText.setEnabled(false). 53

68 4.5. RŮZNÉ Jako enabled je nastaven pouze v případech, kde může být žádoucí, aby uživatel mohl text vybrat a zkopírovat - např. dialog O Programu, položky Autor a Kontakt. Také všechny texty, jejichž součástí je URL odkaz, musí být enabled, jinak na odkaz nelze kliknout. Enabled v takovém případě musí být celý StyledText obsahující odkaz. Dalším řešením je vytvořit jeden StyledText obsahující text před odkazem, následovaný druhým StyledText, který obsahuje pouze URL odkaz. V takovém řešení ovšem nefunguje správně automatické zalamování řádek, zvolil jsem proto první možnost, kdy je enabled celý text s URL odkazem Jediná instance programu Ve třídě MainClass je uložen boolean oneinstance. Pokud je nastaven na true (výchozí nastavení pro distribuci programu), lze spustit pouze jedinou instanci aplikace Kontrola jediné instance programu Před inicializací GUI je zkontrolována existence souboru token. Pokud soubor neexistuje, aplikace ho vytvoří a nastaví mu příznak deleteonexit(). Při ukončení aplikace tak dojde k jeho smazání. Pokud soubor existuje, aplikace zobrazí dialog informující uživatele, že je již spuštěna jiná instance programu (obr. 4.8). Obrázek 4.8: Dialog informující uživatele o již spuštěné instanci aplikace Uživatel může zvolit spuštění aplikace i přes existenci souboru token. Tím je ošetřen případ, kdy při předchozím spuštění aplikace nebyla řádně ukončena a soubor token nebyl vymazán. Zvažoval jsem i další způsoby kontroly již běžící aplikace: Uzamykání souboru token, např. pomocí java.nio.channels.filelock. Soubor je v takovém případě automaticky odemčen při ukončení JVM. Stále ale může dojít k situaci, kdy z důvodu chyby soubor zůstane uzamčen (např. při pádu operačního systému). Blokování portu místo souboru je použit libovolný port. V tomto případě ale může docházet ke kolizi s jinou aplikací, používající daný port, případně k problémům s firewallem. Jednoduché řešení pomocí zjištění existence souboru se tedy jeví nejlepší. 54

69 KAPITOLA 4. IMPLEMENTACE Přístupnost Velikost okna aplikace Velikost okna aplikace může uživatel libovolně měnit. Výchozí velikost okna je px. Toto rozlišení považuji za dostatečné pro přehledný layout aplikace. Podle statistik uváděných na webu je zároveň dostatečně malé pro většinu dnes používaných rozlišení monitorů. Podle těchto statistik má pouze 1% uživatelů rozlišení px, nebo menší. Obrázky a texty Aplikace obsahuje mnoho obrázků u položek menu, tlačítek, záložek dialogu Možnosti apod. Obrázky slouží k rychlejší orientaci uživatele, který je již s aplikací seznámen. Zároveň je ale u všech takto použitých obrázků uveden i text. Ten slouží nejen pro rychlejší orientaci nového uživatele, ale například i pro větší přístupnost aplikace zrakově postiženým, využívajícím čtecí zařízení. Použité ikony Snažil jsem se volit jednoduché a výrazné ikony, které by uživateli usnadnily zapamatování polohy i funkce různých prvků aplikace. V případě, že se mi nepodařilo nalézt obrázek, který by vystihoval příslušnou položku menu nebo tlačítko, snažil jsem se zvolit alespoň výraznou ikonu, kterou si uživatel s danou položkou může asociovat a nebude si ji plést s jinými ikonami. V aplikaci jsou použity následující ikony: Ikony od Oxygen Team ze stránky poskytované pod licencí GNU LGPL. Ikony z kolekce Country flags (http://iconarchive.com). Jsou uvedné jako free for non-commercial use (autor neuvádí konkrétní licenci). Ikony z kolekce Function Icon Set, zmíněné v kapitole 1.2. Ikona kávy od uživatele Martin Berube (http://iconarchive.com) autor uvádí License: Freeware, Commercial usage: Allowed. Ikona autobusu z Podmínky použití viz pclipart.com/legal.html v zásadě je povoleno libovolné použití. Ikony autobusu a vlaku ze stránek Z podmínek (clker.com/disclaimer.html) opět vyplývá libovolné použití. Obrázek autobusu ze stránek společnosti Student Agency, sekce Pro média (www.studentagency.cz/pro-media/). 55

70 4.5. RŮZNÉ Název aplikace Zvolil jsem název aplikace SA Notify. Stejně jsem také pojmenoval plugin pro kontrolu míst ve spojích Student Agency. Tento název navazuje na původní program SA Notify, popsaný v kapitole Od autora programu jsem získal písemné povolení k užití tohoto názvu Komentáře Veškeré zdrojové kódy jsou opatřeny podrobnými komentáři v anglickém jazyce. U rozsáhlejších komentářů jsem použil formátování pomocí HTML tagů pro zpřehlednění dokumentace vygenerované pomocí Javadoc. 56

71 Kapitola 5 Plugin SA Notify V této sekci se zabývám implementací pluginu SA Notify pro kontrolu volných míst ve spojích Student Agency. 5.1 Analýza a návrh řešení pluginu SA Notify Specifikace požadavků Analýzou rešerše všech existujících řešení v kapitole 2.1 bylo stanoveno množství funkčních i nefunkčních požadavků. Plugin by měl umět: sledovat více spojů najednou aktualizovat seznam stanic načítat dostupné spoje pro zvolené datum ze serveru poradit si s více spoji v jeden čas minimalizovat se do oznamovací oblasti (OS Windows) automaticky zarezervovat volná místa hledat pouze preferovaná sedadla rozlišovat typy spojů (vlak/autobus, autobus Fun & Relax/Posilový spoj bez služeb apod.) přehrát výrazné zvukové upozornění při úspěšném hledání zobrazit historii hledání měl by mít přehledné grafické rozhraní

72 5.1. ANALÝZA A NÁVRH ŘEŠENÍ PLUGINU SA NOTIFY Případy užití Na základě specifikovaných požadavků byly stanoveny následující případy užití: Hlavní okno pluginu Obrázek 5.1: Případy užití hlavního okna pluginu SA Notify Na obrázku 5.1 jsou znázorněny hlavní případy užití pluginu: Přidat spoj Uživatel zvolí tyto parametry požadovaného spojení: - Výchozí stanice - Cílová stanice - Datum - Konkrétní spoj v daný čas Po potvrzení výběru aplikace začne s kontrolováním volných míst. Odebrat spoj Uživatel zruší hledání volného místa u vybraného spoje. 58

73 KAPITOLA 5. PLUGIN SA NOTIFY Zapnout automatickou rezervaci Uživatel zapne automatickou rezervaci. V případě nalezení volného místa aplikace volné místo ihned zarezervuje. Uživatel musí předem zadat přihlašovací údaje ke kreditové jízdence v Nastavení pluginu. Zvolit preferovaná sedadla Uživatel může zvolit, jaká sedadla preferuje: - Jakákoli - U okna - V uličce - Vše kromě prostřední části zadní 5-sedačky (tzn. na sedadla na 5-sedačce u oken program upozorní) Za nejdůležitější považuji volbu Vše kromě prostřední části zadní 5-sedačky. Cestovat na delší vzdálenosti na sedadle uprostřed 5-sedačky, kdy z obou stran sedí další cestující, je velmi nepohodlné. Sedadlo je relativně úzké a mezi sedadly nejsou opěrky pro ruce, je tedy silně narušen intimní prostor cestujícího. Tato sedadla bývají proto poslední obsazená a zároveň to jsou často první místa, která se uvolní v plném spoji. Je proto důležité, aby uživatel mohl vyloučit rezervaci právě těchto sedadel. Zobrazit nastavení Aplikace zobrazí dialog s možnostmi nastavení pluginu. Více viz kapitola Zobrazit historii Aplikace zobrazí historii všech proběhlých hledání. 1 Každá položka obsahuje: - Výchozí stanice - Cílová stanice - Datum a čas spoje - Typ spoje (vlak, bus, posilový bus, bus Fun & Relax apod.) - Preferovaná sedadla - Stav automatické rezervace (zapnuta/vypnuta) - Rezervované sedadlo (bylo-li rezervováno) Nastavení pluginu Nastavit výchozí preferovaná sedadla Uživatel zvolí výchozí preferovaná sedadla (jednotlivé možnosti viz předchozí kapitola). 1 Hledání je ukončeno a uloženo do historie okamžikem nalezení volného místa. 59

74 5.1. ANALÝZA A NÁVRH ŘEŠENÍ PLUGINU SA NOTIFY Obrázek 5.2: Případy užití v dialogu Nastavení pluginu SA Notify Aktualizovat seznam zastávek Aplikace podle webového rezervačního systému Student Agency aktualizuje seznam zastávek. Uživatel tuto možnost zvolí pouze pokud se lokální seznam aplikace stane neaktuálním. Zvolit akci pro volné místo Uživatel zvolí výchozí akci při nalezení volného místa. Systém buď na volné místo pouze upozorní, nebo ho ihned zarezervuje. Ve druhém případě musí uživatel zadat přihlašovací údaje ke kreditové jízdence a vybrat cenový tarif. Nastavit výchozí trasu Uživatel zvolí výchozí počáteční a cílovou stanici. Zvolené stanice budou přednastavené v dialozích pro výběr počáteční a cílové stanice. Nezobrazovat stará hledání Systém z výpisu hledaných spojů odebere spoje, které jsou již neaktuální (proběhl čas odjezdu). Tyto spoje zůstanou uložené v historii, pokud je ukládání historie zapnuto. 60

75 KAPITOLA 5. PLUGIN SA NOTIFY Ukládat historii Zvolí-li uživatel tuto možnost, aplikace uloží všechna úspěšná hledání do historie Diagram aktivit - přidání spoje Obrázek 5.3: Diagram aktivit - přidání spoje do vyhledávání Na obrázku 5.3 je diagram aktivit pro přidání spoje do vyhledávání. Uživatel postupně navolí všechny potřebné parametry, aplikace průběžně kontroluje jejich správnost. 61

76 5.1. ANALÝZA A NÁVRH ŘEŠENÍ PLUGINU SA NOTIFY Analytický model V této kapitole je popsána struktura tříd pluginu. Základní struktura odpovídá té zobrazené na obrázku 4.5, byly ale přidány některé další, pomocné třídy Hledání volných míst Obrázek 5.4: Třídy účastnící se hledání volných míst Na obrázku 5.4 jsou třídy přímo se účastnící hledání volných míst. SA je hlavní třída pluginu, implementující interface PluginInterface. SAChecker obsahuje metody pro parsování HTML stránek a vyhledání požadovaných dat na stránkách. SACheckerThread je vlákno provádějící kontrolu volných míst. SATableItemBean reprezentuje jednu položku hledání. SALineBean je fieldem SATableItemBean a reprezentuje konkrétní spoj. V SATableItemBean jsou uloženy obecné informace o hledání (nastavení automatické rezervace, preferovaných míst apod.), zatímco v SALineBean jsou uloženy detaily spoje - čas odjezdu, typ spoje apod. 62

77 KAPITOLA 5. PLUGIN SA NOTIFY DateTimeBean je pomocná třída, reprezentující datum a čas a obsahující pomocné metody např. pro zjištění dne v týdnu. Je navržena pro snadnou interakci s SWT widget DateTime Nastavení a historie Obrázek 5.5: Nastavení pluginu a historie hledání SAHistory obstarává zobrazování a ukládání historie pluginu. SAPreferences zobrazí dialog Nastavení. SAPreferencesBean pro jednodušší použití frameworku JFace Data Binding (viz 3.1.5) jsou veškeré hodnoty, které může uživatel změnit v dialogu Nastavení, reprezentovány třídou SAPreferencesBean. SAStationsUpdate slouží k aktualizování seznamu stanic. Díky implementaci interfacu UpdateInterface může uživatel aktualizaci v průběhu přerušit Chyby a obrázky Plugin má vlastní třídu pro zobrazování chyb uživateli (SAErrorHandler, obrázek 5.6), která je potomkem třídy ErrorHandler. 63

78 5.2. IMPLEMENTACE PLUGINU Obrázek 5.6: Třídy pro správu chyb a obrázků pluginu Potomek třídy ImageHandler, třída SAImageHandler, slouží k inicializaci a disposingu obrázků pluginu Grafický návrh pluginu Grafický návrh je na obrázku 3.6. Při návrhu jsem se snažil, aby všechny důležité komponenty byly ihned přístupné - tedy aby uživatel nemusel například přepínat mezi dialogem pro výběr stanice a dialogem pro výběr data. V současné podobě lze velmi rychle navolit potřebné parametry a spoj přidat do vyhledávání. 5.2 Implementace pluginu Rezervační systém Student Agency Společnost Student Agency svůj web pro rezervaci spojů v minulosti několikrát změnila. K poslední velké změně došlo v roce Poslední verze webu ve velké míře využívá Javascript a technologii Ajax. I pro pouhé zobrazení spojů pro zvolený den je tak nutné na server odeslat několik Ajax požadavků. Požadavky přitom obsahují i proměnné generované Javascriptem na straně klienta, které se dynamicky mění např. podle počtu přístupů na stránku. Ani získání požadovaných dat za použití HTML requestů simulujících Ajax požadavky tedy není zcela triviální. Stránky rezervačního systému bývaly v minulosti (v době, kdy byly funkční programy pro kontrolu volných míst zmíněné v kapitole 2.1) často přetížené. Lze proto předpokládat, že současná dynamická podoba webu je zčásti záměrem za účelem vyřazení robotů, které v minulosti na stránky přistupovaly. 64

79 KAPITOLA 5. PLUGIN SA NOTIFY Přístup k rezervačnímu systému Ať už je domněnka z předchozí kapitoly pravdivá či nikoli, jistě je vhodné přistupovat na stránky Student Agency tak, aby aplikace server zbytečně nezatěžovala a zároveň aby byla pokud možno snížena možnost detekce robota ze strany správce serveru. Všechny přístupy k rezervačnímu systému jsou proto prováděny pomocí knihovny Jsoup, která umožňuje snadné nastavení všech parametrů HTML requestu a jednoduchou práci s cookies. Hlavičky requestu jsou nastaveny tak, aby request simuloval prohlížeč Mozilla Firefox v Ajax požadavky Při odpovídání na některé Ajax požadavky vrací server HTML kód s escaped HTML tagy (vrací pouze kódy tagů). Před parsováním pomocí Jsoup je proto vrácený kód převeden na validní HTML pomocí org.apache.commons.lang.stringescapeutils - metoda unescape(). Apache Commons knihovny jsou poskytovány pod licencí Apache License, Version 2.0 [27] Interval kontroly volných míst Pro interval kontroly volných míst, nastavovaný ve třídě SACheckerThread, jsem zvolil 70 s ± 20 s. Interval by měl být co největší kvůli zátěží serveru, při intervalu větším než 90 s už ale roste nebezpečí, že volné místo zarezervuje někdo jiný a to i bez použití této aplikace: I v době, kdy nebyl funkční žádný z programů pro kontrolu volných míst, byla uvolněná místa ve špičce během maximálně několika minut opět zarezervována Grafické rozhraní V této kapitole popisuji implementaci grafického rozhraní aplikace a provedené změny oproti grafickému návrhu. Na obrázku 5.10 je vidět srovnání GUI původního grafického návrhu a výsledné aplikace Výchozí a cílová stanice Oproti návrhu bylo přidáno tlačítko pro prohození výchozí a cílové stanice cesty. Typický cestující cestuje pravidelně na jediné trase v obou směrech, potřeba tlačítka se proto objevila již při prvotním testování aplikace Spoje V první verzi grafického rozhraní byl výpis dostupných spojů tvořen widgetem List, ten je i v GUI návrhu aplikace. List ale neumožňuje formátovat text (jednotlivé položky mohou být jedině typu String) nebo zobrazovat obrázky, provedl jsem proto refaktoring a použil widget Table (obr. 5.7). 65

80 5.2. IMPLEMENTACE PLUGINU Výška tabulky: Tabulka se spoji musí mít pevně nastavenou výšku, jinak se automaticky nastaví tak, aby byly zobrazeny všechny položky. Výška by ale zároveň měla být pohyblivá, aby při změně velikosti okna došlo i ke změně velikosti tabulky. Byl proto přidán Shell Resize Listener, který při změně velikosti okna programu změní velikost tabulky podle nové velikosti Shellu. Vhodnější by bylo přiřadit tento Resize Listener ke Compositu pluginbody, jenž obsahuje všechny komponenty těla pluginu, nebo alespoň velikost tabulky podle pluginbody počítat. V současné implementaci by totiž při změně okolního layoutu (např. vypnutí stavového řádku) byla velikost tabulky nastavena špatně. Při přiřazení Listeneru k pluginbody byla ale odezva na změnu velikosti okna nepřirozeně pomalá a trhaná - pravděpodobně kvůli řetězení Listenerů, kdy změna velikosti okna inicializuje změnu velikosti Shellu, která teprve inicializuje změnu velikosti pluginbody pomocí MigLayoutu. Obrázek 5.7: Tabulka pro výběr konkrétního spoje Změny oproti návrhu: Jak je patrné z obrázku 5.7, tabulka se spoji obsahuje více informací, než v původním návrhu. Jsou to: Datum - vždy nad skupinou spojů pro daný den, podobně jako na obr. 3.6 Dopravní prostředek - ikonka vlaku, nebo autobusu Čas odjezdu Počet volných míst ve spoji Typ spoje - ikonka znázorňující typ spoje Aplikace rozlišuje tyto typy spojů: - Fun & Relax 66

81 KAPITOLA 5. PLUGIN SA NOTIFY - Posila Žlutý standard - Posila Economy Názvy typů a ikony odpovídají těm, které jsou použity na webu Student Agency Tabulka hledání Tabulka zobrazující probíhající hledání má nastaven parametr MigLayoutu endgroupy stejný jako tabulka spojů. Tím je zajištěno zarovnání jejich dolního okraje. Šířku sloupců tabulky může uživatel změnit. Nová šířka bude uložena při ukončení aplikace a použita při opětovném spuštění. Trasa: V tomto sloupci byla původně mezi výchozí a cílovou stanicí vykreslována šipka ( ), tak jako je tomu v grafickém návrhu. Ovšem přestože byl použit symbol šipky z Microsoft WGL4 character set (microsoft.com/typography/otspec150/wgl4d.htm), symbol se nezobrazoval na operačním systému Windows XP. Použil jsem proto jako oddělovací znak pomlčku ( ). CCombo s výběrem preferovaných míst: Widget CCombo je určen k nahrazení widgetu Combo v případech, kdy Combo nelze použít - např. jako prvek v řádku tabulky. Některé platformy nepodporují nastavení velikosti SWT.Combo (např. OS Windows), pro tabulku je proto nutné použít CCombo, které nevyužívá komponenty systému, ale je celé vykreslováno SWT knihovnou. Do tabulky je CCombo přidáno pomocí widgetu TableEditor (kapitola ). CCombo má bohužel podobná omezení jako Combo: nelze nastavit obrázek (a neexistuje ImageCCombo alternativa ke třídě ImageCombo, zmíněné v kap ) ani zarovnání textu na střed, tak jako je to v GUI návrhu. Při implementaci CCombo s výběrem preferovaných míst jsem narazil na bug (viz bugs.eclipse.org): Pokud je text delší než velikost Comba, je useknutý zleva, ne zprava. U bugu je popsaný i workaround: combo. addlistener (SWT. Resize, new L i s t e n e r ( ) { p u b l i c void handleevent ( f i n a l Event argevent ) { combo. settext ( combo. gettext ( ) ) ; } } ) ; Ten ovšem funguje jen pro widget Combo, ne pro CCombo. Vytvořil jsem proto pro CCombo Listener pro události SWT.Resize a SWT.Selection. 67

82 5.2. IMPLEMENTACE PLUGINU Oba Listenery pomocí SWT třídy GC (Graphics Context) spočítají přesnou šířku CComba i nezkráceného textu vybrané položky. Následně je spočítána průměrná šířka jednoho znaku textu a je vytvořen substring o tomto počtu znaků. Vzhledem k výpočtu pomocí průměrné šířky znaku, který je rychlejší než přesný výpočet šířky jednotlivých znaků (postačí celkovou šířku textu vydělit počtem znaků) může i vytvořený substring být stále širší, než je šířka CComba. I šířka větší jen o několik pixelů přitom způsobí useknutí části prvního písmene textu. U vytvořeného substringu je proto v cyklu kontrolována šířka a snižován počet znaků, dokud není šířka textu opravdu menší, než šířka CComba. Na obrázku 5.8 je vidět CCombo se špatným zarovnáním i CCombo se zarovnáním opraveným popsanou metodou. Obrázek 5.8: Vlevo je vidět CCombo chyba špatné zarovnání textu, vpravo je chyba opravena Změny v tabulce hledání oproti návrhu: V tabulce je na začátku řádku zobrazena ikona dopravního prostředku. V současné verzi je zobrazována pouze ikona vlaku (viz obr. 5.9) - většina spojů jsou autobusy, ikona autobusu je navíc zobrazována v tabulce Spoje, není tedy třeba ji přidávat i do hlavní tabulky, kde by ubírala na přehlednosti. Byl přidán sloupec Typ, který zobrazuje typ spoje (stejně jako v tabulce Spoje). Na obrázku 5.9 je vidět autobus typu Fun & Relax a autobus Posila Economy. Obrázek 5.9: Tabulka hledání, probíhá hledání míst ve vlaku a autobusech Fun & Relax a Posila Economy TableEditor TableEditor je objekt, určený pro přidávání widgetů do tabulky. Může mu být přiřazen libovolný widget, který je umístěn nad zvolenou buňku tabulky. Jeho nevýhodou je nutnost ručního disposingu - při odebrání položky (řádku) tabulky není přiřazený TableEditor automaticky také odebrán. 68

83 KAPITOLA 5. PLUGIN SA NOTIFY Widget TableEditor byl použit pro přidání CComba s výběrem preferovaných míst a tlačítka pro vypnutí/zapnutí automatické rezervace do tabulky hledání Barvy Všechny barvy (SWT Color) používají línou inicializaci. Getter pro danou barvu zkontroluje, zda byla inicializována a případně zavolá setter. Ne všechny barvy jsou použity při každém spuštění programu, líná inicializace je tedy hospodárnější. Obrázek 5.10: Srovnání GUI návrhu s GUI výsledné aplikace 69

84 5.2. IMPLEMENTACE PLUGINU Implementace grafického rozhraní Seznam stanic Seznam stanic je uložen v XML souboru Stations.xml, uloženém ve složce pluginu (plugins/sa/). Soubor má následující strukturu: <s t a t i o n s czech> <s t a t i o n > <text >Český Krumlov, AN</text > <value>ck</value> </s t a t i o n > </s t a t i o n s czech> Načtení seznamu stanic ze souboru probíhá ve třídě SAPreferences. Pokud při načítání dojde k chybě (soubor je prázdný, nebo neexistuje), aplikace se pokusí připojit k serveru Student Agency a stáhnout nový seznam stanic Spoje Dojde-li k chybě při načítání spojů, aplikace upozorní uživatele jen v případě, že seznam stanic není prázdný to by znamenalo, že došlo k chybě při načítání seznamu stanic a uživatel byl již na chybu upozorněn. Třída SALineBean obsahuje informace o konkrétním spoji především čas, typ spoje (vlak/bus), podtyp (Fun & Relax/Posila), počet volných míst, ID spoje apod. Třída obsahuje i field DateTimeBean date, reprezentující datum spoje. Díky tomu je jednoduše možné vypisovat v tabulce Spoje více dní: Server v případě, že na hledaný den je k dispozici méně než 10 spojů, vyhledá spoje i na den následující. Je tedy nutné kontrolovat, zda vypisovaný spoj je pro zvolený den, nebo den následující a případně vypsat nadpis pro další den (viz obr. 5.10). Existující řešení z kapitoly 2.1 vypisovala spoje pouze pro jeden den. To ale může být pro uživatele matoucí - například by nepoznal, zda pro zvolený den už nejedou žádné spoje, nebo došlo k neoznámené chybě při výpisu spojů. Možnost vypisování navíc umožňuje budoucí rozšíření pluginu o tlačítko Další spoje, které by vyhledalo spoje následující po posledním nalezeném. Detail spoje: Aplikace umí ze serveru získat i podrobnější údaje o spoji, které lze na webu rezervačního systému získat stisknutím tlačítka Detail spoje. Pro tento účel existuje metoda SAChecker.setLineDetails(SALineBean bean), která doplní dosud prázdné fieldy objektu SALineBean: Čas příjezdu 70

85 KAPITOLA 5. PLUGIN SA NOTIFY Nástupiště Spojení (Stanice, ze které spoj vyjíždí a stanice, ve které končí.) Cena Sedadlo V první verzi pluginu byly detaily parsovány automaticky pro každý nalezený spoj. Server má ale velmi pomalou odezvu, získání detailů pro každý spoj trvá přibližně 1 vteřinu. Zpoždění při vypisování spojů by tedy bylo neúnosně velké. V současné verzi proto plugin detaily nezjišťuje. V budoucnu lze ale jednoduše implementovat např. rozšíření o tlačítko Zobrazit detail spoje. Aktualizace tabulky Spoje proběhne automaticky vždy, když uživatel zvolí jiné datum nebo změní výběr stanice v Combo boxech Z nebo Do. Okamžitou aktualizaci považuji za přívětivější a rychlejší než potvrzování výběru tlačítkem, jako je tomu na webu Student Agency Přidání spoje do vyhledávání Všechna nastavení provedená v dialozích pro výběr spoje (stanice, datum, čas) se ukládají do SATableItemBean bean, která je fieldem třídy SA. Při stisknutí tlačítka Přidat spoj aplikace zkontroluje: Platnost zvolených stanic Combo boxy s výběrem stanic obsahují i nadpisy zemí (Česko, Slovensko). Ty mají hodnotu stanice (VALUE) nastavenou na -1. Aktuálnost spoje - nelze přidat spoj, který již proběhl. Tato kontrola je spíše dvojím jištěním - při vyhledávání spojů server vrátí pouze spoje budoucí. Teoreticky by ale mohlo dojít k situaci, kdy plugin vyhledá spoje na dnešní den a uživatel výběr provede se zpožděním. Může se tedy stát, že vybere spoj, který mezitím odjel. Platnost zvoleného času analogicky se zvolenými stanicemi, i tabulka se spoji obsahuje nadpisy. Zda vybraný spoj již není v tabulce hledání. Proběhne-li kontrola v pořádku, SATableItemBean bean je zkopírováno pomocí tzv. Copy konstruktoru - konstruktor třídy přijímá jako parametr instanci téže třídy a zkopíruje všechny fieldy. Je-li kopírovaný field objektem (např. SALineBean), musí být také zkopírován pomocí Copy konstruktoru. Vytvořená kopie je přidána do ArrayListu<SATableItemBean> tabledata, který reprezentuje obsah tabulky hledání. Poté je nastaven příznak tabledatamodified pro vlákno procházející SACheckerThread (viz 5.2.4). 71

86 5.2. IMPLEMENTACE PLUGINU Diagram aktivit z obrázku 5.3 byl mírně pozměněn: Výchozí stanici, cílovou stanici a datum lze vybírat paralelně, jejich ověření probíhá až při přidávání spoje do vyhledávání Tabulka hledání Tabulka hledání je aktualizována na konci každého cyklu ve vlákně SACheckerThread, kontrolujícího počet volných míst u všech položek tabulky. Díky tomu uživatel vidí vždy aktuální počet volných míst ve sledovaných spojích. Při každém naplňování tabulky (tedy i při aktualizaci volných míst) je zároveň provedena kontrola aktuálnosti všech hledaných spojů. Spoje, které nejsou aktuální (uplynul čas odjezdu), jsou z tabulky vyřazeny, nebo označeny šedou barvou řádku, pokud uživatel zvolil možnost Zobrazovat stará hledání v nastavení pluginu. Řazení položek: Kliknutím na záhlaví libovolného sloupce lze řádky tabulky podle tohoto sloupce seřadit. Opakovaným kliknutím lze měnit směr řazení. Řazení je založeno na SWT Snippetu 192. SATableItemBean obsahuje za účelem řazení metody getstringcolumn(int index) a getlongcolumn(int index): Listener přiřazený ke všem sloupcům zavolá metodu Collections.sort(ArrayList<SATableItemBean> data, Comparator comparator). Použitý Comparator má přetíženou metodu compare(): Metoda podle indexu (čísla sloupce, na jehož záhlaví uživatel kliknul a který je tedy řazen) zavolá buď SATableItemBean.getStringColumn(index), nebo SATableItemBean.getLongColumn(index). Tyto metody vrací String, nebo Long reprezentaci hodnoty vybraného sloupce, která je dále porovnávána ve zbytku metody compare(). Tento způsob je výhodný vzhledem k různé reprezentaci dat v jednotlivých sloupcích. Například sloupec Datum obsahuje datum ve tvaru Ww DD.MM. (Ww je zkratka dne v týdnu). Při řazení podle tohoto sloupce je proto v compare() volána metoda SATableItem- Bean.getLongColumn(1), která vrátí počet milisekund reprezentující dané datum (zaokrouhlené na minuty) Kontrola volných míst Kontrola volných míst probíhá ve vlákně SACheckerThread ve while cyklu metody Run() (dále jen While cyklus), jehož struktura odpovídá té popsané v kapitole Cyklus běží, dokud jsou v tabulce hledání platné spoje. Protože kontrola běží v samostatném vlákně, bylo nutné ošetřit chyby ConcurrentModificationException, způsobené paralelním modifikováním Listu tabledata, obsahujícího položky tabulky hledání obsah tabulky totiž může být kdykoli změněn uživatelem. Na začátku cyklu je proto obsah tabledata zkopírován do lokálního ArrayListu a kontrola probíhá nad lokálním Listem. 72

87 KAPITOLA 5. PLUGIN SA NOTIFY Kopírování položek V průběhu procházení Listu tabledata za účelem zkopírování vždy před přístupem k další položce proběhne kontrola, zda nedošlo ke změně obsahu Listu. K tomu slouží příznak tabledatamodified, nastavovaný při změně obsahu tabulky hledání uživatelem. Jestliže aplikace zjistí, že byla provedena modifikace Listu, zahodí dosud zkopírovaný obsah a začne kopírování od začátku. Tímto způsobem je zajištěno ošetření proti chybám ConcurrentModificationException a zároveň ArrayList tabledata nemusí být pro účely kopírování uzamčen pro modifikaci uživatelem Volná místa spoje Ve While cyklu jsou kontrolována volná místa postupně pro všechny položky tabulky hledání. V seznamu spojů pro konkrétní den, který vrací server, je HTML tag <DIV>, obsahující počet volných míst, identifikován unikátním atributem ID. Tento atribut je ale generován dynamicky a pokud dojde ke změně v seznamu spojů (například se jedná o dnešní den a oproti předchozí kontrole je vráceno o jeden spoj méně, neboť čas odjezdu prvního spoje uplynul), ID se změní. Je proto nutné nalézt nejprve <DIV> obsahující atribut row:id, jehož hodnotou je unikátní, neměnící se ID pro konkrétní spoj a následně procházením DOM struktury pomocí Jsoup nalézt <DIV> obsahující volná místa Jsoup bug HTML tag <A> Při práci s HTML parserem Jsoup jsem objevil následující chybu: Obsah tagu <A> je považován za text a není brán v úvahu při vytváření Jsoup objektu Document, který reprezentuje DOM strukturu HTML stránky. Obsah tagu musí tedy být samostatně parsován do nového objektu Document Spoje pro stejný den Obrázek 5.11: Tabulka hledání, probíhá hledání pro více spojů na 1 lince 73

88 5.2. IMPLEMENTACE PLUGINU Při kontrole konkrétního spoje ve While cyklu je načtená webová stránka uložena a při kontrole následujícího spoje aplikace zkontroluje, zda se nejedná o stejnou linku a stejné datum pokud ano, není nutné znovu načítat stránku ze serveru. Při typickém využití aplikace uživatel hledá volné místo pro několik různých spojů ve stejný den, lišící se jen různými časy odjezdu (obr.5.11). Je tedy výhodné, pokud program tuto skutečnost kontroluje a zbytečně nezatěžuje server opakovaným stahováním stránky. Vyhledání seznamu spojů na serveru navíc podle aktuálního zatížení serveru může trvat i více než 10 s, dojde tedy i k významnému urychlení kontroly míst. Proměnná interface : Proměnná interface, odesílaná na server jako jeden z parametrů při každém HTML požadavku, reprezentuje počet kroků, které uživatel udělal ve webovém rozhraní rezervace. Při prvním přístupu je odesílaná hodnota 0, při odesílání požadavku na vložení spoje do košíku již musí být hodnota odesílaného parametru nastavena na 1. Výše popsaný způsob kontroly volných míst pro spoje ve stejný den lze proto použít pouze pokud při kontrole spojů nedochází k navýšení hodnoty parametru interface. K tomu dochází při kontrole preferovaných míst a při automatické rezervaci spoje. V opačném případě by došlo k chybě např. při následujícím scénáři: 1. Uživatel přidá 2 spoje Praha - Brno, odjíždějící ve 13:00 a ve 14: Pro první spoj zapne automatickou rezervaci a nastaví preferovaná sedadla, pro druhý spoj pouze preferovaná sedadla. 3. Aplikace zkontroluje první spoj, nalezne volné místo. 4. Aplikace zkontroluje, zda se jedná o preferované místo (dojde k navýšení proměnné interface). 5. Aplikace se místo pokusí zarezervovat (dojde k několikerému navýšení proměnné interface nová hodnota závisí na úspěchu rezervace, případně na kroku rezervace, ve kterém došlo k chybě např. z důvodu špatného přihlašovacího jména nebo nedostatečného kreditu). 6. Aplikace se pokusí zkontrolovat druhý spoj zjistí, že se jedná o spoj pro stejnou linku a den jako předchozí, proto znovu nenačte HTML stránku se spoji, použije uloženou předchozí stránku. 7. Analýzou HTML stránky zjistí, že druhý spoj také obsahuje volná místa. Pokusí se odeslat na server požadavek o rozpis sedadel pro kontrolu, zda se jedná o preferované sedadlo. V této chvíli dojde k chybě, neboť je odeslána špatná hodnota proměnné interface a server na požadavek odpoví přesměrováním na hlavní stránku, nebo stránku s informací o chybě. Jak je vidět z bodu 5, hodnota proměnné interface po provedení rezervace (ale i po ověření preferovaných míst) není přesně definována záleží na úspěchu rezervace, případně na místě výskytu chyby. Sledovat správnou hodnotu by bylo složité. Aplikace proto raději v případě, že mohlo dojít ke změně hodnoty (předchozí spoj má zapnutou automatickou rezervaci nebo preferovaná místa) vytvoří novou session a stránku se seznamem spojů stáhne znovu. 74

89 KAPITOLA 5. PLUGIN SA NOTIFY Automatická rezervace Pro fungování automatické rezervace nalezených míst musí uživatel vyplnit v Nastavení pluginu číslo své kreditové jízdenky, heslo a cenový tarif, který bude použit při koupi jízdenky (např. Dospělý nebo ISIC). Aplikace poté může nalezená místa zarezervovat a uhradit z kreditu. Heslo pro přístup ke kreditové jízdence je ukládáno do konfiguračního souboru šifrovaně a je dešifrováno před odesíláním na server (server Student Agency nepoužívá žádné šifrování pro odesílané heslo). Tarif použitý při rezervaci je ukládán samostatně ke každému spoji. Do budoucna je tak případně možné rozšířit plugin o možnost nastavit tarif každému spoji zvlášť. V současné verzi je pro všechny spoje použit tarif zadaný v Nastavení pluginu, zvolená hodnota je ale zkopírována do SATableItemBean reprezentující daný spoj. Přihlášení: Při přihlašování přes webové rozhraní je na server odesílán spolu s číslem kreditové jízdenky a heslem také atribut ID tagu <input type= hidden >. Přihlášení proběhne úspěšně i bez odeslání tohoto parametru. Pro věrnější imitaci webového prohlížeče ho ale plugin odesílá také Úspěšné hledání Obrázek 5.12: Bylo nalezeno volné preferované místo Obrázek 5.13: Bylo nalezeno volné preferované sedadlo a bylo ihned rezervováno a uhrazeno z kreditu V případě úspěšného hledání je zavolána metoda SA.success(), která zobrazí informace o úspěchu uživateli. 75

90 5.2. IMPLEMENTACE PLUGINU Pojem úspěšné hledání zahrnuje tyto stavy: Automatická rezervace je vypnutá: Nalezeno volné místo, nejsou nastavena preferovaná sedadla. Nalezeno volné místo, jedná se o preferované sedadlo. Nalezeno volné místo, sedadlo přiděluje steward/ka. Nalezeno volné místo, ale nepodařilo se ověřit, zda se jedná o preferované sedadlo. Automatická rezervace je zapnutá: Nejsou nastavena preferovaná místa: Nalezeno a rezervováno volné místo. Nalezeno volné místo, došlo k chybě při rezervaci špatné číslo kreditové jízdenky nebo heslo. Nalezeno volné místo, došlo k chybě při rezervaci nedostatečný kredit. Nalezeno volné místo, došlo k chybě při rezervaci (např vypršel timeout spojení, server je přetížen). Jsou nastavena preferovaná místa: Nalezeno a rezervováno volné preferované sedadlo. Nalezeno a rezervováno volné místo, sedadlo přiděluje steward/ka. Nalezeno volné preferované sedadlo, došlo k chybě při rezervaci špatné číslo kreditové jízdenky nebo heslo. Nalezeno volné preferované sedadlo, došlo k chybě při rezervaci nedostatečný kredit. Nalezeno volné preferované sedadlo, došlo k chybě při rezervaci (např vypršel timeout spojení, server je přetížen). Nalezeno volné místo, ale nepodařilo se ověřit, zda se jedná o preferované sedadlo. Pro každý z těchto stavů je zobrazena zpráva informující uživatele o daném stavu. Součástí zobrazeného dialogu je buď odkaz na stránku s výpisem spojů (v případě, že bylo nalezeno volné místo, ale nebylo rezervováno obr. 5.12) nebo odkaz na stránku se seznamem rezervací na kreditové jízdence (nalezené místo bylo rezervováno obr. 5.13). Aplikace také zobrazí výstražnou zprávu, pokud bylo rezervováno místo ve spoji, který uživatel mezitím z tabulky hledání odstranil (obr. 5.14), nebo u kterého vypnul automatickou rezervaci. Obrázek 5.14: Byl rezervován spoj, který uživatel odstranil z tabulky hledání 76

91 KAPITOLA 5. PLUGIN SA NOTIFY Rezervované sedadlo Při úspěšné rezervaci program ve zprávě o úspěchu vypíše i číslo rezervovaného sedadla (obr a 5.14). Chyby při zjišťování čísla rezervovaného sedadla (např. v případě rezervace přestupních spojů viz kapitola 5.2.7) jsou odchytávány zvlášť a uživatel na ně není upozorněn, pouze ve zprávě o úspěchu neuvidí rezervované sedadlo Přestupní spoje Hledání míst v přestupních spojích: Původní návrh pluginu počítal s kontrolou, zda se jedná o přímý spoj. V opačném případě by program nepovolil spoj přidat do vyhledávání viz diagram aktivit na obr Struktura seznamu vyhledaných spojů je ale shodná pro přímé spoje i spoje přestupní rezervační systém zobrazuje informace o přestupech až v dalším kroku rezervace. Plugin proto umožňuje bezproblémové vyhledávání volných míst i v přestupních spojích. Rezervace přestupních spojů: bez problémů. Automatická rezervace funguje pro přestupní spoje také Nefunguje pouze kontrola preferovaných sedadel: U přestupních spojů je vždy minimálně u jednoho spoje přidělováno sedadlo stewardem/kou. To i v případě, kdy při rezervaci toho samého spoje jednotlivě lze sedadlo libovolně zvolit jedná se pravděpodobně o omezení rezervačního systému Student Agency. Plugin v současné implementaci u všech přestupních spojů nalezne na stránce s výběrem sedadla informaci o přidělování sedadla stewardem/kou a nepokusí se proto o kontrolu preferovaných sedadel Chyby při hledání volných míst V době vzniku této práce byl rezervační systém Student Agency v nejvíce exponovaných časech často přetížen. I při testování programu docházelo k timeoutu spojení (timeout pokusu o spojení je nastaven na 10 vteřin), případně docházelo k chybě, když server místo požadované stránky vrátil stránku s informací Server je přetížen, zkuste to prosím později. Bylo proto nutné ošetřit případy dočasné ztráty spojení Požadavky na ošetření chyb spojení Stanovil jsem následující požadavky na ošetření chyb spojení: Při chybě by nemělo dojít k přerušení hledání může se jednat pouze o timeout spojení a příští pokus bude úspěšný. Při opakovaných chybách by mělo dojít k prodloužení intervalu kontroly volných míst, aby nedocházelo ke zbytečně častým pokusům o připojení při dlouhodobém výpadku. 77

92 5.2. IMPLEMENTACE PLUGINU Uživatel by měl být na ztracené spojení jednorázově upozorněn. Nemělo by dojít k přerušení hledání ani po mnohonásobném neúspěchu to by mohlo být pro uživatele frustrující v případě, kdy by měl server periodické výpadky a uživatel by musel po každém delším výpadku hledání znovu manuálně spustit Navrhnuté řešení Obrázek 5.15: Upozornění uživatele na ztracené spojení Všechny metody, které přistupují na server, nebo vyhledávají data na HTML stránkách vrácených serverem, odhazují výjimky. Výjimky jsou zachycené ve While cyklu třídy SACheckerThread. Při vyskytnutí výjimky je tato uložena do.log souboru a je o 1 navýšena hodnota integeru failcounter. FailCounter je vynulován, pokud jeden cyklus (kontrola všech spojů z tabulky hledání) proběhl úspěšně. Pokud failcounter dosáhne hodnoty konstanty MAX_FAILS (výchozí nastavení je na hodnotu 5), je uživateli zobrazena informace o pravděpodobně ztraceném spojení a informace, že program se dál bude pokoušet o navázání spojení (obr. 5.15). While cyklus nadále pokračuje a failcounter je při chybě stále navyšován. Vždy, když hodnota failcounter dosáhne násobku konstanty MAX_FAILS (včetně případu kdy je failcounter roven MAX_FAILS), zvýší se interval hledání (uložen ve fieldu INTERVAL třídy SACheckerThread viz 4.4.5) o hodnotu INTERVAL_DEFAULT (původní interval, nastaven na 70 s) a odchylka (field DEVIATION) o hodnotu DE- VIATION_DEFAULT. Při úspěšném pokusu o připojení jsou interval i odchylka nastaveny zpět na své původní hodnoty Chyby v synchronizaci vláken Způsob kopírování ArrayListu tabledata ve vlákně SACheckerThread, popsaný v kapitole , zabraňuje vznikům výjimek ConcurrentModificationException. Může ale docházet k chybě, která nevyvolá výjimku, ale způsobí nesprávné chování programu, konkrétně dvojí rezervaci jednoho spoje: 78

93 KAPITOLA 5. PLUGIN SA NOTIFY Může dojít k situaci, kdy je spoj rezervován a SACheckerThread zavolá metodu pro vyhodnocení úspěchu SA.success(). Dříve, než metoda success() doběhne a dojde k odstranění nalezené položky z tabulky hledání, doběhne While cyklus v SACheckerThread a začne odznovu tedy zkopíruje si opět ArrayList tabledata, který ovšem stále obsahuje již rezervovaný spoj, který je následně podruhé zarezervován. K této chybě docházelo vždy, když kontrola volných míst trvala déle, než byl nastavený interval kontroly (field INTERVAL třídy SACheckerThread). V takovém případě totiž po ukončení While cyklu začne ihned cyklus nový (vlákno není na konci cyklu uspáno). Na tuto chybu by byl uživatel upozorněn dialogem z obr. 5.14, jejímu vzniku lze ale zamezit použitím jednoduchého zámku: Na začátku metody success() je field třídy SA, boolean updatingtable nastaven na true a na konci této metody zpět na výchozí hodnotu, false. Na konci While cyklu ve třídě SACheckerThread je smyčka while (! SA. getupdatingtable ( ) ) { s l e e p (WAITING_INTERVAL) ; } Konstanta WAITING_INTERVAL je nastavena na 500 ms. Tato hodnota je zbytečně vysoká, vzhledem k minimální době trvání jednoho cyklu, nastavené na 70 s ± 20 s, to ale nevadí Nastavení pluginu Obrázek 5.16: Dialog Nastavení pluginu SA Notify Dialog Nastavení je vytvořen ve třídě SAPreferences, která je potomkem abstraktní třídy Preferences. 79

94 5.2. IMPLEMENTACE PLUGINU Tato třída realizuje všechny případy užití z kapitoly Třída SAPreferences vytvoří instanci třídy SAPreferencesBean, obsahující gettery a settery pro všechny fieldy reprezentující jednotlivé možnosti nastavení. Přes třídu SAPreferencesBean jsou pak všechny položky dialogu Nastavení pomocí JFace Data Binding provázány s příslušnými fieldy. Všechna nastavení jsou uložena do CommentedProperties a při ukončení aplikace do souboru plugins/sa/properties-sa.ini. 80

95 KAPITOLA 6. TESTOVÁNÍ Kapitola 6 Testování 6.1 Simple Code Metrics Simple Code Metrics je plugin pro IDE NetBeans, umožňující měření zdrojových kódu projektu. Kromě obecných informací (počet řádků kódu, objektů, metod) jsou jeho výstupem i hodnoty Lack Of Cohesion Metrics a Cyclomatic complexity Lack of Cohesion in Methods Lack Of Cohesion Metrics (LCOM) je metoda analýzy zdrojového kódu, jejímž výstupem je informace o počtu nesouvisejících úkolů, které jsou prováděny v jedné třídě. Je-li tedy hodnota LCOM příliš vysoká, třída provádí navzájem nesouvisející operace, stává se nepřehlednou a je vhodné rozdělit ji do několika tříd. Existují 4 metody měření (LCOM1 až LCOM4). Více o Lack of Cohesion in Methods a metodice měření různých verzí LCOM viz např. [24] nebo [2]. Sledoval jsem hodnotu LCOM3 u všech tříd rodičovské aplikace i pluginu SA Notify. LCOM3 dosahuje hodnot 0 až 2, hodnoty větší než 1 jsou považovány za signál k refaktoringu rozdělení třídy do několika menších tříd. Všechny třídy aplikace mají hodnotu LCOM3 menší než Cyclomatic complexity Cyclomatic complexity je další způsob analýzy kódu. Udává počet lineárně nezávislých cest skrz metodu ([12], [31]). Např. příkazy if tedy zvyšují hodnotu cyclomatic complexity. Metoda s hodnotou cyclomatic complexity (dále též CC) větší než 15 jsou považovány za příliš komplexní a doporučuje se jejich refaktoring. Analýzou pomocí Simple Code Metrics byly odhaleny tyto metody s nejvyšší hodnotou CC: SA.success()... CC 21 SA.setPluginBody()... CC 18 81

96 6.2. UŽIVATELSKÉ TESTY SACheckerThread.run()... CC 17 SACheckerThread.checkPreferredSeats()... CC 16 Metody SACheckerThread.run() a SACheckerThread.checkPreferredSeats() jsou krátké a považuji je za dostatečně přehledné, rozhodl jsem se proto neměnit je. Provedl jsem ale refaktoring metod success() a setpluginbody() rozdělením na několik menších. Po refaktoringu byly naměřeny následující hodnoty: SA.success_ReservationOn()... CC 10 SA.setPluginBody()... CC < 8 SA.success_ReservationOn() je nejkomplexnější z metod, na které byla rozdělena původní metoda success(). Simple Code Metrics uvádí jen 4 nejvyšší hodnoty v rámci testovaného Java Package. Žádná z metod, vzniklých rozdělením SA.setPluginBody(), mezi 4 nejvyššími hodnotami nebyla. O CC metod, na které byla metoda setpluginbody() rozdělena, můžeme tedy s jistotou říct jen to, že je menší než 8 (nejnižší hodnota ze 4 nejvyšších, které Simple Code Metrics zobrazil). 6.2 Uživatelské testy V průběhu i na konci vývoje rodičovské aplikace a pluginu SA Notify jsem prováděl testování správného fungování všech funkcionalit programu. Velkou pozornost jsem věnoval zejména všem možným scénářům průběhu hledání a rezervace volného místa v pluginu SA Notify. Vzhledem k tomu, že tento plugin přistupuje k účtu uživatele na serveru Student Agency a uskutečňuje platby za rezervované jízdenky, je správná funkčnost pluginu klíčová. V průběhu vývoje pluginu SA Notify jsem vývojovou verzi poskytl několika dobrovolníkům, kteří aplikaci používali pro hledání volných míst a později (když byla tato funkce implementována) i pro automatickou rezervaci míst. Všechny chyby aplikace, které tito uživatelé objevili, byly odstraněny. V současné době nejsou známy žádné chyby aplikace. 6.3 Testování aplikace na různých platformách Jak již bylo zmíněno v kapitole 4, testování aplikace probíhalo v průběhu vývoje na OS Windows 7, Windows XP a Linuxové distribuci Ubuntu v , GUI GNOME v Byla otestována funkčnost aplikace i správné zobrazení všech prvků GUI. Při testování rodičovské aplikace i pluginu SA Notify byly odhaleny tyto chyby grafického rozhraní: 82

97 KAPITOLA 6. TESTOVÁNÍ Layout dialogu Možnosti je rozházený na Ubuntu GNOME (dále jen Ubuntu). Před otevřením Shellu dialogu Možnosti je nutné zavolat metodu shell.pack(). Layout se poté zobrazí správně. Na Ubuntu dojde ke správnému nastavení velikosti tabulky spojů pluginu SA Notify až při změně velikosti okna. Po otevření aplikace je výška tabulky nastavena špatně. Velikost této tabulky je nastavována pomocí Shell Resize Listeneru (viz kapitola ). Na OS Windows je spuštění aplikace považováno za Resize událost a příslušný Listener tak nastaví správnou velikost hned po spuštění. Na Ubuntu po spuštění Resize Listenery zavolány nejsou. Pro opravení chyby proto stačilo před otevřením Shellu hlavního okna aplikace zavolat shell.layout() a poté zavolat metodu, která nastavuje správnou velikost tabulky. Na Ubuntu je špatně pozicován horní banner u pluginu SA Notify konec obrázku byl uříznutý. Obrázek byl pozměněn tak, aby na jeho konci byla prázdná bílá plocha, takže nyní dojde k odříznutí pouze této plochy. Při roztahování okna programu do šířky na OS Windows nedochází k roztahování sloupců tabulky hledání pluginu SA Notify. Na Ubuntu dojde k roztažení posledního sloupce, obsahujícího tlačítko pro vypnutí/zapnutí automatické rezervace. Layout pluginu tím není nijak narušen a při ručním roztažení některého z předcházejících sloupců se šířka posledního sloupce zmenší na přednastavenou velikost. Při nastavení minimalizace do oznamovací oblasti nejsou na Ubuntu zobrazovány ikony v kontextovém menu nad ikonou v oznamovací oblasti. 6.4 Testování použitelnosti aplikace V této kapitole se zabývám testováním použitelnosti aplikace z pohledu běžného uživatele metodou kognitivního průchodu. Test probíhal na šesti osobách, které jsou pro větší přehlednost reprezentovány dvěma personami. Testované osoby byly vybírány tak, aby se jedné z person podobaly co největším počtem vlastností Metoda kognitivního průchodu Metoda kognitivního průchodu je založena na postupném plnění předem daných úkolů uživatelem. Činnost uživatele je monitorována. Po každém úkolu si klademe následující otázky: Je akce vidět? Každý krok úkolu by měl být vidět, aby nebyla kladena zbytečná zátěž na uživatelovu paměť. Při opakování úkolu tak může být vzpomínání nahrazeno rozpoznáváním uživatel rozpozná např. tlačítko pro hledanou akci. 83

98 6.4. TESTOVÁNÍ POUŽITELNOSTI APLIKACE Zvolil si uživatel správný cíl? Pochopil uživatel správně zadání úkolu a pustil se správným směrem? Zvolil uživatel správnou akci? Různé akce by měly být dostatečně popsány a odlišeny tak, aby uživatel poznal, že zvolil správnou akci, vedoucí k cíli. Rozumí uživatel zpětné vazbě? Po provedení akce by měl uživatel poznat, že došlo k jejímu úspěšnému dokončení. Dále byl sledován čas potřebný pro splnění jednotlivých akcí Persony Persony slouží ke kategorizaci uživatelů, provádějících testy použitelnosti. Každý uživatel je přiřazen jedné personě. Uvedené odpovědi na otázky pro personu jsou průměrným výsledkem uživatelů přiřazených této personě. V poznámce mohou být uvedeny rozdílné odpovědi uživatelů patřících pod jednu personu, pokud by tyto rozdíly mohly být důležité pro vyhodnocení výsledků testování. Za jménem persony je v takovém případě uvedeno číslo konkrétního uživatele, který prováděl testy (např. Karel 2). Persona Jitka Věk: 21 let Vzdělání: Studuje VŠ technického zaměření Práce s PC: Pokročilý uživatel. Jitka používá počítač denně k práci i zábavě. Nedělá jí problémy instalovat a zkoušet nové programy nebo hry. Dokáže online vyhledat řešení případných problémů se svým počítačem. Ovládá základy HTML. Persona Karel Věk: 52 let Vzdělání: VŠ ekonomického zaměření 84

99 KAPITOLA 6. TESTOVÁNÍ Práce s PC: Pouze na čistě uživatelské úrovni. Karel s počítačem pracuje denně v práci. Je zvyklý používat aplikace z rodiny MS Office a internetový prohlížeč. Používá stále stejné aplikace a nedokáže si sám bez pomoci osvojit práci s novým programem. Nemá žádné zkušenosti s instalací ani údržbou programů v případě jakéhokoli problému s PC je zvyklý požádat o pomoc technickou podporu. Zásadně nečte jakékoli vyskakovací dialogy. Karel 1 uvedl následující odpovědi na otázky: - Jaký používáte operační systém? - Office. - Jaký používáte internetový prohlížeč? - Seznam nebo Google. Nejraději mám Seznam Zadané úkoly Před zahájením testování byli všichni testovaní uživatelé pouze slovním popisem krátce seznámeni s účelem aplikace a pluginu SA Notify. Plnění prvního úkolu tak bylo vůbec první interakcí těchto uživatelů s aplikací. Všechny testy probíhaly na OS Windows Úkol 1 nastavení rodičovské aplikace 1. Spusťte aplikaci. 2. Nastavte minimalizaci programu do oznamovací oblasti (tj. do pravého dolního rohu obrazovky). 3. Otevřete dialog Možnosti a nastavte přehrávání libovolného zvuku u všech vyskakovacích dialogů. 4. Zkontrolujte, zda je k dispozici novější verze programu. 5. Otevřete dialog Možnosti a zkontrolujte, zda je vypnuto přehrávání všech zvuků v Tichém režimu. 6. Zapněte Tichý režim Úkol 2 práce s pluginem SA Notify 1. Přepněte na plugin SA Notify. 2. Zahajte hledání volných míst v libovolném spoji na trase Praha Brno. 3. V nastavení pluginu vypněte zobrazování starých hledání. 85

100 6.4. TESTOVÁNÍ POUŽITELNOSTI APLIKACE 4. V nastavení pluginu nastavte preferovaná sedadla V uličce. 5. V nastavení pluginu nastavte automatickou rezervaci. Použijte libovolné přihlašovací údaje. 6. Zahajte vyhledávání volných míst v libovolném spoji na trase Brno Praha. 7. Zobrazte historii hledaných spojů Výsledky testování Průběh testování a odpovědi na kladené otázky u dílčích úkolů jsou v příloze C. Zde je uveden pouze rozbor výsledků testování. Byly zjištěny následující nedostatky rodičovské aplikace nebo plu- Zjištěné nedostatky: ginu SA Notify: Zpočátku je pro uživatele matoucí dvojí dialog s možnostmi nastavení jeden v menu Nastavení Možnosti, druhý zobrazovaný tlačítkem Nastavení pluginu SA Notify. Volbu pro změnu stavu Tichého režimu většina uživatelů očekává i v dialogu Možnosti. Pro méně zkušené uživatele (persona Karel) jsou nastavení rodičovské aplikace málo přehledná a trvá jim déle je v menu nalézt. Tlačítko Přidat spoj je pro méně zkušené uživatele málo výrazné. Navržené změny: Na základě zjištěných nedostatků aplikace byly navrženy tyto změny: Přidat volbu pro vypnutí/zapnutí Tichého režimu do dialogu Možnosti. Zvýraznit tlačítko Přidat spoj. Přesunout některé položky z menu Nastavení a Nápověda na novou lištu v horní části okna aplikace, kde budou přímo přístupné. Závěr: Testování metodou kognitivního průchodu dopadlo velmi dobře: I uživatelé s velmi malými zkušenostmi (persona Karel, dále též nezkušení uživatelé) jsou schopni aplikaci bez větších problémů spustit a používat plugin SA Notify. Velmi důležitá se ukázala skutečnost, že maximum ovládacích prvků pluginu SA Notify je vidět v základním okně pluginu. Nezkušení uživatelé měli problémy s nalezením položek menu, které nejsou viditelné na první pohled. Základní obsluhu pluginu SA Notify ale díky přehlednosti GUI zvládali většinou bez problémů. Menu pluginů je dostatečně výrazné, všichni testovaní uživatelé pochopili jeho funkci a způsob přepínání pluginů. Je důležité zvolit takové výchozí nastavení programu, které bude vyhovovat co největšímu procentu uživatelů. Mnoho uživatelů totiž není zvyklých měnit nastavení používaných programů a orientovat se v možnostech nastavení. 86

101 KAPITOLA 7. PLUGIN DIVADLO JÁRY CIMRMANA Kapitola 7 Plugin Divadlo Járy Cimrmana 7.1 Analýza a návrh řešení pluginu Plugin Divadlo Járy Cimrmana (dále jen DJC) slouží ke kontrole volných míst na představení v Žižkovském Divadle Járy Cimrmana. Představení tohoto divadla bývají vyprodána během několika minut od zveřejnění programu na příští měsíc. Podobně jako v případě pluginu SA Notify ale dochází k nevyzvednutí rezervací a v následujících dnech jsou některá místa uvolněna. Plugin DJC umožňuje hlídat vybraná představení a upozornit na volná místa Funkční požadavky Byly stanoveny tyto funkční požadavky: upozornění na volná místa na vybrané představení možnost volby minimálního počtu míst, na která program upozorní ukládání přihlašovacích údajů Lístky uvolněné z důvodu propadlé rezervace nebývají znovu rezervovány tak rychle jako v případě lístku Student Agency. Není proto nutné, aby plugin nalezená volná místa ihned rezervoval. Tato funkcionalita může být případně doplněna s novými verzemi pluginu. Důležitým funkčním požadavkem je možnost nastavení minimálního počtu volných míst, na která plugin upozorní. Většina návštěvníků divadla kupuje na představení alespoň 2 lístky, nemělo by tedy smysl, kdyby plugin upozorňoval na jediné volné místo. 7.2 Implementace pluginu Plugin byl implementován s využitím postupu a předpřipravených tříd popsaných v programátorské příručce (příloha D). Implementace pluginu díky tomu trvala relativně krátkou dobu. 87

102 7.2. IMPLEMENTACE PLUGINU Oproti doporučené struktuře tříd pluginu (obr. D.2) byla provedena jediná změna: třída DJCCheckerThread, sloužící pro kontrolu volných míst, není instanciována přímo z hlavní třídy pluginu (třída DJC), ale z nově přidané třídy DJCChecker. Ta, obdobně jako třída SAChecker pluginu SA Notify, obsahuje metody pro přístup k rezervačnímu systému a parsování dat z HTML kódu Grafické rozhraní Implementace pluginu probíhala až po provedení testů použitelnosti, popsaných v kapitole 6.4. Na základě výsledků těchto testů bylo navrženo co nejjednodušší grafické rozhraní programu, které obsahuje pouze pole pro zadání přihlašovacího jména a hesla pro přístup k rezervačnímu systému (obr. 7.1) a 2 tabulky (obr. 7.2). V tabulce vlevo je vypsán program všech představení, vpravo jsou představení, u kterých probíhá kontrola volných míst. Obrázek 7.1: Údaje pro přihlášení k rezervačnímu systému Obrázek 7.2: Hlavní část těla pluginu DJC. Vlevo tabulka s programem divadla, vpravo představení, u nichž jsou hlídána volná místa. 88

103 KAPITOLA 7. PLUGIN DIVADLO JÁRY CIMRMANA Tlačítka Z testů použitelnosti pluginu SA Notify vyplynulo, že tlačítka, použitá pro přidání/odebrání spoje z vyhledávání jsou málo výrazná. Pro akce zahájení/ukončení hlídání volných míst byla proto navržena vlastní, podstatně výraznější tlačítka. Tlačítka jsou vykreslována na SWT widget Composite, u kterého se mění obrázek na pozadí při najetí nebo kliknutí myší. Text tlačítek je vykreslován pomocí SWT třídy GC ze zadaného Stringu. Při změně jazyka v nastavení aplikace se tedy i texty tlačítek změní podle aktuální jazykové verze Minimální počet míst Pro zadání minimálního počtu volných míst, na která má plugin upozornit, jsem použil rozbalovací seznam s přednastavenými hodnotami. Seznam obsahuje volby 1 až 10. Rezervační systém divadla neumožňuje rezervovat více než 10 lístků v rámci jednoho účtu, použitý rozsah hodnot je tedy dostatečný. Po přidání představení do vyhledávání může uživatel zvolenou hodnotu kdykoli změnit pomocí rozbalovacího seznamu u každého představení Interval kontroly volných míst Plugin kontroluje volná místa každých 5 minut ± 90 s. Jak již bylo zmíněno výše, uvolněná místa nebývají opět rezervována příliš rychle (obvykle místo zůstane volné minimálně několik desítek minut), není tedy nutné používat kratší interval a zbytečně zatěžovat server. 89

104 IMPLEMENTACE PLUGINU

105 KAPITOLA 8. DISTRIBUCE Kapitola 8 Distribuce 8.1 Licence: Program je šířen pod licencí GNU General Public License v Verze knihovny SWT Pro úspěšné spuštění aplikace je třeba použít správnou verzi knihovny SWT podle aktuální platformy. S aplikací jsou distribuovány následující verze SWT: Windows 32 b. Windows 64 b. Linux 32 b. Linux 64 b. OS X 32 b. OS X 64 b. Po spuštění aplikace je automaticky načtena verze SWT knihovny, odpovídající platformě. Pro výběr správně verze SWT bylo použito řešení popsané v [15]. Díky tomuto řešení lze aplikaci distribuovat v podobě jediného distribučního balíčku, který lze spustit na všech zmíněných platformách. Funkčnost tohoto řešení byla ověřena na OS Windows 7 32 b., Windows 7 64 b., Windows XP 32 b. a Ubuntu 32 b. 91

106 8.3. SPUŠTĚNÍ APLIKACE 8.3 Spuštění aplikace Launch4j Běžní uživatelé, používající OS Windows, často neznají soubory.jar a nevědí, že se jedná o spouštěcí soubor aplikace. Souborům.jar navíc nelze nastavit libovolnou ikonu, jako souborům.exe, a zvýraznit tak, že se jedná o spouštěcí soubor. Součástí kořenového adresáře distribučního balíčku je proto soubor SANotify.exe, kterým lze aplikaci spustit. Ve stejném adresáři je i soubor SANotify.jar. Je jedno, který ze souborů uživatel pro spuštění zvolí. Pro vytvoření souboru SANotify.exe jsem použil jednoduchý program Launch4j. Launch4j je poskytován zdarma i pro komerční účely a umožňuje rozsáhlá nastavení pro vytvoření.exe souboru, například: Kontrolu verze JRE Splash Screen Nastavení ikony.exe souboru Vlastní jméno procesu ve správci úloh je zobrazováno zvolené jméno procesu, ne pouze javaw.exe, jako při spuštění pomocí souboru.jar. Spuštění aplikace pomocí vytvořeného SANotify.exe probíhá následovně: Proběhne kontrola verze JRE. Jestliže není nalezena verze 1.7, program zobrazí upozornění a nabídne otevření webové stránky pro stažení Javy 1.7. Je zobrazen Splash Screen, totožný se Splash Screenem samotné aplikace. Spuštění SANotify.jar pomocí SANotify.exe trvá několik vteřin, je proto vhodné zobrazit Splash Screen již při spuštění SANotify.exe. Jakmile je spuštěn.jar, první Splash Screen je zavřen a je nahrazen Splash Screenem z SANotify.jar Spouštění přes příkazovou řádku Při spouštění aplikace přes příkazovou řádku na OS Windows je nutné zadat ručně použitou verzi Javy pomocí argumentu version:1.7+. Jedná se o bug JRE 1.7. Celý příkaz je tedy: java v e r s i o n :1.7+ j a r s a n o t i f y. j a r Spuštění bez GUI V současné době lze aplikaci spustit pouze s grafickým rozhraním. Navržená architektura aplikace ale do budoucna umožní snadné rozšíření o možnost spuštění bez GUI např. na vzdáleném serveru. Veškerá nastavení aplikace i pluginu SA Notify jsou uložena v konfiguračních souborech, možnost konfigurace programu bez grafického rozhraní je tak v zásadě již vyřešena. 92

107 KAPITOLA 8. DISTRIBUCE Adresářová struktura Na obrázku 8.1 je adresářová struktura aplikace. Na obrázku 8.2 je obsah kořenového adresáře. Adresářová struktura byla volena tak, aby v kořenovém adresáři bylo co nejméně souborů a složek. Uživatel se tak může snadno zorientovat a rychle nalezne spouštěcí soubor aplikace. Obrázek 8.1: Adresářová struktura aplikace Obrázek 8.2: Obsah kořenového adresáře aplikace 93

108 SPUŠTĚNÍ APLIKACE

109 KAPITOLA 9. ZÁVĚR Kapitola 9 Závěr V rámci této práce jsem vypracoval rešerši existujících řešení pro rezervaci spojů ve společnosti Student Agency, s.r.o. (kapitola 2.1) a navrhl vlastní modulární aplikaci. Při návrhu aplikace (kapitola 3) jsem věnoval velkou pozornost její snadné rozšiřitelnosti o nové zásuvné moduly. Aplikace byla navržena tak, aby se programátor nového pluginu mohl soustředit pouze na aplikační logiku svého pluginu. Integrace do zbytku aplikace proběhne automaticky. Zároveň jsem navrhl množství univerzálních tříd a metod, které mohou být užitečné při tvorbě typického pluginu. Plugin SA Notify, určený ke kontrole volných míst ve spojích Student Agency, byl oproti původnímu zadání práce rozšířen o mnoho nových funkcionalit. V současné verzi disponuje bohatými možnostmi nastavení a umožňuje automatickou rezervaci nalezených spojů. Dále byl implementován plugin pro hlídání volných míst v Žižkovském Divadle Járy Cimrmana. Při jeho vytváření byla v praxi ověřena kvalita návrhu aplikace. Díky snadné integraci nového pluginu do zbytku aplikace a připravené struktuře tříd pluginu probíhal vývoj velmi rychle. Testování použitelnosti aplikace a pluginu SA Notify pro předpokládané cílové uživatele (kap. 6.4) prokázalo použitelnost i pro méně zkušené uživatele. Zároveň byly analýzou výsledků testování stanoveny návrhy pro vylepšení aplikace, z nichž některé byly použity při vývoji pluginu Divadlo Járy Cimrmana. Vytvořil jsem také programátorskou příručku pro tvorbu nových pluginů (příloha D). Při její tvorbě jsem se snažil o co největší stručnost a přehlednost, tak aby tvůrce nového pluginu mohl již po zběžném prostudování příručky začít programovat. Na web aplikace (http://sanotify.cz) jsem pro zájemce o tvorbu nových pluginů umístil zdrojové kódy, javadoc dokumentaci, programátorskou příručku i celou tuto práci. 9.1 Přínos práce Při vývoji aplikace jsem se seznámil s množstvím nových technologií. Za velmi přínosné považuji zejména seznámení s knihovnou SWT, Java Layout Managerem MigLayout a výborným HTML parserem Jsoup. Dále jsem si lépe osvojil práci s IDE NetBeans a jeho nástroji pro správu knihoven, refaktoring projektu a snadnou internacionalizaci projektu. 95

110 9.1. PŘÍNOS PRÁCE Zajímavá byla také zkušenost s testy použitelnosti. Dosud jsem jejich význam podceňoval, ukázalo se ale, že mohou být při návrhu GUI aplikace velmi přínosné a nelze je zcela nahradit návrhem za pomoci pouze vlastní intuice. 96

111 PŘÍLOHA A. POUŽITÉ ZKRATKY A POJMY Příloha A Použité zkratky a pojmy V této příloze je výpis použitých zkratek a použitých pojmů. V případě zkratek se ve většině případů jedná o zkratky běžně používané v dané problematice. A.1 Zkratky AJAX Asynchronous JavaScript and XML CC Creative Commons CSS Cascading Style Sheets ČVUT České vysoké učení technické v Praze DPMLJ Dopravní podnik měst Liberce a Jablonce nad Nisou, a. s. GUI Graphical user interface Grafické uživatelské rozhraní. HTML Hypertext Mark-up Language JRE Java Runtime Enviroment JVM Java Virtual Machine OS Operační systém PC Personal Computer osobní počítač PHP PHP: Hypertext Preprocessor (rekurzivní zkratka) UML Unified modeling language 97

112 A.2. POJMY A.2 Pojmy API Application Programming Interface Rozhraní určené pro komunikaci dalších programů s danou aplikací. DOM Document Object Model Objektová reprezentace HTML nebo XML dokumentu, kde každý HTML tag představuje jeden objekt. IDE Integrated Development Environment Vývojové prostředí, obecně software usnadňující programování. Java SE Java Platform, Standard Edition Označení základního balíčku programovacího jazyka Java, který obsahuje virtuální stroj, API základních knihoven i knihoven pro vytváření GUI aplikací (AWT, Swing). PDF Portable Document Format Formát pro ukládání dokumentů od společnosti Adobe Systems. URL Uniform Resource Locator Řetězec znaků, sloužící k jednoznačnému určení adresy webové stránky. 98

113 PŘÍLOHA B. ADRESÁŘOVÁ STRUKTURA PŘILOŽENÉHO CD Příloha B Adresářová struktura přiloženého CD Obrázek B.1: Obsah přiloženého CD Adresář program: sanotify_v0.65 obsahuje distribuční verzi aplikace. sanotify_v0.65_src obsahuje zdrojové kódy aplikace: Adresář text: - SANotify_developers zdrojové kódy, projekt pro IDE NetBeans - SANotify_libraries použité externí knihovny budajan_thesis.pdf elektronická verze této práce ve formátu PDF. LaTeX text práce ve zdrojovém formátu LaTeX. 99

114 100

115 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU Příloha C Výsledky testování metodou kognitivního průchodu Prerekvizity pro testování jsou uvedeny v kapitole 6.4, zde uvádím pouze výsledky - tedy odpovědi na otázky, kladené u jednotlivých úkolů. C.1 Úkol 1 nastavení rodičovské aplikace C Spusťte aplikaci Obrázek C.1: Adresář se soubory aplikace Jitka Karel Je akce vidět? Ano, je vidět soubor SANotify.exe i soubor SANotify.jar. Oba soubory spustí aplikaci. Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Rozumí zpětné vazbě? Ano Ano Čas 5 s 5 s Jitka i Karel bez váhání spustili aplikaci pomocí souboru SANotify.exe. 101

116 C.1. ÚKOL 1 NASTAVENÍ RODIČOVSKÉ APLIKACE C Nastavte minimalizaci programu do oznamovací oblasti (tj. do pravého dolního rohu obrazovky) Obrázek C.2: Menu Nastavení Je akce vidět? Jitka Ne tlačítko je v menu Nastavení. Karel Zvolil správný cíl? Ano Ne Karel neznal pojem Oznamovací oblast ani nevěděl, že některé programy se mohou minimalizovat do pravého dolního rohu. Zvolil správnou akci? Ano Jitka 1 nejprve vyzkoušela program vypnout stisknutím křížku v pravém horním rohu. Je zvyklá, že některé programy se při této akci do oznamovací oblasti schovají. Když zjistila, že program se vypnul, znovu ho spustila a vzápětí nalezla správné nastavení v menu. Rozumí zpětné vazbě? Ano Ne Čas 20 s 30 s Ano Karel našel správnou položku v menu, ale nechápal, co daná položka provede za akci. Karel neměl problém s nalezením správné položky v menu. Nechápal ale, k čemu položka je s touto funkcí programů se nikdy dříve nesetkal. 102

117 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C Otevřete dialog Možnosti a nastavte přehrávání libovolného zvuku u všech vyskakovacích dialogů Obrázek C.3: Dialog Možnosti, záložka Zvuky a upozornění Jitka Karel Je akce vidět? Ne tlačítko Možnosti je v menu Nastavení. Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Rozumí zpětné vazbě? Ano Ano Čas 25 s 30 s Tento úkol nedělal Jitce ani Karlovi problémy. Oba správně našli tlačítko Možnosti v menu Nastavení a v dialogu ihned objevili záložku Zvuky a upozornění. 103

118 C.1. ÚKOL 1 NASTAVENÍ RODIČOVSKÉ APLIKACE C Zkontrolujte, zda je k dispozici novější verze programu Obrázek C.4: Menu Nápověda Je akce vidět? Jitka Ne tlačítko je v menu Nápověda. Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Jitka 2 dlouho nemohla položku Zkontrolovat aktualizace nalézt, nakonec ale uspěla. Rozumí zpětné vazbě? Ano Ano Čas 20 s 40 s Karel Ano Karel 2 přehlédl v menu Nápověda položku Zkontrolovat aktualizace a místo toho zvolil možnost O programu a následně kliknul na domovskou stránku programu, podle které zjistil, že používá aktuální verzi. Karel není zvyklý ručně kontrolovat dostupnost aktualizací programů, proto nevěděl, kde položku hledat. Nakonec ale uspěl. 104

119 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C Otevřete dialog Možnosti a zkontrolujte, zda je vypnuto přehrávání všech zvuků v Tichém režimu Obrázek C.5: Menu Možnosti, záložka Zvuky a upozornění Je akce vidět? Jitka Karel Ano po otevření dialogu Možnosti jsou další kroky vidět. Zvolil správný cíl? Ano Ne Karel ze zadání úkolu nepochopil, že lze měnit nastavení vlastností Tichého režimu. Zvolil správnou akci? Ano Ne Karel pouze zapnul Tichý režim v menu Nastavení. Až po upřesnění zadání našel nastavení Tichého režimu. Rozumí zpětné vazbě? Ano Ano Čas 15 s 50 s 105

120 C.1. ÚKOL 1 NASTAVENÍ RODIČOVSKÉ APLIKACE C Zapněte Tichý režim Obrázek C.6: Vlevo vypnutý Tichý režim, vpravo zapnutý Tichý režim Je akce vidět? Jitka Ne tlačítko je v menu Nastavení. Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Rozumí zpětné vazbě? Ano Jitka 2 nemohla tlačítko dlouho najít, hledala ho v dialogu Možnosti. Čas 20 s 30 s Karel Ano Karel hledal možnost zapnutí Tichého režimu v dialogu Možnosti, který zůstal otevřený z předchozího úkolu. Následně se vrátil ke tlačítku v menu Nastavení. Karel 2 byl zmatený dvěma různými stavy tlačítka, nebyl si jistý, který stav znamená zapnutý Tichý režim, a který vypnutý (viz obr. C.6). Téměř všichni uživatelé hledali možnost zapnutí Tichého režimu nejprve v dialogu Možnosti. 106

121 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C.2 Úkol 2 práce s pluginem SA Notify C Přepněte na plugin SA Notify Obrázek C.7: Vybraný plugin Divadlo Járy Cimrmana Jitka Je akce vidět? Ano Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Rozumí zpětné vazbě? Ano Ano Čas 3 s 5 s Karel Před začátkem testování byl záměrně vybrán plugin Divadlo Járy Cimrmana (který v době testování neměl implementované GUI). Všichni uživatelé ale ihned správně přepnuli na plugin SA Notify. 107

122 C.2. ÚKOL 2 PRÁCE S PLUGINEM SA NOTIFY C Zahajte hledání volných míst v libovolném spoji na trase Praha Brno Obrázek C.8: Plugin SA Notify Je akce vidět? Jitka Karel Ano všechna potřebná nastavení jsou vidět. Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Karel měl problémy s nalezením tlačítka Přidat spoj. Karel 3 se opakovaně pokoušel přidat spoj dvojím kliknutím na vybraný spoj v tabulce Spoje. Rozumí zpětné vazbě? Ano Ano Čas 20 s 30 s S vybráním požadovaného spoje neměli Jitka ani Karel problémy. Karel nemohl nalézt tlačítko Přidat spoj. Karel 2 také nechápal význam symbolů znázorňujících typ spoje (konkrétně ikony značící autobus Fun & Relax). Nenapadlo ho vyzkoušet zobrazení tooltipu najetím myši nad ikonu nebo na záhlaví sloupce. Karla 1 zaujal červený křížek u tlačítka pro vypnutí/zapnutí automatické rezervace v posledním sloupci tabulky hledání (viz např. obr. 5.9). Po kliknutí na tlačítko se zobrazilo upozornění Prosím vyplňte údaje pro automatickou rezervaci v nastavení pluginu. Karel 1 ale dialog bez přečtení ihned zavřel a spokojil se se závěrem, že funkci tlačítka nezná a je lepší na něj neklikat. 108

123 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C V nastavení pluginu vypněte zobrazování starých hledání Obrázek C.9: Dialog Nastavení pluginu SA Notify, záložka Obecná nastavení Jitka Karel Je akce vidět? Ano tlačítko Nastavení je v menu pluginu (obr. C.8). Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Ano Rozumí zpětné vazbě? Ano Ano Čas 20 s 15 s Všichni uživatelé bez problémů nalezli tlačítko Nastavení a následně i položku Zobrazovat stará hledání na záložce Obecná nastavení. 109

124 C.2. ÚKOL 2 PRÁCE S PLUGINEM SA NOTIFY C V nastavení pluginu nastavte preferovaná sedadla V uličce Obrázek C.10: Dialog Nastavení pluginu SA Notify, záložka Výchozí hledání Je akce vidět? Jitka Ano Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Jitka 1 nejprve hledala v dialogu Možnosti. Když položku nenalezla, napadlo jí vrátit se k dialogu Nastavení pluginu SA Notify. Ano Rozumí zpětné vazbě? Ano Ano Čas 25 s 20 s Karel Všichni uživatelé po chvíli nalezli rozbalovací seznam s výběrem preferovaných míst. Nikdo se ale nenamáhal se čtením textu pod seznamem, popisujícího funkci preferovaných míst. 110

125 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C V nastavení pluginu nastavte automatickou rezervaci. Použijte libovolné přihlašovací údaje. Obrázek C.11: Dialog Nastavení pluginu SA Notify, záložka Automatická rezervace Je akce vidět? Jitka Ano Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Jitka ihned nalezla nastavení automatické rezervace a vyplnila údaje pro přihlášení náhodnými znaky. Rozumí zpětné vazbě? Ano Ano Čas 15 s 30 s Karel Ano Karel 2 jako jediný použil tlačítko Otestovat připojení. 111

126 C.2. ÚKOL 2 PRÁCE S PLUGINEM SA NOTIFY C Zahajte vyhledávání volných míst v libovolném spoji na trase Brno Praha Obrázek C.12: Nepodařilo se rezervovat preferované sedadlo Jitka Karel Je akce vidět? Ano Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Jitka použila tlačítko pro prohození výchozí a cílové stanice. Rozumí zpětné vazbě? Ano Ano Čas 10 s 20 s Ano Karel 1 si dlouho nemohl vzpomenout, že spoj přidával do vyhledávání tlačítkem Přidat spoj. Tento úkol byl podobný úkolu C.2.2, Jitka ani Karel proto neměli problém s jeho splněním. Plugin vzápětí nalezl volné místo a zobrazil dialog z obr. C.12. Karel 1 bez čtení dialogu zvolil možnost Přejít k rezervaci a následně byl zmaten otevřením webového prohlížeče. 112

127 PŘÍLOHA C. VÝSLEDKY TESTOVÁNÍ METODOU KOGNITIVNÍHO PRŮCHODU C Zobrazte historii hledaných spojů Obrázek C.13: Menu pluginu s tlačítkem Historie Je akce vidět? Jitka Karel Ano tlačítko Historie je v menu pluginu (obr. C.13). Zvolil správný cíl? Ano Ano Zvolil správnou akci? Ano Jitka 2 nejprve v nastavení pluginu opět zapnula zobrazování starých hledání, které vypnula v rámci úkolu C.2.3. Když se stará hledání v tabulce nezobrazila, zvolila správně tlačítko Historie. Ano Rozumí zpětné vazbě? Ano Ano Čas 15 s 5 s 113

128 114 C.2. ÚKOL 2 PRÁCE S PLUGINEM SA NOTIFY

129 PŘÍLOHA D. PROGRAMÁTORSKÁ PŘÍRUČKA Příloha D Programátorská příručka D.1 Úvod D.1.1 Technologie Program je psaný v jazyce Java 1.7. GUI je vytvářeno pomocí knihovny SWT. (http://eclipse.org/swt/) Pro layout GUI byl použit MigLayout (http://www.miglayout.com/). Celé tělo pluginu je ale vykreslováno na SWT widget Composite, kterému lze nastavit libovolný vnitřní layout manager. Není tedy nutné omezovat se na MigLayout (nicméně ho vřele doporučuji). Jsoup (http://jsoup.org/) je skvělý HTML parser, který byl použit u pluginu SA Notify a je tedy již součásti aplikace. Jeho využití taktéž doporučuji, umožňuje velmi jednoduché extrahování informací z HTML stránky, ale i posílání HTML requestů včetně cookies. D.1.2 Knihovny Zde je seznam knihoven, které program používá (a které je tedy nutné přidat do projektu, aby ho bylo možné zkompilovat). Knihovny jsou přibaleny ke zdrojovým kódům. SWT je potřeba správná verze podle platformy! Viz eclipse.org/swt/. MigLayout JShortcut_my upravená verze JShortcut (https://github.com/jimmc/jshortcut), která načte správnou verzi jshortcut.dll z adresáře lib/. Jsoup Apache.commons.lang.StringEscapeUtils Apache.commons.codec.binary 115

130 D.1. ÚVOD A dále tyto knihovny z IDE Eclipse (v případě importu projektu do Eclipse je tedy není nutné manuálně přidávat ): org.eclipse.ui.forms org.eclipse.core.databinding org.eclipse.core.databinding.beans org.eclipse.core.databinding.observable org.eclipse.core.databinding.property org.eclipse.core.equinox.common org.eclipse.core.runtime org.eclipse.core.runtime.compatibility org.eclipse.jface.databinding org.eclipse.jface.util pouze třída Geometry.class, D.1.3 Pojmy plugin menu záložka pluginu na horní liště, na které lze přepínat mezi pluginy. plugin active-menu menu aktivní pluginu, může obsahovat tlačítka (viz obr. D.1). Tvoří ho programátor pluginu. plugin idle-menu menu neaktivního pluginu, je vytvořeno automaticky. tělo pluginu samotný plugin, tedy to, co se zobrazí v hlavním okně při kliknutí na plugin menu. pluginbody SWT Composite pluginbody je fieldem třídy Plugin.java. Na tomto Compositu je celé tělo pluginu. Obrázek D.1: Vlevo active-menu pluginu SA Notify, vpravo idle-menu pluginu Divadlo J.C. 116

Programátorská příručka

Programátorská příručka KAPITOLA 1. PROGRAMÁTORSKÁ PŘÍRUČKA Kapitola 1 Programátorská příručka 1.1 Úvod 1.1.1 Technologie Program je psaný v jazyce Java 1.7. GUI je vytvářeno pomocí knihovny SWT. (http://eclipse.org/swt/) Pro

Více

1 Tabulky Příklad 3 Access 2010

1 Tabulky Příklad 3 Access 2010 TÉMA: Vytvoření tabulky v návrhovém zobrazení Pro společnost Naše zahrada je třeba vytvořit databázi pro evidenci objednávek o konkrétní struktuře tabulek. Do databáze je potřeba ještě přidat tabulku Platby,

Více

Téma 1: Práce s Desktop. Téma 1: Práce s Desktop

Téma 1: Práce s Desktop. Téma 1: Práce s Desktop Téma 1: Práce s Desktop 1 Teoretické znalosti V této kapitole zjistíte, co skrývají pojmy jako Desktop, GNOME, KDE, Metacity Window Manager, Nautilus a Konqueror. Desktop neboli pracovní plocha patří mezi

Více

Příručka pro aplikaci KSnapshot

Příručka pro aplikaci KSnapshot Richard J. Moore Robert L. McCormick Brad Hards Kontrolor: Lauri Watts Vývojář: Richard J Moore Vývojář: Matthias Ettrich Překlad: Lukáš Vlček 2 Obsah 1 Úvod 5 2 Použití KSnapshot 6 2.1 Spuštění KSnapshot.....................................

Více

Téma 8: Konfigurace počítačů se systémem Windows 7 IV

Téma 8: Konfigurace počítačů se systémem Windows 7 IV Téma 8: Konfigurace počítačů se systémem Windows 7 IV 1 Teoretické znalosti V tomto cvičení budete pracovat se správou vlastností systému, postupně projdete všechny karty tohoto nastavení a vyzkoušíte

Více

Newsletter RIBTEC automatické aktualizace Praktická novinka v servisu a podpoře k softwaru RIBTEC od verzí 15.0

Newsletter RIBTEC automatické aktualizace Praktická novinka v servisu a podpoře k softwaru RIBTEC od verzí 15.0 1.1 Automatické aktualizace RIBTEC Pomocí nového Prostředí automatických aktualizací můžete udržovat Váš software stavební statiky RIBTEC od verzí 15.0 a vyšších na aktuálním stavu. Tento systémový nástroj

Více

Návod pro použití Plug-in SMS Operátor

Návod pro použití Plug-in SMS Operátor Verze: 1.06 Strana: 1 / 17 Návod pro použití Plug-in SMS Operátor 1. Co to je Plug-in modul SMS Operátor? Plug-in modul (zásuvkový modul) do aplikace MS Outlook slouží k rozšíření možností aplikace MS

Více

MATURITNÍ PRÁCE dokumentace

MATURITNÍ PRÁCE dokumentace MATURITNÍ PRÁCE dokumentace Jídelníček SŠIEŘ pro Android Martin Bartoň školní rok: 2012/2013 obor: třída: Počítačové systémy PS4.A ABSTRAKT Práce je zaměřená na problematiku tvorby Android aplikací,

Více

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý Uživatelský manuál Aplikace GraphViewer Vytvořil: Viktor Dlouhý Obsah 1. Obecně... 3 2. Co aplikace umí... 3 3. Struktura aplikace... 4 4. Mobilní verze aplikace... 5 5. Vytvoření projektu... 6 6. Části

Více

OBJEDNÁVACÍ A INFORMAČNÍ SYSTÉMY

OBJEDNÁVACÍ A INFORMAČNÍ SYSTÉMY OBJEDNÁVACÍ A INFORMAČNÍ SYSTÉMY STAkis-W STAkis-S Již dnes k dispozici všem zákazníkům společnosti Stahlgruber bez výjimky! www.stahlgruber.cz STAkis-W OBJEDNÁVACÍ SYSTÉM BEZ NUTNOSTI INSTALACE Jako výchozí

Více

1. Začínáme s FrontPage 2003 11

1. Začínáme s FrontPage 2003 11 Úvod 9 1. Začínáme s FrontPage 2003 11 Instalace programu 12 Spuštění a ukončení programu 15 Základní ovládání 16 Hledání souborů 30 Najít a nahradit 31 Tisk 32 Schránka sady Office 34 Nápověda 36 Varianty

Více

Webová aplikace Znalostní testy online UŽIVATELSKÁ PŘÍRUČKA

Webová aplikace Znalostní testy online UŽIVATELSKÁ PŘÍRUČKA Webová aplikace Znalostní testy online UŽIVATELSKÁ PŘÍRUČKA 2005 Lukáš Trombik OBSAH ÚVOD... 1 SPUŠTĚNÍ... 1 POPIS OVLÁDÁNÍ INFORMAČNÍHO SYSTÉMU... 1 POPIS KLIENTSKÉ ČÁSTI... 1 POPIS ADMINISTRÁTORSKÉ ČÁSTI...

Více

Prozkoumání příkazů na pásu karet Každá karta na pásu karet obsahuje skupiny a každá skupina obsahuje sadu souvisejících příkazů.

Prozkoumání příkazů na pásu karet Každá karta na pásu karet obsahuje skupiny a každá skupina obsahuje sadu souvisejících příkazů. Úvodní příručka Microsoft Excel 2013 vypadá jinak než ve starších verzích, proto jsme vytvořili tuto příručku, která vám pomůže se s ním rychle seznámit. Přidání příkazů na panel nástrojů Rychlý přístup

Více

Postup přechodu na podporované prostředí. Přechod aplikace BankKlient na nový operační systém formou reinstalace ze zálohy

Postup přechodu na podporované prostředí. Přechod aplikace BankKlient na nový operační systém formou reinstalace ze zálohy Postup přechodu na podporované prostředí Přechod aplikace BankKlient na nový operační systém formou reinstalace ze zálohy Obsah Zálohování BankKlienta... 3 Přihlášení do BankKlienta... 3 Kontrola verze

Více

WNC::WebNucleatCreator

WNC::WebNucleatCreator Tomáš Dlouhý WNC::WebNucleatCreator Verze: 5.1 1 Obsah Obsah...2 Úvod...3 Novinky...3 Požadavky...4 Instalace...4 Přihlášení se do WNC...6 Moduly...7 Modul Blog...7 Modul Categories...8 Modul News...8

Více

Instalace programu ProVIS

Instalace programu ProVIS Instalace programu ProVIS Tento program umožňuje instalovat program ProVIS. Umožňuje vybrat, kam se bude instalovat, a jednotlivé součásti instalace. Instalace probíhá v několika krocích. Každý krok má

Více

Redakční systém Joomla. Prokop Zelený

Redakční systém Joomla. Prokop Zelený Redakční systém Joomla Prokop Zelený 1 Co jsou to red. systémy? Redakční systémy (anglicky Content Management System - CMS) jsou webové aplikace používané pro snadnou správu obsahu stránek. Hlavním cílem

Více

Modul Outlook2Money. www.money.cz

Modul Outlook2Money. www.money.cz Modul Outlook2Money www.money.cz 2 Money S5 Outlook2Money Základní popis modulu Modul O2M (Outlook2Money) umožňuje uživatelům evidovat v Money e-mailovou komunikaci vedenou v MS Outlook 2010 ve formě přijatých

Více

Vstupní požadavky, doporučení a metodické pokyny

Vstupní požadavky, doporučení a metodické pokyny Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem

Více

Průvodce instalací modulu Offline VetShop verze 3.4

Průvodce instalací modulu Offline VetShop verze 3.4 Průvodce instalací modulu Offline VetShop verze 3.4 Úvod k instalaci Tato instalační příručka je určena uživatelům objednávkového modulu Offline VetShop verze 3.4. Obsah 1. Instalace modulu Offline VetShop...

Více

http://www.zlinskedumy.cz

http://www.zlinskedumy.cz Číslo projektu Číslo a název šablony klíčové aktivity Tematická oblast Autor Ročník 1 Obor CZ.1.07/1.5.00/34.0514 III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Operační systém a textový editor,

Více

Windows 10 (5. třída)

Windows 10 (5. třída) Windows 10 (5. třída) Pracovní plocha: takto vypadá Pracovní plocha u nás ve škole - pozadí Pracovní plochy - ikony na Pracovní ploše ikona Student 17 (se jménem přihlášeného uživatele) ikona Tento počítač

Více

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná. Průběžná klasifikace Nová verze modulu Klasifikace žáků přináší novinky především v práci s průběžnou klasifikací. Pro zadání průběžné klasifikace ve třídě doposud existovaly 3 funkce Průběžná klasifikace,

Více

Individuální nastavení počítače

Individuální nastavení počítače Individuální nastavení počítače Je pro vás systém Windows 7 nový? I když má tento systém mnoho společného s verzí systému Windows, kterou jste používali dříve, můžete potřebovat pomoc, než se v něm zorientujete.

Více

Operační systém MS Windows XP Professional

Operační systém MS Windows XP Professional Operační systém MS Windows XP Professional Operační systém základní programové vybavení počítače zprostředkovává komunikaci uživatele s počítačem s technickým vybavením počítače s aplikačním programovým

Více

Kapitola 1 První kroky v tvorbě miniaplikací 11

Kapitola 1 První kroky v tvorbě miniaplikací 11 Obsah Úvodem 9 Komu je kniha určena 9 Kapitola 1 První kroky v tvorbě miniaplikací 11 Co je to Postranní panel systému Windows a jak funguje 12 Co je potřeba vědět před programováním miniaplikací 16 Vaše

Více

Windows 8.1 (5. třída)

Windows 8.1 (5. třída) Windows 8.1 (5. třída) Pracovní plocha: takto vypadá Pracovní plocha u nás ve škole - pozadí Pracovní plochy - ikony na pracovní ploše - Hlavní panel - ikony na Hlavním panelu (zvýrazněná ikona spuštěné

Více

Uživatelská dokumentace

Uživatelská dokumentace Uživatelská dokumentace Verze 14-06 2010 Stahování DTMM (v rámci služby Geodata Distribution) OBSAH OBSAH...2 1. O MAPOVÉM SERVERU...3 2. NASTAVENÍ PROSTŘEDÍ...3 2.1 Hardwarové požadavky...3 2.2 Softwarové

Více

Doporučené nastavení prohlížeče MS Internet Explorer 7 a vyšší pro Max Homebanking PS s využitím čipové karty

Doporučené nastavení prohlížeče MS Internet Explorer 7 a vyšší pro Max Homebanking PS s využitím čipové karty Doporučené nastavení prohlížeče MS Internet Explorer 7 a vyšší pro Max Homebanking PS s využitím čipové karty Obsah 1. Instalace SecureStore... 2 2. Nastavení Internet Exploreru... 3 3. První přihlášení...

Více

Instalace aplikace 602XML Filler

Instalace aplikace 602XML Filler Instalace aplikace 602XML Filler Popis aplikace 602XML Filler 602XML Filler je aplikace pro vyplňování formulářů. Jedná se o volně šiřitelný a v České republice již všeobecně rozšířený nástroj se snadným

Více

Pracovní prostředí Word 2003 versus Word 2010

Pracovní prostředí Word 2003 versus Word 2010 Zdokonalování gramotnosti v oblasti ICT Pracovní prostředí Word 2003 versus Word 2010 Inovace a modernizace studijních oborů FSpS Vránová Hana 11.7.2012 OBSAH Srovnání pracovního prostředí Word 2003 a

Více

Začínáme pracovat s tabulkovým procesorem MS Excel

Začínáme pracovat s tabulkovým procesorem MS Excel Začínáme pracovat s tabulkovým procesorem MS Excel Nejtypičtějším představitelem tabulkových procesorů je MS Excel. Je to pokročilý nástroj pro tvorbu jednoduchých i složitých výpočtů a grafů. Program

Více

Průvodce aplikací. Aplikaci easyeldp spusťte z nabídky Start pomocí ikony KomixFiller, kterou naleznete ve složce Komix.

Průvodce aplikací. Aplikaci easyeldp spusťte z nabídky Start pomocí ikony KomixFiller, kterou naleznete ve složce Komix. Instalace aplikace easyeldp Aplikaci easyeldp je třeba instalovat na počítač, který splňuje příslušné systémové požadavky. Při instalaci postupujte následovně: 1) Spusťte instalaci aplikace easyeldp z

Více

Programovací software ConfigTool. Základní obsluha a postup připojení k zařízení přes USB a GPRS. Verze 2.00

Programovací software ConfigTool. Základní obsluha a postup připojení k zařízení přes USB a GPRS. Verze 2.00 Programovací software ConfigTool Základní obsluha a postup připojení k zařízení přes USB a GPRS Verze 2.00 Vážený zákazníku. Tento stručný uživatelský manuál Vás přehlednou a jednoduchou formou seznámí

Více

plussystem Příručka k instalaci systému

plussystem Příručka k instalaci systému plussystem Příručka k instalaci systému Tato příručka je určena zejména prodejcům systému a případně koncovým uživatelům. Poskytuje návod, jak provést potřebná nastavení komponent. ITFutuRe s.r.o. 26.2.2015

Více

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu StatSoft Typy souborů ve STATISTICA Tento článek poslouží jako přehled hlavních typů souborů v programu STATISTICA, ukáže Vám jejich možnosti a tím Vám dovolí využívat program efektivněji. Jistě jste již

Více

Instalace a první spuštění Programu Job Abacus Pro

Instalace a první spuštění Programu Job Abacus Pro Instalace a první spuštění Programu Job Abacus Pro Pro chod programu je nutné mít nainstalované databázové úložiště, které je připraveno v instalačním balíčku GAMP, který si stáhnete z našich webových

Více

Univerzální rezervační systém. Uživatelská příručka

Univerzální rezervační systém. Uživatelská příručka Univerzální rezervační systém Uživatelská příručka Obsah I. Instalace... 3 II. První spuštění aplikace... 4 III. Hlavní okno aplikace... 5 IV. Nastavení aplikace... 6 1. Přidání místností... 6 2. Uživatelské

Více

SMTPServer - Příručka

SMTPServer - Příručka Obsah Požadavky na systém... 2 Použití... 2 Proč vlastní SMTPServer... 2 Koncepce tohoto SMTPServeru... 2 Instalace SMTPServeru... 2 Odinstalování SMTPServeru... 6 Jak tento SMTPServer pracuje... 7 Stavy

Více

HP-2000E UŽIVATELSKÝ MANUÁL

HP-2000E UŽIVATELSKÝ MANUÁL HP-2000E UŽIVATELSKÝ MANUÁL Strana 1 / 7 Úvod AirLive konfigurační utilita pro OS Windows umožňuje uživatelům identifikovat HomePlug zařízení (HP1000E Sérii & HP2000E Sérii) v elektrické síti. Dále zobrazuje

Více

Návod na instalaci a použití programu

Návod na instalaci a použití programu Návod na instalaci a použití programu Minimální konfigurace: Pro zajištění funkčnosti a správné činnosti SW E-mentor je potřeba software požívat na PC s následujícími minimálními parametry: procesor Core

Více

Angličtina program k procvičování slovní zásoby

Angličtina program k procvičování slovní zásoby Středoškolská technika 2011 Setkání a prezentace prací středoškolských studentů na ČVUT Angličtina program k procvičování slovní zásoby Kamil Hanus Střední průmyslová škola elektrotechniky a informačních

Více

Web. Získání informace z internetu Grafické zobrazení dat a jejich struktura Rozšíření funkcí pomocí serveru Rozšíření funkcí pomocí prohlížeče

Web. Získání informace z internetu Grafické zobrazení dat a jejich struktura Rozšíření funkcí pomocí serveru Rozšíření funkcí pomocí prohlížeče Web Získání informace z internetu Grafické zobrazení dat a jejich struktura Rozšíření funkcí pomocí serveru Rozšíření funkcí pomocí prohlížeče Technologické trendy v AV tvorbě, Web 2 DNS Domain Name Systém

Více

Uživatelská příručka pro práci s Portálem VZP. Test kompatibility nastavení prohlížeče

Uživatelská příručka pro práci s Portálem VZP. Test kompatibility nastavení prohlížeče Uživatelská příručka pro práci s Portálem VZP Test kompatibility nastavení prohlížeče Obsah 1. Podporované operační systémy a prohlížeče... 3 1.1 Seznam podporovaných operačních systémů... 3 1.2 Seznam

Více

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. 2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. GEOVAP, spol. s r. o. Čechovo nábřeží 1790 530 03 Pardubice Česká republika +420 466 024 618 http://www.geovap.cz V dokumentu použité názvy programových

Více

Nástrojová lišta v editačním poli

Nástrojová lišta v editačním poli Nástrojová lišta v editačním poli Název projektu PŘEJÍT NA konkrétní sekci webu ZOBRAZIT zobrazí a) pracovní verzi webu (tj. nepublikovanou) b) publikovanou verzi webu a) Odstranit odstraní zobrazenou

Více

Reliance 3 design OBSAH

Reliance 3 design OBSAH Reliance 3 design Obsah OBSAH 1. První kroky... 3 1.1 Úvod... 3 1.2 Založení nového projektu... 4 1.3 Tvorba projektu... 6 1.3.1 Správce stanic definice stanic, proměnných, stavových hlášení a komunikačních

Více

MHD v mobilu. Instalace a spuštění. Co to umí

MHD v mobilu. Instalace a spuštění. Co to umí MHD v mobilu Aplikace MHD v mobilu umí zobrazovat offline (bez nutnosti připojení) jízdní řády MHD na obrazovce mobilního telefonu. Aplikaci pro konkrétní město je možné stáhnout z našich stránek zdarma.

Více

Provoz DOS verzí programů VIS pod Windows 7

Provoz DOS verzí programů VIS pod Windows 7 Provoz DOS verzí programů VIS pod Windows 7 Pozor! Firma VIS nemůže zaručit spolehlivý provoz všech funkcí starých programů v DOSu v prostředí operačního systému Windows 7 a proto servisní středisko pro

Více

D2 - GUI design. Radek Mečiar 28.3.2014

D2 - GUI design. Radek Mečiar 28.3.2014 D2 - GUI design Radek Mečiar 28.3.2014 1 Úvod Zvolená platforma: Android Verze: 4.x Nástroj pro kreslení: Pencil Platformu a verzi jsem zvolil, protože je v současnosti nejpoužívanější. Informace o standardu

Více

Návod k obsluze IP kamery Zoneway. IP kamery jsou určené pro odbornou montáž.

Návod k obsluze IP kamery Zoneway. IP kamery jsou určené pro odbornou montáž. Návod k obsluze IP kamery Zoneway. IP kamery jsou určené pro odbornou montáž. Obsah 1 Úvod... 1 2 Návod pro připojení do webového rozhraní... 1 2.1 Připojení kamery k WiFi síti... 4 2.2 Postup nastavení

Více

NOVÉ GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ (GUI)

NOVÉ GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ (GUI) NOVÉ GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ (GUI) UŽIVATELSKÁ PŘÍRUČKA TYP DOKUMENTU: NÁVOD VYHOTOVIL: PETR VONDRÁČEK DATUM VYHOTOVENÍ: 29.3.2012 PLATNOST OD: 29.3.2012 CÍLOVÁ SKUPINA: UŽIVATELÉ B2B PORTÁLU GROW

Více

APS Administrator.OP

APS Administrator.OP APS Administrator.OP Rozšiřující webový modul pro APS Administrator Přehled přítomnosti osob v oblastech a místnostech Instalační a uživatelská příručka 2004 2013,TECH FASS s.r.o., Věštínská 1611/19, Praha,

Více

Možnosti programu. KAPITOLA 5 Možnosti

Možnosti programu. KAPITOLA 5 Možnosti KAPITOLA 5 Možnosti Nastavení v možnostech programu a uživatelského rozhraní určují, jak se ZoomText spouští, ukončuje a indikuje na ploše systému. Můžete si také aktivovat automatickou aktualizaci, kdy

Více

Na vod k nastavenı e-mailu

Na vod k nastavenı e-mailu Na vod k nastavenı e-mailu 1. Návod k nastavení e-mailových schránek na serveru stribrny.net. Do e-mailových schránek lze přistupovat přes webové rozhraní Webmail nebo přes poštovního klienta. Návod popisuje

Více

T-Cloud Zakázka. Uživatelská příručka

T-Cloud Zakázka. Uživatelská příručka Uživatelská příručka Popis služby Služba T-Cloud ZAKÁZKA (dále jen ZAKÁZKA) poskytuje svým uživatelům informace o 99% veřejných zakázek vypsaných v České republice. Služba nabízí uživatelům následující

Více

Návrh uživatelských rozhraní NOV-WEB. Jakub Bartoš, Pavel Dvořák, Jakub Motyčka, Kamil Procházka

Návrh uživatelských rozhraní NOV-WEB. Jakub Bartoš, Pavel Dvořák, Jakub Motyčka, Kamil Procházka Návrh uživatelských rozhraní D3 NOV-WEB Web pro stránky předmětů Jakub Bartoš, Pavel Dvořák, Jakub Motyčka, Kamil Procházka Prototyp - Prototyp je vytvořen formou webové stránky. Výchozí stránka prototypu

Více

Instalace produktu Ontopia. ver. 5.0.2 (open-source verze)

Instalace produktu Ontopia. ver. 5.0.2 (open-source verze) Instalace produktu Ontopia ver. 5.0.2 (open-source verze) Martina Husáková 1.2.2010 PÁR SLOV ÚVODEM Produkt společnosti Bouvet Ontopia (dříve Ontopia Knowledge Suite OKS) je jedním z nejpoužívanějších

Více

Šachmatky Resortní část

Šachmatky Resortní část Instalační manuál Šachmatky Resortní část název dokumentu: autor: DATA SOLUTIONS s.r.o. verze: 1.0 datum: 11.05.11 stádium: důvěrnost: Finální verze Určeno správcům sítě název souboru: SM_Instalacni Manual_Resort_110511.doc

Více

Pravidla a plánování

Pravidla a plánování Administrátorský manuál TTC TELEKOMUNIKACE, s.r.o. Třebohostická 987/5 100 00 Praha 10 tel.: 234 052 111 fax.: 234 052 999 e-mail: ttc@ttc.cz http://www.ttc-telekomunikace.cz Datum vydání: 7. května 2013

Více

VYTVOŘENÍ / EDITACE RDP SOUBORU

VYTVOŘENÍ / EDITACE RDP SOUBORU VYTVOŘENÍ / EDITACE RDP SOUBORU Windows Server 2008 Windows Server 2012 ipodnik cloud ipodnik pro Vás provozuje: BIZ-ONE EU s.r.o. Jiráskova 306 252 25 Jinočany, Praha Západ Web: www.ipodnik.cz Tel.: 605

Více

Návod pro práci s aplikací

Návod pro práci s aplikací Návod pro práci s aplikací NASTAVENÍ FAKTURACÍ...1 NASTAVENÍ FAKTURAČNÍCH ÚDA JŮ...1 Texty - doklady...1 Fakturační řady Ostatní volby...1 Logo Razítko dokladu...2 NASTAVENÍ DALŠÍCH ÚDA JŮ (SEZNAMŮ HODNOT)...2

Více

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML ROZHRANÍ ESA XML Ing. Richard Vondráček SCIA CZ, s. r. o., Thákurova 3, 160 00 Praha 6 www.scia.cz 1 OTEVŘENÝ FORMÁT Jednou z mnoha užitečných vlastností programu ESA PT je podpora otevřeného rozhraní

Více

1. Úvod. 2. CryptoPlus jak začít. 2.1 HW a SW předpoklady. 2.2 Licenční ujednání a omezení. 2.3 Jazyková podpora. Požadavky na HW.

1. Úvod. 2. CryptoPlus jak začít. 2.1 HW a SW předpoklady. 2.2 Licenční ujednání a omezení. 2.3 Jazyková podpora. Požadavky na HW. CryptoPlus KB verze 2.1.2 UŽIVATELSKÁ PŘÍRUČKA říjen 2013 Obsah Obsah 2 1. Úvod 3 2. CryptoPlus jak začít... 3 2.1 HW a SW předpoklady... 3 2.2 Licenční ujednání a omezení... 3 2.3 Jazyková podpora...

Více

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

Instalační příručka Command WorkStation 5.6 se sadou Fiery Extended Applications 4.2

Instalační příručka Command WorkStation 5.6 se sadou Fiery Extended Applications 4.2 Instalační příručka Command WorkStation 5.6 se sadou Fiery Extended Applications 4.2 Sada Fiery Extended Applications Package (FEA) v4.2 obsahuje aplikace Fiery pro provádění úloh souvisejících se serverem

Více

Dokumentace k produktu IceWarp Notifikační nástroj

Dokumentace k produktu IceWarp Notifikační nástroj Dokumentace k produktu IceWarp Notifikační nástroj Notifikační nástroj umožňuje propojit pracovní stanicí s aplikací IceWarp Web klient. Kromě funkcí pro upozorňování na nové události je pomocí ní možné

Více

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání Čtvrtek 3. listopadu Makra v Excelu Obecná definice makra: Podle definice je makro strukturovanou definicí jedné nebo několika akcí, které chceme, aby MS Excel vykonal jako odezvu na nějakou námi definovanou

Více

Doporučené nastavení prohlížeče Mozilla Firefox 3.6 pro Max Homebanking PS s využitím čipové karty

Doporučené nastavení prohlížeče Mozilla Firefox 3.6 pro Max Homebanking PS s využitím čipové karty Doporučené nastavení prohlížeče Mozilla Firefox 3.6 pro Max Homebanking PS s využitím čipové karty Obsah 1. Instalace SecureStore... 2 2. Nastavení Firefoxu... 3 3. První přihlášení... 4 4. Odstraňování

Více

Uživatelský manuál aplikace. Dental MAXweb

Uživatelský manuál aplikace. Dental MAXweb Uživatelský manuál aplikace Dental MAXweb Obsah Obsah... 2 1. Základní operace... 3 1.1. Přihlášení do aplikace... 3 1.2. Odhlášení z aplikace... 3 1.3. Náhled aplikace v jiné úrovni... 3 1.4. Změna barevné

Více

INISOFT UPDATE - SLUŽBA AUTOMATICKÝCH AKTUALIZACÍ Uživatelská příručka

INISOFT UPDATE - SLUŽBA AUTOMATICKÝCH AKTUALIZACÍ Uživatelská příručka INISOFT UPDATE - SLUŽBA AUTOMATICKÝCH AKTUALIZACÍ Uživatelská příručka Popis funkce Softwarový nástroj INISOFT Update je univerzálním nástrojem pro stahování, údržbu a distribuci programových aktualizací

Více

Možnosti využití dat RÚIAN poskytovaných VDP pomocí webových služeb

Možnosti využití dat RÚIAN poskytovaných VDP pomocí webových služeb Možnosti využití dat RÚIAN poskytovaných VDP pomocí webových služeb Ing. Radek Augustýn Výzkumný ústav geodetický, topografický a kartografický, v.v.i. Zdiby Abstrakt V návaznosti na zpřístupnění dat Registru

Více

AIDA64 Extreme. Příručka k nastavení. v 1.1 30. 07. 2014.

AIDA64 Extreme. Příručka k nastavení. v 1.1 30. 07. 2014. Příručka k nastavení v 1.1 30. 07. 2014. je vyvíjen společností FinalWire s.r.o. Copyright 1995-2014 FinalWire s.r.o. Tento dokument byl vytvořen společností ABSEIRA s.r.o. Všechna práva vyhrazena. Copyright

Více

Manuál k programu KaraokeEditor

Manuál k programu KaraokeEditor Manuál k programu KaraokeEditor Co je KaraokeEditor? Program slouží pro editaci tagů v hudebních souborech formátu mp3. Tagy jsou doprovodné informace o písni, uložené přímo v mp3. Aplikace umí pracovat

Více

Registr práv a povinností

Registr práv a povinností Registr práv a povinností Doporučené postupy a nastavení internetového prohlížeče pro práci v aplikaci AIS RPP Doporučené postupy a nastavení internetového prohlížeče pro práci v aplikaci AIS RPP v4.0

Více

Migrace na aplikaci Outlook 2010

Migrace na aplikaci Outlook 2010 V tomto průvodci Microsoft Aplikace Microsoft Outlook 2010 vypadá velmi odlišně od aplikace Outlook 2003, a proto jsme vytvořili tohoto průvodce, který vám pomůže se s ní rychle seznámit. Dozvíte se o

Více

Popis programu EnicomD

Popis programu EnicomD Popis programu EnicomD Pomocí programu ENICOM D lze konfigurovat výstup RS 232 přijímačů Rx1 DIN/DATA a Rx1 DATA (přidělovat textové řetězce k jednotlivým vysílačům resp. tlačítkům a nastavovat parametry

Více

Pro využití aktivního odkazu (modrý a podtržený) použijte klávesu Ctrl + kliknutí myší.

Pro využití aktivního odkazu (modrý a podtržený) použijte klávesu Ctrl + kliknutí myší. Pro využití aktivního odkazu (modrý a podtržený) použijte klávesu Ctrl + kliknutí myší. Při odesílání registrací či hlášení do ISPOP můžete narazit na problémy, které mohou zabraňovat odeslání dokumentů

Více

Jazz Server osobní nastavení uživatele

Jazz Server osobní nastavení uživatele Jazz Server osobní nastavení uživatele Změněno kým Datum RTC verze Verze dokumentu Popis Jan Boháč 10. 2. 2010 2.0.0 1.0 Vytvoření dokumentu Tento dokument popisuje činnosti, které musí každý uživatel

Více

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13 Obsah Úvod 11 Platforma.NET 11.NET Framework 11 Visual Basic.NET 12 1 Základní principy a syntaxe 13 Typový systém 13 Hodnotové typy 13 Struktury 15 Výčtové typy 15 Referenční typy 15 Konstanty 16 Deklarace

Více

INSTALACE PRODUKTU ONTOPIA KNOWLEDGE SUITE

INSTALACE PRODUKTU ONTOPIA KNOWLEDGE SUITE INSTALACE PRODUKTU ONTOPIA KNOWLEDGE SUITE profesionální verze 1 Obsah Požadavky... 3 Instalace... 3 Proměnná CLASSPATH... 3 Zpřístupnění licenčního klíče... 3 Ověřování komponent OKS. 3 Spouštíme aplikaci

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

První kapitola úvod do problematiky

První kapitola úvod do problematiky První kapitola úvod do problematiky Co je to Flex Adobe Flex je ActionSript (AS) framework pro tvorbu Rich Internet Aplications (RIA), tedy knihovna AS tříd pro Flash. Flex používáme k vytvoření SWF souboru

Více

Nápověda a postupy. Instalace a aktivace PDF-XChange Viewer Pro. Instalace a aktivace software. Nápověda a postupy. 1 z 9 27.8.

Nápověda a postupy. Instalace a aktivace PDF-XChange Viewer Pro. Instalace a aktivace software. Nápověda a postupy. 1 z 9 27.8. Nápověda a postupy Zde najdete návody a tipy pro práci, které Vám mohou usnadnit práci s produkty PDF-XChange. V případě, že si myslíte, že by zde neměl některý dotaz nebo problematika chybět, napište

Více

UŽIVATELSKÝ MANUÁL PERSONALIZACE MOJE SODEXO V.3 2009-11-08

UŽIVATELSKÝ MANUÁL PERSONALIZACE MOJE SODEXO V.3 2009-11-08 UŽIVATELSKÝ MANUÁL PERSONALIZACE MOJE SODEXO V.3 2009-11-08 1 Obsah dokumentu 1 Obsah dokumentu... 2 2 Personalizovaná objednávka... 3 3 Jednoduchá... 3 4 Standardní... 4 5 Komplexní... 5 5.1 Párování

Více

Aplikace BSMS. Uživatelská příručka - 1 -

Aplikace BSMS. Uživatelská příručka - 1 - Aplikace BSMS Uživatelská příručka - 1 - Obsah 1. O aplikaci BSMS... 3 2. Základní předpoklady pro používání BSMS... 3 3. Instalace aplikace... 3 3.1. Samotná instalace... 3 3.2. Možné problémy při instalaci...

Více

Přístup k poště MS Office 365 mají pouze studenti 1. a 2. ročníku EkF prezenčního studia. Přístup k ostatním službám mají všichni studenti.

Přístup k poště MS Office 365 mají pouze studenti 1. a 2. ročníku EkF prezenčního studia. Přístup k ostatním službám mají všichni studenti. Obsah Přihlášení k Office 365... 1 Nastavení přeposílání (předávání) doručené pošty... 2 Instalace plného balíku aplikací Office 365 Pro Plus pro studenty... 3 Přihlášení v plné verzi Office 365 Pro Plus

Více

Téma 7: Konfigurace počítačů se systémem Windows 7 III. Téma 7: Konfigurace počítačů se systémem Windows 7 III

Téma 7: Konfigurace počítačů se systémem Windows 7 III. Téma 7: Konfigurace počítačů se systémem Windows 7 III Téma 7: Konfigurace počítačů se systémem Windows 7 III 1 Teoretické znalosti V tomto cvičení se dozvíte, jak funguje nástroj Ověření podpisu souboru. Vyzkoušíte si práci si ověřit podpisy systémových souborů

Více

Práce s e-mailovými schránkami v síti Selfnet

Práce s e-mailovými schránkami v síti Selfnet Práce s e-mailovými schránkami v síti Selfnet Obsah návodu Základní informace k nastavení schránky selfnet.cz...2 Doporučené parametry nastavení e-mailového klienta...2 Základní informace k nastavení e-mailové

Více

Versiondog 3.1.0 Lukáš Rejfek, Pantek (CS) s.r.o. 7/2014

Versiondog 3.1.0 Lukáš Rejfek, Pantek (CS) s.r.o. 7/2014 Versiondog 3.1.0 Lukáš Rejfek, Pantek (CS) s.r.o. 7/2014 Strana 2 Versiondog 3.1.0 Nová verze systému Versiondog 3.1.0 přináší oproti předchozí verzi 3.0.3 celou řadu nových funkčností. Zásadní změnou

Více

Manuál pro mobilní aplikaci Patron-Pro. verze pro operační systém Symbian

Manuál pro mobilní aplikaci Patron-Pro. verze pro operační systém Symbian Manuál pro mobilní aplikaci Patron-Pro verze pro operační systém Symbian 1 1. Popis Aplikace je určena pro mobilní telefony NOKIA s operačním Symbian a vybavené technologií NFC. Slouží pro správu identifikačních

Více

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28. Zdokonalování gramotnosti v oblasti ICT Kurz MS Excel kurz 6 1 Obsah Kontingenční tabulky... 3 Zdroj dat... 3 Příprava dat... 3 Vytvoření kontingenční tabulky... 3 Možnosti v poli Hodnoty... 7 Aktualizace

Více

Přehledy pro Tabulky Hlavním smyslem této nové agendy je jednoduché řazení, filtrování a seskupování dle libovolných sloupců.

Přehledy pro Tabulky Hlavním smyslem této nové agendy je jednoduché řazení, filtrování a seskupování dle libovolných sloupců. Přehledy pro Tabulky V programu CONTACT Professional 5 naleznete u firem, osob a obchodních případů záložku Tabulka. Tuto záložku lze rozmnožit, přejmenovat a sloupce je možné definovat dle vlastních požadavků

Více