VYSOK ´
E U ˇ
CEN´I TECHNICK ´
E V BRN ˇ
E
BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA INFORMA ˇ
CN´ICH TECHNOLOGI´I
´
USTAV PO ˇ
C´ITA ˇ
COV ´
E GRAFIKY A MULTIM ´
EDI´I
FACULTY OF INFORMATION TECHNOLOGYDEPARTMENT OF COMPUTER GRAPHICS AND MULTIMEDIA
MODUL DO PROHL´I ˇ
ZE ˇ
CE P ˇ
REDN ´
A ˇ
SEK PRO
OPRAVOV ´
AN´I V ´
YSTUPU ROZPOZN ´
AVA ˇ
CE
U ˇ
ZIVATELEM
BAKAL ´
A ˇ
RSK ´
A PR ´
ACE
BACHELOR’S THESIS
AUTOR PR ´
ACE
PAVEL SRB
AUTHOR
VYSOK ´
E U ˇ
CEN´I TECHNICK ´
E V BRN ˇ
E
BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA INFORMA ˇ
CN´ICH TECHNOLOGI´I
´
USTAV PO ˇ
C´ITA ˇ
COV ´
E GRAFIKY A MULTIM ´
EDI´I
FACULTY OF INFORMATION TECHNOLOGYDEPARTMENT OF COMPUTER GRAPHICS AND MULTIMEDIA
MODUL DO PROHL´I ˇ
ZE ˇ
CE P ˇ
REDN ´
A ˇ
SEK PRO
OPRAVOV ´
AN´I V ´
YSTUPU ROZPOZN ´
AVA ˇ
CE
U ˇ
ZIVATELEM
MODULE FOR A LECTURE BROWSER FOR CORRECTING THE OUTPUT OF SPEECH RECOGNIZER
BAKAL ´
A ˇ
RSK ´
A PR ´
ACE
BACHELOR’S THESIS
AUTOR PR ´
ACE
PAVEL SRB
AUTHOR
VEDOUC´I PR ´
ACE
Ing. MICHAL FAP ˇ
SO
SUPERVISOR
Abstrakt
J´adrem pr´ace je rozˇs´ıˇren´ı prohl´ıˇzeˇce o funkci opravy pˇrepis˚u z rozpozn´avaˇce uˇzivatelem, vˇcetnˇe vytvoˇren´ı serveru, kter´y pˇrepisy skladuje a umoˇzˇnuje jejich sd´ılen´ı. V ´uvodu je zm´ınˇena motivace pro pr´aci s multim´edii ve v´ypoˇcetn´ı technice. D´ale jsou vyjmenov´any ka-tegorie v´yzkumu rozpozn´av´an´ı ˇreˇci na Fakultˇe informaˇcn´ıch technologi´ı. Velk´a pozornost je vˇenov´ana popisu multimedi´aln´ıho prohl´ıˇzeˇce, kter´y slouˇz´ı pro testov´an´ı a prezentaci tech-nologi´ı rozpozn´avaˇc˚u a v budoucnu se pˇredpokl´ad´a jeho vyuˇzit´ı i jako studijn´ı pom˚ucky nebo pˇrehr´avaˇce pro bˇeˇzn´e uˇzivatele. Jsou zde definov´any poˇzadovan´e vlastnosti tohoto pˇrehr´avaˇce, n´avrhy a popis jejich realizace, potaˇzmo cel´e architektury pˇrehr´avaˇce, zaloˇzen´e na C++, wxWidgets, XML i HTTP.
Kl´ıˇ
cov´
a slova
rozpozn´av´an´ı plynul´e ˇreˇci, multimedi´aln´ı prohl´ıˇzeˇc, textov´e pˇrepisy ke zvukov´emu z´aznamu, opravy chyb v pˇrepisech, C++, wxWidgets, webov´e technologie, s´ıt’ov´a komunikace, PHP, MySQL
Abstract
The core of my work is a browser upgrade, which contains user based transcript-correction from speech recognizer, including creation of transcription storage and sharing server. Intro-duction of my work mentions motivation for multimodal usage in computer science sphere. Further in text is list of speech recognition reasearch categories from Faculty of Information Technology. The main attention is given to description of multimodal browser used for brow-ser technology testing and presentation. In future, the multimodal browbrow-ser is supposed to be used as a study-utility or common user multimodal player. Required features of this player, concepts, realization description and whole C++, wxWidgets, XML, HTTP based architecture is defined.
Keywords
speech recognizer, multimodal browser, text trancription of sound record, trancription mi-stakes correction, C++, wxWidgets, web technologies, web comunication, PHP, MySQL
Citace
Pavel Srb: Modul do prohl´ıˇzeˇce pˇredn´aˇsek pro opravov´an´ı v´ystupu rozpozn´avaˇce
Modul do prohl´ıˇ
zeˇ
ce pˇ
redn´
aˇ
sek pro
opravov´
an´ı v´
ystupu rozpozn´
avaˇ
ce
uˇ
zivatelem
Prohl´
aˇ
sen´ı
Prohlaˇsuji, ˇze jsem tuto bakal´aˇrskou pr´aci vypracoval samostatnˇe pod veden´ım pana Ing. Michala Fapˇsa. Uvedl jsem vˇsechny liter´arn´ı prameny a publikace, ze kter´ych jsem ˇcerpal.
. . . . Pavel Srb 27. ledna 2009
Podˇ
ekov´
an´ı
R´ad bych podˇekoval vedouc´ımu pr´ace Ing. Michalu Fapˇsovi a spoluautorovi prohl´ıˇzeˇce pˇredn´aˇsek Bc. Jakubu Kubal´ıkovi, za pomoc a odborn´e rady, kter´e mi poskytli pˇri tvorbˇe t´eto pr´ace.
c
Pavel Srb, 2009.
Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe in-formaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´avnˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.
Obsah
1 Uvod´ 2
1.1 Multim´edia a v´ypoˇcetn´ı technika . . . 2
1.2 Multim´edia na VUT . . . 3
2 Vlastnosti MBrowseru 4 2.1 Z´akladn´ı poˇzadavky . . . 4
2.2 Technick´e pˇredpoklady . . . 5 2.2.1 C++ . . . 5 2.2.2 wxWidgets . . . 5 2.3 Architektura MBrowseru . . . 7 2.3.1 Konfigurace MBrowseru . . . 7 2.3.2 Vnitˇrn´ı komunikace . . . 8 2.3.3 Syst´em komponent . . . 10
2.3.4 Popis vybran´ych komponent . . . 12
3 Funkce zpˇetn´e vazby v MBrowseru 19 3.1 Vestavˇen´y www browser . . . 19
3.2 Rozˇs´ıˇren´ı komponenty Transcript . . . 20
3.3 Pr´ace se z´aznamy pˇrepis˚u . . . 22
3.4 Komunikace se vzd´alen´ym serverem . . . 22
3.5 Sklad pˇrepis˚u . . . 23
Kapitola 1
´
Uvod
1.1
Multim´
edia a v´
ypoˇ
cetn´ı technika
Pˇri jedn´e cestˇe ze ˇskoly dom˚u jsem hledˇel z okna tramvaje na dopravn´ı prostˇredky kolem mˇe. Vzpomnˇel jsem si na report´aˇz vys´ılanou v televizi o nehodˇe linkov´eho autobusu. Uˇz nev´ım, jak to bylo pˇresnˇe, snad nˇejak´e zdravotn´ı pot´ıˇze ˇridiˇce, ´unava, nebo jen nepozornost. Kaˇzdop´adnˇe okamˇzik jeho selh´an´ı, byl pˇr´ıˇcinou neblah´e ud´alosti. Napadlo mˇe, ˇze ˇr´ızen´ı au-tomobilu by mnohem efektivnˇeji zvl´adal stroj, napˇr. mikrokontrol´er. M´a k tomu ty nejlepˇs´ı pˇredpoklady. V porovn´an´ı s ˇclovˇekem je mnohem rychlejˇs´ı, nepodl´eh´a unavˇe a jakoukoli situaci je schopen vyhodnotit objektivnˇe, bez ruˇsiv´ych vliv˚u, kter´e p˚usob´ı na lidsk´y mozek. Vˇeˇr´ım, ˇze dostateˇcnˇe spolehliv´y algoritmus, kter´y by byl schopen vyhodnotit nˇejakou do-pravn´ı situaci, jsme dnes schopni navrhnout. Profesion´aln´ı ˇridiˇc se v pr´aci vlastnˇe pomˇernˇe nud´ı, jeho mozek vykon´av´a pr´aci podvˇedomˇe - automaticky za nˇej. A tak vznik´a prostor ke ztr´atˇe koncentrace a chybˇe. ˇCasto naˇstˇest´ı bezv´yznamn´e, nejednou se uˇz stalo, ˇze ˇridiˇc MHD zastavil na zast´avce, i kdyˇz jel sv´ym soukrom´ym osobn´ım vozem.
Proˇc tedy dopravn´ı podniky st´ale jeˇstˇe zamˇestn´avaj´ı lidi a ne roboty? Jedn´ım z d˚uvod˚u m˚uˇze b´yt to, ˇze ˇclovˇek je vlastnˇe levn´y v porovn´an´ı k n´aklad˚um na v´yvoj, v´yrobu a pouˇzit´ı dostateˇcnˇe schopn´eho neˇziv´eho z´astupce. Poˇc´ıtaˇce teprve v dneˇsn´ı dobˇe pomalu z´ısk´avaj´ı zrak a sluch. Jestli vˇsak budou m´ıt schopnost rozhodov´an´ı v neobvykl´e, neban´aln´ı situaci, se teprve uk´aˇze. Dnes m˚uˇzeme tvrdit, ˇze k ´uspˇeˇsn´emu pˇrist´an´ı poˇskozen´eho letadla na ˇrece Hudson je nutn´y lidsk´y pilot. Zat´ım se tak´e ˇridiˇci autobus˚u o svou pr´aci b´at nemus´ı, ale historie n´as uˇc´ı, ˇze technologick´y v´yvoj mˇen´ı ˇzivot ve spoleˇcnosti velmi v´yraznˇe. Revoluce m˚uˇze pˇrij´ıt v kaˇzd´e chv´ıli.
Kdyˇz pˇrem´yˇsl´ım o multim´edi´ıch ve v´ypoˇcetn´ı technice napad´a mˇe jeˇstˇe jeden ´uhel po-hledu. Rozvoj hardware, tedy v´ykonu poˇc´ıtaˇc˚u, d´av´a prostor pr´avˇe k prozkoum´av´an´ı nov´ych moˇznost´ı vyuˇzit´ı t´eto kapacity. Vzpomeneme-li si na rychlost pˇripojen´ı k internetu a velikost a rychlost pevn´ych disk˚u z doby pˇred 15-20 lety, je myˇslenka poruˇsov´an´ı autorsk´ych pr´av pˇri sd´ılen´ı a kop´ırov´an´ı film˚u a hudby takˇrka absurdn´ı. V´yvoj nejde zastavit a lid´e, tuˇs´ım, nikdy nepˇrestanou posouvat hranice sv´eho pozn´an´ı. Dnes tedy m´ame moˇznosti jak poˇc´ıtaˇce vybavit schopnostmi rozpozn´avat multim´edia a ˇcin´ıme tak. Pˇri v´yvoji napˇr´ıklad atomov´e bomby, nebo pˇri v´yzkumu kmenov´ych bunˇek, nebo jin´ych artefakt˚u, by si mˇeli vˇedci a politici kl´ast mor´aln´ı ot´azky a nal´ezat etick´e odpovˇedi, jak nov´e vymoˇzenosti ovlivn´ı naˇs´ı civilizaci. Vˇzdy se naˇsel nˇekdo, kdo podlehl objevitelsk´e nebo jin´e v´aˇsni a nehledˇe na zjevn´e d˚usledky udˇelal ten pomysln´y krok vpˇred, kter´y mohl b´yt pro n´as vˇsechny posledn´ı.
Prozaicky ˇreˇceno dojde k tomu, ˇze nakonec budeme nezamˇestnan´ı anebo zdegenerovan´ı, ˇ
Kaˇzd´y v oblasti, kter´a je mu z nˇejak´eho d˚uvodu bl´ızk´a.
1.2
Multim´
edia na VUT
Naˇse ˇskola intenzivnˇe pracuje ve sv´em oboru, tj rovnˇeˇz s grafikou a multim´edii. Dluˇzno podotknout, ˇze pomˇernˇe ´uspˇeˇsnˇe, ˇcehoˇz d˚ukazem jsou mezin´arodn´ı ocenˇen´ı.
Zpracov´an´ım zvukov´ych nebo obrazov´ych informac´ı se zab´yvaj´ı sofistikovan´e algoritmy. Je jich cel´a ˇrada. Spoleˇcn´ym znakem je pro vˇsechny to, ˇze jejich v´ysledky je tˇreba nˇejak testovat, ovˇeˇrovat a zprostˇredkovat tak, aby s nimi byl schopen pracovat ˇclovˇek. T´ımto n´astrojem je Multi-media Browser, kter´y slouˇz´ı pro kontrolu a prezentaci v´ystup˚u z r˚uzn´ych rozpozn´avaˇc˚u a aplikac´ı, souvisej´ıc´ıch s danou tematikou. Je vyuˇz´ıv´an pˇredevˇs´ım skupinou Speech@FIT, kter´a vyv´ıj´ı technologie umoˇznuj´ıc´ı rozpozn´av´an´ı ˇreˇci [18].
Rozpozn´av´an´ı ˇreˇci lze rozdˇelit do nˇekolika kategori´ı.
• Rozpozn´av´an´ı ˇreˇci (speech recognition), jednak celkov´y pˇrepis plynul´e ˇreˇci do textov´e podoby s pouˇzit´ım velk´eho slovn´ıku (large vocabulary continuous speech recognition LVCSR) a tak´e vyhled´av´an´ı v p´ısemn´e podobˇe zadan´ych kl´ıˇcov´ych slov nebo fr´az´ı (keyword/keyphrase spotting).
• Rozpozn´av´an´ı jazyka, tzn. jak´ym jazykem mluvˇc´ı hovoˇr´ı (language identification LID). • Rozpozn´an´ı mluvˇc´ıho, tzn. kdo ˇrekl to, co bylo slyˇset. Jednak v´ybˇer mluvˇc´ıho z mnoˇziny moˇzn´ych - identifikace (speaker identification). A tak´e ovˇeˇren´ı pˇredpokl´adan´e identity - verifikace (speaker verification)
Multi-media Browser, d´ale jen MBrowser, je vyv´ıjen na naˇs´ı ˇskole, jiˇz nˇejakou dobu a umoˇzˇnuje pr´aci s v´ysledky zm´ınˇen´ych rozpozn´avaˇc˚u. M´a vˇsak mnoho dalˇs´ıch schopnost´ı a vlastnost´ı, kter´e budou podrobnˇeji pops´any v dalˇs´ıch kapitol´ach. Zad´an´ım t´eto pr´ace bylo obohatit MBrowser o dalˇs´ı funkcionalitu, kterou je zpˇetn´a vazba od uˇzivatele.
Ne vˇzdy, kdyˇz si lid´e nˇeco vykl´adaj´ı, na sto procent rozumˇen´ı, o ˇcem je ˇreˇc. V takov´e situaci si napˇr. vyˇz´adaj´ı zopakov´an´ı vyˇrˇcen´e vˇety nebo jej´ı vysvˇetlen´ı. Stroj takovou moˇznost s´am od sebe nem´a a pr´avˇe to, aby se mohl zdokonalovat uˇcen´ım, opravou vlastn´ıch chyb, by pro nˇej bylo velmi cenn´e. ´Ukolem tedy je, aby uˇzivatel mohl opravit to, co rozpozn´avaˇc vyp´ıˇse a tyto opravy byly posl´eze zpˇr´ıstupnˇeny pro dalˇs´ı pouˇzit´ı.
Kapitola 2
Vlastnosti MBrowseru
2.1
Z´
akladn´ı poˇ
zadavky
Uˇz bylo ˇreˇceno, ˇze prezentace v´ysledk˚u rozpozn´avaˇc˚u je nezbytn´a, MBrowser vˇsak m˚uˇze slouˇzit i jinak. Na naˇs´ı fakultˇe se drtiv´a vˇetˇsina pˇredn´aˇsek vys´ıl´a po internetu a z´aznamy se ukl´adaj´ı na video servery, kde jsou pozdˇeji kdykoli pˇr´ıstupn´e pro staˇzen´ı. Tyto pˇredn´aˇsky pˇredstavuj´ı jednak mnoˇzstv´ı testovac´ıch dat pro rozpozn´avaˇce, ale hlavnˇe jsou vyuˇz´ıv´any studenty pˇri uˇcen´ı. ´Uˇcast na pˇredn´aˇsk´ach nen´ı povinn´a. Nˇekomu v´ıce vyhovuje osobn´ı ´
uˇcast, avˇsak moˇznost pozastavit pˇredn´aˇsku, popˇr´ıpadˇe pˇrehr´at nˇejak´e ˇc´asti znovu, ocen´ı kaˇzd´y. Myˇslenka MBrowseru je vˇsak jeˇstˇe ˇsirˇs´ı. Ide´aln´ı by bylo poskytnout student˚um n´astroj, kter´y by byl schopen st´ahnout z internetu a prezentovat nejenom audiovizu´aln´ı z´aznam pˇredn´aˇsky, ale zobrazit pˇrepis pˇredn´aˇsen´e l´atky, umoˇznil vyhled´av´an´ı kl´ıˇcov´ych slov v z´aznamu, rovnˇeˇz zobrazoval i slidy v pˇrijateln´e kvalitˇe, popˇr´ıpadˇe dalˇs´ı souvisej´ıc´ı ma-teri´aly, anebo dokonce vyhled´aval a zobrazoval informace z extern´ıch internetov´ych zdroj˚u, to vˇse pˇrehlednˇe a hlavnˇe synchronnˇe. Mysl´ım si, ˇze je snem kaˇzd´eho studenta m´ıt vˇse potˇrebn´e hezky pohromadˇe a neztr´acet neust´ale ohromn´e mnoˇzstv´ı ˇcasu na hled´an´ı rele-vantn´ıch zdroj˚u ke sv´emu studiu.
D´ıky t´eto pˇredstavˇe vznikl projekt
”PRASE“ - Presentation As Synchronized Experi-ence [4], kter´y je obecnou formou pro MBrowser. M´a to b´yt n´astroj pro pr´aci s bohat´ym multimedi´aln´ım obsahem, kter´y najde uplatnˇen´ı pr´avˇe napˇr´ıklad v pˇredn´aˇsk´ach, meetinz´ıch, telefonn´ıch konferenc´ıch, hr´ach a on-line audiovizu´aln´ıch chatech.
Jak´e tedy mus´ı m´ıt MBrowser vlastnosti, aby splnil v´yˇse popsan´a oˇcek´av´an´ı? • V´ystavba na volnˇe ˇsiˇriteln´ych technick´ych prvc´ıch - opensource. D˚uleˇzit´ym pˇ
redpokla-dem pouˇzitelnosti a ˇsirok´eho uplatnˇen´ı je bezprobl´emov´a licence Mbrowseru. N´ızk´e, vlastnˇe u opensorce ˇz´adn´e, finanˇcn´ı n´aklady na poˇr´ızen´ı a pouˇz´ıv´an´ı tohoto software nutnˇe pˇrispˇej´ı k jeho ˇs´ıˇren´ı a dalˇs´ımu rozvoji.
• Pˇrenositelnost - dalˇs´ım prvkem, kter´y je velmi cenn´y je to, aby MBrowser mohl b´yt pouˇz´ıv´an na co nejv´ıce platform´ach.
• Moˇznost rozˇs´ıˇren´ı - ve chv´ıli, kdy chceme pˇridat do MBrowseru nˇejakou novou vlast-nost, m´a to b´yt moˇzn´e s co nejmenˇs´ı program´atorskou n´amahou.
• Moˇznost konfigurace - vzhledem k ˇsirok´emu spektru poˇzadavk˚u na MBrowser nen´ı divu, ˇze mus´ı b´yt ˇsiroce konfigurovateln´y, jeho vzhled a chov´an´ı se potom liˇs´ı od
zp˚usobu nasazen´ı. Srovn´ame-li pak dvˇe r˚uzn´e situace, i MBrowser m˚uˇze vypadat ´
uplnˇe jinak.
• Pr´ace s multim´edii - to zahrnuje pr´aci s videem, zvukem, textem nebo obrazov´ymi zdroji jako jsou pˇredn´aˇsky nebo prezentace.
• Pr´ace s internetov´ymi zdroji a to i v re´aln´em ˇcase - moˇznost stahov´an´ı multimedi´aln´ıch dat z r˚uzn´ych server˚u a pak tak´e on-line funkˇcnost, napˇr. pˇri ˇziv´e pˇredn´aˇsce.
2.2
Technick´
e pˇ
redpoklady
2.2.1 C++
Pro implementaci byl zvolen programovac´ı jazyk C++ [7] [2] [13]. Tento velmi mocn´y pro-gram´atorsk´y n´astroj m´a mnoho vlastnost´ı, za zm´ınku stoj´ı pˇredevˇs´ım ty, kter´e souvis´ı s charakterem naˇseho pˇrehr´avaˇce pˇredn´aˇsek. Jazyk C++ je pˇrenositeln´y, respektive existuj´ı porty pˇrekladaˇc˚u na v´yznamn´e c´ılov´e syst´emy - Windows, Linux, ale i dalˇs´ı a jsou i v open-source verz´ıch. Pˇreloˇzen´y k´od se vyznaˇcuje vysok´ym v´ykonem pˇri bˇehu. Naps´an´ı programu napˇr´ıklad v nˇejak´em skriptovac´ım jazyce je jistˇe m´enˇe n´aroˇcn´e i co se t´yk´a poˇzadavk˚u na pˇrenositelnost, ale v´ysledn´a aplikace bude m´enˇe efektivnˇe pracovat s hardwarov´ymi zdroji. Jazyk C++ patˇr´ı mezi vyˇsˇs´ı program´atorsk´e jazyky a umoˇzˇnuje implementaci podle objek-tov´eho paradigmatu. Toho je vyuˇzito pˇri n´avrhu MBrowseru, jeˇz je zaloˇzen na tˇr´ıd´ach. D´ale jazyk C++, respektive jeho standardn´ı knihovny obsahuj´ı bohatou funkcionalitu, ale exis-tuje jeˇstˇe v´ıce doplˇnkov´ych knihoven a prostˇred´ı psan´ych v C++, coˇz je v MBrowseru tak´e hojnˇe vyuˇzito. Shrneme-li to, zjist´ıme, ˇze pouˇzit´ı C++ n´am d´av´a vysok´y v´ykon a relativnˇe efektivn´ı moˇznost implementace. Nev´yhodou je vyˇsˇs´ı n´arok kladen´y na program´atora, kdyˇz je tento jazyk velmi bohat´y a sloˇzit´y a m´a specifick´e poˇzadavky na pˇrenositelnost.
2.2.2 wxWidgets
M´ırnˇe nadstandardn´ım stavebn´ım prvkem MBrowseru je knihovna wxWidgets [8] [9]. Tato knihovna existuje pro mnoho platforem a nejen pro C++, v naˇsem pˇr´ıpadˇe je vˇsak pouˇzita pr´avˇe C++ verze. Poˇzadavek na pˇrenositelnost tedy s jej´ım pouˇzit´ım nen´ı nikterak omezen. Jej´ım hlavn´ım ´uˇcelem a z´aroveˇn vyuˇzit´ım je pˇrid´an´ı tˇr´ıd a funkcionality ke standardn´ımu C++ pro pr´aci s grafick´ym uˇzivatelsk´ym rozhran´ım, konkr´etnˇe tvorbou a spr´avou hierar-chie oken. Na rozd´ıl od jin´ym pˇrenositeln´ych knihoven, umoˇzˇnuj´ıc´ıch n´avrh programu s GUI, tato vyuˇz´ıv´a nativn´ıch prostˇredk˚u dan´e platformy. Existuj´ı dvˇe cesty jak realizovat pˇrenositelnou grafickou knihovnu. Jednak vytvoˇren´ı nˇejak´eho frameworku (r´amce, nosn´e konstrukce) pro kaˇzdou c´ılovou platformu a v n´ı pak spouˇstˇen´ı naˇs´ı univerz´aln´ı aplikace. Druhou moˇznost´ı je k´od s pas´aˇzemi s podm´ınˇen´ym pˇrekladem, kde se na kaˇzd´e platformˇe pˇr´ımo generuje k´od vyuˇz´ıvaj´ıc´ı v dan´em m´ıstˇe nativn´ı, tedy dom´ac´ı, pˇrirozen´e komponenty (napˇr´ıklad tlaˇc´ıtka, liˇsty, okna). WxWidgets pouˇz´ıv´a druhou variantu, tato volba m´a nˇekolik velmi d˚uleˇzit´ych d˚usledk˚u. Mezi ty bezesporu pozitivn´ı se ˇrad´ı vysok´y v´ykon v´ysledn´e apli-kace, nen´ı zde ˇz´adn´y mezistupeˇn pˇri realizaci GUI. Nev´yhoda je opˇet sloˇzitˇejˇs´ı implementace a pak tak´e ne vˇzdy ide´aln´ı a pˇredpokl´adan´a funkˇcnost. WxWidgets je wrapper (ob´alka), oba-luje totiˇz existuj´ıc´ı funkce a knihovny dan´eho grafick´eho prostˇred´ı. V MS Windows jsou to API funkce, v X Windows napˇr´ıklad knihovna Motif, nebo dnes aktu´alnˇejˇs´ı GTK. Obalen´ım je myˇsleno to, ˇze m´a vlastn´ı hierarchii tˇr´ıd, jejich rozhran´ı, model ˇs´ıˇren´ı zpr´av a ˇr´ızen´ı
bˇehu cel´e aplikace. Vlastn´ı proveden´ı nˇejak´ych ´ukonu nad grafick´ym rozhran´ım je reali-zov´ano zavol´an´ım nˇekter´e z v´yˇse popsan´ych funkc´ı nebo vytvoˇren´ım tˇr´ıd a vol´an´ım jejich metod. Aby bylo moˇzno pouˇz´ıt nativn´ı komponenty dan´eho prostˇred´ı a z´aroveˇn poskytovat univerz´aln´ı rozhran´ı mus´ı dˇelat wxWidgets kompromisy. Napˇr´ıklad na nˇeco je zapotˇreb´ı kliknout dvakr´at pro z´ısk´an´ı focusu (st´at se aktivn´ım prvkem, kter´y zachycuje stisknut´e kl´avesy), a pˇritom za norm´aln´ıch okolnost´ı jen jednou. Je tˇreba poznamenat d˚uleˇzitou vˇec, a totiˇz, ˇze tento zp˚usob vyuˇzit´ı nativn´ıch zdroj˚u je znaˇcnˇe komplikovan´y. Kdyˇz pro-gram´ator pouˇz´ıv´a jen z´akladn´ı rozhran´ı wxWidgets je vˇse relativnˇe v poˇr´adku, ale chce-li pˇridat nˇejakou zvl´aˇstnˇejˇs´ı funkcionalitu do sv´eho projektu, muˇze narazit na ˇradu probl´em˚u plynouc´ıch ze zm´ınˇen´e sloˇzitosti.
Znaˇcnou pˇrek´aˇzkou pˇri pouˇz´ıv´an´ı wxWidgets je ne ´uplnˇe precizn´ı dokumentace k t´eto knihovnˇe. Ne vˇsechny metody jsou pops´any v ofici´aln´ı dokumentaci [9]. Je tˇreba neust´ale dohled´avat na internetu upˇresˇnuj´ıc´ı informace, anebo pouˇz´ıt nejjistˇejˇs´ı cestu, totiˇz ˇc´ıst jej´ı zdrojov´e k´ody. Zde bych chtˇel vyzdvihnout neskuteˇcnou v´yhodu vˇsech opensource projekt˚u. Kdyˇz totiˇz nefunguje nˇeco v komerˇcn´ım projektu, ˇclovˇek nem´a ˇsanci dop´atrat se v ˇcem je probl´em, natoˇz ho vyˇreˇsit. U opensource m´a program´ator z´asadnˇe ˇsirˇs´ı moˇznosti.
Dalˇs´ı nedokonalost´ı je to, ˇze programov´an´ı ve wxWidgets vyˇzaduje znaˇcn´e zkuˇsenosti, anebo jejich pracn´e a ˇcasovˇe n´aroˇcn´e z´ısk´av´an´ı. Obsluha kliknut´ı myˇs´ı nebo pˇred´avn´ı focusu mezi okny nen´ı v dokumentaci explicitnˇe zaznamenan´a, ned´a se zkr´atka popsat kaˇzd´e specifikum do nejmenˇs´ıch detail˚u a je tedy tˇreba hodnˇe variant pouˇzit´ı dostupn´ych moˇznost´ı vyzkouˇset. Uvedu pˇr´ıklad, existuje tˇr´ıda wxHTMLWindow, kter´a funguje jako velmi jednoduch´y prohl´ıˇzeˇc dokument˚u napsan´ych v HTML. Tato komponenta je schopna zob-razovat z´akladn´ı elementy jako tabulky nebo odkazy. Pˇrekvapuj´ıc´ım zjiˇstˇen´ım pro mne bylo, ˇze na HTML odkaz na zobrazen´e str´ance nejde kliknout stˇredn´ım tlaˇc´ıtkem myˇsi. Pˇresnˇeji ˇreˇceno, objekt reprezentuj´ıc´ı tento odkaz reaguje jen na kliknut´ı lev´ym nebo prav´ym tlaˇc´ıtkem, aˇckoli nadˇrazen´e okno kliknut´ı stˇredn´ım tlaˇc´ıtkem pˇrij´ım´a. Kdybych chtˇel dos´ahnout pˇredpokl´adan´e funkˇcnosti, st´alo by to mnoho ´usil´ı, nutnost derivace vlastn´ı tˇr´ıdy a pˇreps´an´ı nejedn´e metody vlastnˇe kv˚uli maliˇckosti. Mysl´ım si, ˇze pouˇstˇet se do takov´ych detail˚u nem´a smysl a hlavnˇe ani dostateˇcn´y pˇr´ınos pro cel´y projekt a je lepˇs´ı vyuˇz´ıvat schopnost´ı wxWidgets tak jak jsou.
S probl´emy popsan´ymi v pˇredchoz´ım odstavci souvis´ı dalˇs´ı vlastnost wxWidgets. Tato knihovna poskytuje ˇrad˚u dodateˇcn´ych tˇr´ıd nejen pro pr´aci s okny, coˇz je rozhodnˇe velmi uˇziteˇcn´e, jedn´a se napˇr´ıklad o tˇr´ıdy pro pr´aci se soubory, nebo poˇc´ıtaˇcovou s´ıt´ı. Jejich pˇr´ınos je podle mne ale sporn´y, kdyˇz jejich funkˇcnost se d´a popsat vesmˇes jako z´akladn´ı a ne vˇzdy spolehliv´a. Pravda je, ˇze tˇeˇziˇstˇe t´eto knihovny leˇz´ı na jin´ych tˇr´ıd´ach, a jelikoˇz jsou wxWidgets
”zadarmo“ nen´ı hezk´e si stˇeˇzovat, ale m´ısto toho projevit vdˇek a respekt. V pˇr´ıpadˇe nespokojenosti radˇeji pˇriloˇzit ruku k v´yvoji.
Ve tˇr´ıdˇe wxString silnˇe postr´ad´am metody pro pr´aci s regul´arn´ımi v´yrazy, kter´e jsou po zkuˇsenostech se skriptovac´ımi jazyky velmi silnˇe n´avykov´e. D´ale jsem mˇel probl´em s wxSockety, respektive derivovanou tˇr´ıdou wxHTTP. Nam´ısto n´ı jsme pouˇzil knihovnu Asio, kter´a je ´uzce specializov´ana na sockety a jej´ı schopnosti a v´ykon tomu odpov´ıdaj´ı. Po-sledn´ı drobnost´ı, kterou bych chtˇel jeˇstˇe na tomto m´ıstˇe zm´ınit a kterou pop´ıˇs´ı pozdˇeji, je komplikace s UNICODE verz´ı wxWidgets. Tato verze um´ı pracovat s ˇretˇezci k´odovan´ymi v UNICODE. Tyto znakov´e sady se vyznaˇcuj´ı t´ım, ˇze jeden znak m˚uˇze b´yt zak´odov´an po-moc´ı dvou a v´ıce jin´ych. V ANSI vyd´an´ı s konverz´ı ˇretˇezc˚u nen´ı ˇz´adn´y probl´em. Jeden znak je pˇresnˇe jeden znak. Je tˇreba vˇedˇet, v jak´em je dokument k´odov´an´ı. Naˇc´ıt´an´ı a tisknut´ı ˇretˇezc˚u v UNICODE verzi je tedy podstatnˇe sloˇzitˇejˇs´ı a vyˇzaduje mnohem vice pozornosti. Dopln´ım jeˇstˇe, ˇze i kdyˇz C++, wxWidgets, nebo i dalˇs´ı pˇrenositeln´y software existuje
pro mnoho platforem, b´yv´a ˇcasto velk´y probl´em splnit vˇsechny z´avislosti a poˇzadavky a zprovoznit ho pr´avˇe na t´e sv´e. Na administr´atora c´ılov´eho syst´emu jsou kladeny n´aroky nejen na znalost sv´eho syst´emu, ale hlavnˇe na nutnost nˇekdy aˇz pˇr´ıliˇs detailn´ı znalosti instalovan´eho software.
Aˇckoli m´a wxWidgets jist´e vady, kter´ym jsem se vˇenoval v popisu moˇzn´a aˇz pˇr´ıliˇs, po-zitivn´ıch vlastnost´ı je mnohem v´ıce a bez existence knihoven jako wxWidgets by MBrowser vznikal jen velmi obt´ıˇznˇe nebo sp´ıˇse v˚ubec.
2.3
Architektura MBrowseru
Vzhledem k poˇzadavk˚um na r˚uzn´e vyuˇzit´ı a snadnou rozˇsiˇritelnost, je MBrowser konci-pov´an jako syst´em vz´ajemnˇe komunikuj´ıc´ıch komponent, kter´e mohou b´yt na sobˇe navz´ajem nez´avisl´e [11].
2.3.1 Konfigurace MBrowseru
Kaˇzd´a komponenta je ˇsiroce konfigurovateln´a, d´ıky ˇcemuˇz m˚uˇze b´yt nasazena na r˚uzn´ych m´ıstech a r˚uzn´ymi zp˚usoby.
Vˇsechny konfiguraˇcn´ı ´udaje jsou uloˇzeny v souboru layout.xml, kter´y, jak je vidˇet uˇz podle pˇr´ıpony, obsahuje popis rozvrˇzen´ı a vlastnosti komponent ve form´atu xml. Tento popis m´a stromovou strukturu, zaˇc´ın´a koˇrenov´ym uzlem layout. V konfiguraˇcn´ım souboru jsou definov´any skupiny komponent, kter´e sd´ılej´ı zpr´avy (podrobnˇeji pozdˇeji). Podˇr´ızen´e uzly layoutu reprezentuj´ı komponenty a nˇekter´e z nich mohou obsahovat dalˇs´ı komponenty. Napˇr´ıklad:
<layout name="main">
<window name="window1" title="Multi-media Browser" left="0%" top="0%" width="75%" height="90%">
<mediaplayer name="player1" left="0%" top="0%" width="60%" height="54%" url="./data/iss_prednaska_7.avi" autorun="true" amsg=".*" waitfor="1" controls="true" backend="" syncint="1.0"/>
<slidebar name="slidebar1" left="0%" top="54%" width="60%" height="3%" amsg=".*"/>
<button name="button_play" text="Play" left="0%" top="57%" width="12%" height="3%" onclick="<message name=\"media.play\"/>"/>
<button name="button_pause" text="Pause" left="12%" top="57%" width="12%" height="3%" onclick="<message name=\"media.pause\"/>"/>
<button name="button_stop" text="Stop" left="24%" top="57%" width="12%" height="3%" onclick="<message name=\"media.stop\"/>"/>
</window> </layout>
Z pˇr´ıkladu je vidˇet, ˇze kaˇzd´a komponenta m´a sv´e v r´amci skupiny unik´atn´ı jm´eno. D´ale jsou zde specifikov´any vlastnosti t´ykaj´ıc´ı se vzhledu, jako napˇr´ıklad titulek okna. Velmi d˚uleˇzit´ymi parametry jsou i velikost a rozm´ıstˇen´ı na obrazovce, kter´e je pops´ano v relativn´ıch jednotk´ach k nadˇrazen´emu prvku nebo absolutnˇe v pixelech. Definov´any jsou tak´e atributy urˇcuj´ıc´ı nastaven´ı komponenty obecnˇe, tak i specifick´e vlastnosti, kter´e urˇcuj´ı funkˇcnost komponenty za bˇehu prohl´ıˇzeˇce.
Napˇr´ıklad u tlaˇc´ıtka je to argument onclick, zde definovan´a zpr´ava se odeˇsle v pˇr´ıpadˇe, ˇ
ze uˇzivatel na tlaˇc´ıtko klikne. Existuje obecn´a komponenta
”tlaˇc´ıtko“, kter´a m˚uˇze b´yt pouˇzita na ovl´ad´an´ı libovoln´e akce v prohl´ıˇzeˇci.
Existuj´ı vyhrazen´e n´azvy atribut˚u, kter´e maj´ı pevn´e urˇcen´ı.
data - Kaˇzd´a komponenta m˚uˇze vlastnit nˇejak´a XML data. Pˇr´ıklad: <component name="komponenta1">
<data>
Uˇzivatelsk´a data <kde> m´ısto </kde> <kdo> osoba </kdo> <proˇc> proto </proˇc> </data>
</component>
tato struktura je interaktivnˇe pˇreloˇzena do zkr´acen´e verze a pozdˇeji v komponentˇe dostupn´a v promˇenn´e data.
<component name="kompnenta1" data="Uˇzivatelsk´a data <kde> m´ısto </kde>..."/> args - alternativn´ı z´apis atribut˚u kaˇzd´e komponenty, umoˇzˇnuje to zpˇrehlednit z´apis. Pˇr´ıklad:
<component name="komponenta2"> <args>
<arg1> hodnota1 </arg1> <arg2>
hodnota2 </arg2> </args> </component>
Toto je pˇreloˇzeno jako:
<component name="komponent2" arg1="hodnota1" arg2="hodnota2">
2.3.2 Vnitˇrn´ı komunikace
Kaˇzd´a komponenta dok´aˇze pos´ılat a stejnˇe tak i pˇrij´ımat zpr´avy. Zpr´ava je XML text, ke kter´emu m˚uˇzou b´yt volitelnˇe pˇriloˇzena bin´arn´ı data. Princip pos´ıl´an´ı zpr´av je asi takov´yto: vˇsechny komponenty jsou pˇripojeny k jak´esi virtu´aln´ı sbˇernici, komponenta vyˇsle zpr´avu 2.1, ta je zachycena v j´adˇre, konkr´etnˇe v modulu messanger, kter´y zpr´avu pˇrijme a rozeˇsle vˇsem ostatn´ım komponent´am 2.2
Form´at zpr´avy je n´asleduj´ıc´ı:
<message name="jm´eno_zpr´avy" argument1="hodnota1" argument2="hodnota2" ...> ...
Messanger komponenta 2 komponenta 1 komponenta 3 komponenta 5 komponenta 4 komponenta 6
<messge name=”zpr´ava X” ..
Obr´azek 2.1: Komponenta pos´ıl´a zpr´avu
nebo zkr´acenˇe
<message name="jm´eno_zpr´avy" argument1="hodnota1" argument2="hodnota2" /> Zpr´avy jsou rozes´ıl´any vˇzdy vˇsem komponent´am v aktu´aln´ı skupinˇe, kaˇzd´a komponenta se vˇsak m˚uˇze rozhodnou, zda danou zpr´avu pˇrijme, ˇci nikoliv. Toto chov´an´ı se d´a ovliv-nit dvˇema argumenty amsg (accept message) - pˇrij´ıman´e zpr´avy a dmsg (deny message) -zam´ıtan´e zpr´avy. Tyto argumenty obsahuj´ı ˇretˇezec znak˚u s regul´arn´ım v´yrazem ve form´atu skupina@odesilatel:jm´eno_zpr´avy
Pouˇzity jsou standardn´ı POSIX regul´arn´ı v´yrazy. Argumenty amsg a dmsg mohou obsahovat v´ıce regul´arn´ıch v´yraz˚u oddˇelen´ych stˇredn´ıkem
”;“.
Kromˇe zpr´av zas´ılan´ych mezi komponentami existuj´ı jeˇstˇe syst´emov´e zpr´avy, kter´e jsou zpracov´av´any Mbrowserem pˇr´ımo
• system.remove - specifikuje komponentu, nebo celou skupinu komponent patˇr´ıc´ıch do stejen´e tˇr´ıdy, kter´e budou odebr´any
• system.loadlayout - naˇcte dan´y konfiguraˇcn´ı soubor a zp˚usob´ı tak metamorf´ozu MBrowseru
Velmi d˚uleˇzitou skupinou zpr´av jsou synchronizaˇcn´ı zpr´avy, kter´e slouˇz´ı k synchronizaci jednotliv´ych multimedi´aln´ıch proud˚u dat - audio, video, pˇrepis...
Messanger komponenta 2 komponenta 1 komponenta 3 komponenta 5 komponenta 4 komponenta 6
<messge name=”zpr´ava X” ..
Obr´azek 2.2: Zpr´ava je doruˇcena vˇsem komponent´am
Jejich parametry jsou tyto
• jm´eno - mˇelo by obsahovat pˇr´ıponu
”.sync“ • zdroj - t´ım je bud’
”timer“ - zpr´avy jsou generov´any automaticky v urˇcit´ych ˇcasov´ych intervalech, nebo
”manual“ - napˇr´ıklad, kdyˇz uˇzivatel pozastav´ı pˇrehr´av´an´ı, nebo se posune do jin´eho m´ısta v z´aznamu.
• start, konec - ˇcasov´y ´udaj, urˇcuj´ıc´ı konkr´etn´ı m´ısto v multimedi´aln´ım z´aznamu.
2.3.3 Syst´em komponent
Spr´avu komponent, jejich vytv´aˇren´ı, ruˇsen´ı a tak´e zprostˇredkov´an´ı jejich komunikace zajiˇst’uje j´adro MBrowseru. Charakteristick´ym rysem komponent, respektive jejich zdrojov´ych k´od˚u, je uloˇzen´ı v adres´aˇrov´e struktuˇre projektu. Zat´ımco vˇsechny spoleˇcn´e a univerz´aln´ı moduly, jak´ymi jsou j´adro MBrowseru, obsluha vnitˇrn´ı komunikace, nebo tˇr´ıdy pro uchov´av´an´ı a manipulaci s multimedi´aln´ımi daty, jsou uloˇzeny v koˇrenov´em adres´aˇri, kaˇzd´e komponentˇe je vyhrazen vlastn´ı adres´aˇr. Tato zd´anliv´a drobnost velice zpˇrehledˇnuje cel´y syst´em.
Studium j´adra prohl´ıˇzeˇce nebylo kl´ıˇcov´e pro realizaci tohoto projektu. Mnohem d˚uleˇzitˇejˇs´ı bylo udˇelat si co nejpˇresnˇejˇs´ı obr´azek o tom, jak je kaˇzd´a komponenta vystavˇena a co potˇrebuje ke sv´emu
”ˇzivotu“.
Komponenty v MBrowseru jsou vesmˇes dvoj´ıho druhu. Zaprv´e se jedn´a o nevizu´aln´ı komponenty, jejich implementace a zapojen´ı do celku jsou pomˇernˇe jednoduch´e a pˇrehledn´e. S vizu´aln´ımi komponentami je to podstatnˇe sloˇzitˇejˇs´ı. Vizu´aln´ı komponentou je ta, kter´a pˇredstavuje nˇejak´y objekt grafick´eho uˇzivatelsk´eho rozhran´ı, technicky je to vˇsak kaˇzd´a komponenta, kter´a je spojen´a s nˇejak´ym objektem z knihovny wxWidgets.
Pˇr´ıklad toho, jak vypad´a nevizu´aln´ı komponenta, je na obrazku 2.3. Tˇr´ıdy BaseComponent a Component poskytuj´ı z´akladn´ı rozhran´ı pro napojen´ı na j´adro, pos´ıl´an´ı zpr´av, reakci na pˇrijat´e zpr´avy nebo pˇr´ıjem konfiguraˇcn´ıch informac´ı. Postup pˇri vytvoˇren´ı nov´e komponenty je patrn´y z obr´azku - staˇc´ı derivovat vlastn´ı tˇr´ıdu z Component a ta uˇz m´a vˇse potˇrebn´e, aby mohla fungovat v r´amci cel´eho syst´emu.
BaseComponent Component <<interface >> Vnitˇrn´ı komunikace +SendMessage() UrlGetComponent j´adro
Obr´azek 2.3: Nevizu´aln´ı komponenta
Vizu´aln´ı komponenta m´a, jak je vidˇet na obr´azku 2.4, dvˇe ˇc´asti - standardn´ı, podobnou nevizu´aln´ı komponentˇe a pak ˇc´ast, kter´a obsahuje instanci nˇejak´e tˇr´ıdy z wxWidgets. Tˇr´ıda wxComp pˇrid´av´a funkce a parametry potˇrebn´e pro vizualizaci, interakci s uˇzivatelem a pro-pojen´ı s pracovn´ı plochou. Do nov´e tˇr´ıdy derivovan´e z nˇejak´e wxWidgets tˇr´ıdy je pomoc´ı makra pˇrid´ano rozhran´ı, kter´e je vˇsak implementov´ano v nevizu´aln´ı ˇc´asti. Vizu´aln´ı ˇc´ast tak pouˇz´ıv´a rozhran´ı nevizu´aln´ı ˇc´asti ke komunikaci s j´adrem. Jedn´a se hlavnˇe o pos´ıl´an´ı zpr´av nebo odchyt chybov´ych hl´aˇsek.
Vytvoˇren´ı vizu´aln´ı komponenty prob´ıh´a asi takto: nejdˇr´ıve je vytvoˇrena nevizu´aln´ı po-lovina nov´e komponenty a ta posl´eze vytvoˇr´ı svoje grafick´e alter ego a provede sv´az´an´ı -technicky pomoc´ı pˇred´an´ı a uloˇzen´ı ukazatel˚u na instance obou tˇr´ıd. Funkˇcnost pˇri bˇehu komponenty je pak rozdˇelena mezi dva objekty, kter´e se navz´ajem podle potˇreby vyuˇz´ıvaj´ı. Spojen´ı s j´adrem je realizov´ano v r´amci nevizu´aln´ı ˇc´asti, komunikace s uˇzivatelem obstar´av´a vizu´aln´ı ˇc´ast a v´ysledky si navz´ajem pˇred´avaj´ı. Mysl´ım si, ˇze vˇetˇsina funkci by mˇela b´yt koncentrov´ana v nevizu´aln´ı ˇc´asti a tak jsem koncipoval svou pr´aci. Vizu´aln´ı ˇc´ast slouˇz´ı hlavnˇe pro zobrazov´an´ı informac´ı a jejich sbˇer od uˇzivatele a n´aslednˇe je pˇredat nevizu´aln´ı ˇ
c´asti.
Mezi nejd˚uleˇzitˇejˇs´ı metody, kter´e mus´ı komponenta implementovat, patˇr´ı metoda pro sv˚uj vznik a inicializaci, d´ale pak metoda pro pˇr´ıjem konfiguraˇcn´ıch ´udaj˚u a tak´e metoda, kter´a obsluhuje pˇrijet´ı a vyhodnocen´ı rozes´ılan´ych zpr´av.
Podobnˇe jako wxWigdets zapouzdˇruje grafick´e rozhran´ı syst´emu, kde je nasazen, d´a se ˇr´ıci, ˇze stejnˇe tak MBrowser zapouzdˇruje - obaluje wxWidgets. Z toho plynou dalˇs´ı komplikace pˇri pr´aci na tomto projektu.
BaseComponent Component wxComp ButtonComponent wxButton ButtonVisual <<use >> <<use >> j´adro <<interface >> Vnitˇrn´ı komunikace +SendMessage()
Obr´azek 2.4: Vizu´aln´ı komponenta
2.3.4 Popis vybran´ych komponent
V t´eto ˇc´asti budou detailnˇeji pops´any ty komponenty, se kter´ymi se bylo tˇreba sezn´amit, pˇri ˇreˇseni tohoto zad´an´ı.
Transcript
Prvotn´ı motivac´ı vzniku t´eto komponenty byla potˇreba zobrazen´ı textov´eho pˇrepisu, kter´y je v´ystupem rozpozn´avaˇce k nˇejak´emu videu. Transcript vznikl jako derivovan´a tˇr´ıda z komponenty HTMLBrowser a ta je derivovan´a z wxHtmlWindow. Jin´ymi slovy, jej´ım z´akladem je jednoduch´y HTML prohl´ıˇzeˇc. D´ıky t´eto koncepci se d´a pomˇernˇe snadno zobrazit p´ısemn´a data, nen´ı tˇreba se starat o zalamov´an´ı textu a podobnˇe.
Proto, aby bylo moˇzno v r´amci komponenty Transcript jednoduˇse pracovat s textov´ym pˇrepisem, vznikly pomocn´e tˇr´ıdy Record a RecordList. Transcript obsahuje pr´avˇe jednu instanci tˇr´ıdy RecordList, kter´a obsahuje cel´y pˇrepis a poskytuje rozhran´ı k pohodln´emu z´ısk´av´an´ı jeho jednotliv´ych ˇc´ast´ı.
V konfiguraˇcn´ım souboru je moˇzno pouˇz´ıt komponentu Transcript dvˇema zp˚usoby: <transcription url="soubor_s_pˇrepisem"/>
tedy, odk´azat se na lok´aln´ı soubor nebo internetov´y zdroj, kter´y obsahuje pˇrepis, nebo specifikovat data k zobrazen´ı pˇr´ımo:
<transcription> <data> <record ... /> ... <record ... /> </data> </transcription>
Pˇri velk´em obejmu dat nen´ı druh´a moˇznost pˇr´ıliˇs vyuˇziteln´a, ale syntakticky moˇzn´a. Z´aznamy uloˇzen´e v souboru s pˇrepisem maj´ı n´asleduj´ıc´ı form´at, pˇriˇcemˇz se jedn´a opˇet o XML data jako ostatnˇe vˇsude v MBrowseru:
<record channel="ˇc´ıslo_kan´alu" start="sekundy" end="sekundy"
bgcolor="barva_pozad´ı" timelabel="nadpis_s_casem" text="vˇeta_pˇrepisu"/> nebo
<record channel="ˇc´ıslo_kan´alu" start="sekundy" end="sekundy" bgcolor="barva_pozad´ı" timelabel="nadpis_s_casem">
vˇeta_pˇrepisu </record>
Vysvˇetlen´ı jednotliv´ych argument˚u je n´asleduj´ıc´ı:
• channel - ˇc´ıslo kan´alu, nejˇcastˇeji oznaˇcuje ˇreˇcn´ıka, m˚uˇzeme tak rozdˇelit pˇrepis od r˚uzn´ym lid´ı a pˇr´ıpadnˇe ho jinak zobrazit
• start a start - ˇcasov´y interval, kdy je moˇzn´e danou vˇetu slyˇset, respektive, kdy m´a b´yt zobrazena
• bgcolor - barva pozad´ı textu, slouˇz´ı ke zv´yraznˇen´ı a lepˇs´ı pˇrehlednosti
• timelabel - u kaˇzd´e vˇety se zobrazuje ´udaj o ˇcase kdy zaˇc´ın´a, tento ´udaj je na rozd´ıl od start uloˇzen jako text s oznaˇcen´ım minut, sekund a podobnˇe, aby byl ˇciteln´y pro ˇclovˇeka
• text samotn´a vˇeta pˇrepisu
Instance tˇr´ıdy Record obsahuje pr´avˇe jeden uzel <recod>, respektive jeho atributy a jejich hodnoty.
Implementov´any jsou tyto funkce:
• oper´ator [] - k jednotliv´ym atribut˚um je moˇzn´e pˇristupovat pro ˇcten´ı i z´apis takto: napˇr. record["text"] v pˇr´ıpadˇe, ˇze se dot´aˇzeme na neexistuj´ıc´ı argument, je vr´acen pr´azdn´y ˇretˇezec
• funkce FirstName a GetName - pomoc´ı prvn´ı z nich se nastav´ı vnitˇrn´ı ukazatel na prvn´ı atribut a opakovan´ym vol´an´ım druh´e funkce z´ısk´ame postupnˇe vˇsechny n´azvy atribut˚u.
• oper´ator < (menˇs´ı) - je urˇcen k ˇrazen´ı z´aznam˚u, kde se nejdˇr´ıve porovn´avaj´ı argumenty start a v pˇr´ıpadˇe jejich shody end a v posledn´ı ˇradˇe text
Tˇr´ıda RecordList vytv´aˇr´ı line´arn´ı seznam nad z´aznamy a d´ale pˇrid´av´a funkce pro spr´avu toho seznamu:
• Add - pˇrid´a z´aznam do seznamu, na vstupu oˇcek´av´a objekt tˇr´ıdy Record
• Import a jeho modifikace - slouˇz´ı k naˇcten´ı z´aznam˚u z textov´eho ˇretˇezce, nebo praktiˇctˇeji ze souboru lok´aln´ıho nebo s´ıt’ov´eho
• First a Get - prvn´ı funkce nastav´ı vnitˇrn´ı ukazatel na zaˇc´atek seznamu a opakovan´ym vol´an´ım druh´e funkce z´ısk´ame postupnˇe vˇsechny z´aznamy.
• Sort - tato funkce slouˇz´ı k uspoˇr´ad´an´ı z´aznam˚u vzestupnˇe podle ˇcasu, neboli logicky tak jak jsou a budou vyˇrˇceny v audiovizu´aln´ım z´aznamu.
Jak uˇz bylo naznaˇceno, pˇrepisy jsou zobrazov´any v komponentˇe Transcript jako HTML str´anka, do kter´e je tedy nutno cel´y seznam z´aznam˚u pˇrev´est. To se dˇeje velmi d˚umyslnˇe, kdyˇz souˇc´ast´ı konfigurace Transcriptu je jak´asi ˇsablona pro vytvoˇren´ı HTML str´anky a jednotliv´e ´udaje jsou do n´ı cyklicky vkl´ad´any. Upraven´ım ˇsablony je moˇzno zobrazovat i jin´e ´udaje neˇz jen pˇrepisy a t´ım, ˇze v ˇsablonˇe se defacto popisuje vzhled cel´e HTML str´anky, tak i v´ysledn´y vzhled m˚uˇze b´yt ´uplnˇe jin´y.
ˇ
Sablona, kterou definuje Transcript m´a tˇri ˇc´asti, respektive komponenta m´a krom jin´ych tyto tˇri argumenty:
• head hlavu - zde je ´uvodn´ı ˇc´ast HTML str´anky
• body tˇelo - tato ˇc´ast se ve str´ance namnoˇz´ı n-kr´at, kde n odpov´ıd´a poˇctu z´aznam˚u • foot patu - zde jsou posledn´ı ˇr´adky HTML str´anky
Pro zobrazen´ı pˇrepis˚u je jako nosn´y prvek na str´ance zvolena tabulka a zm´ınˇen´e tˇri ˇc´asti ˇsablony vypadaj´ı asi takto:
Hlava: <HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </HEAD>
<BODY bgcolor="#E0E0E0">
<TABLE border="0" cellpadding="1" cellspacing="2" width="100%"> Tˇelo:
<TR><TD><A name="\$start"></A></TD></TR> <TR>
<TD align="right" valign="top"><B>[\$timelabel]</B></TD> <TD align="left" bgcolor="\$bgcolor">
start=\$start/>">\$text</A> </TD> </TR> <TR><TD></TD><TD bgcolor="#C0C0C0"></TD></TR> Pata: </BODY> </HTML>
Toho, kdo ovl´ad´a jazyk HTML, mohou v pˇredchoz´ım pˇr´ıkladu, tedy konkr´etnˇe v ˇc´asti ”tˇelo“, zaujmout dvˇe pro standardn´ı HTML nezvykl´e vˇeci. Jednak nezn´am´e sch´ema - pro-tokol v odkazu elementu A a pak tak´e slova uvozen´a znakem dolaru
”$“.
Uˇz komponenta HTMLBrowser zav´ad´ı speci´aln´ı typ odkazu pouˇzit´y pouze v MBrowseru, jedn´a se o odkaz na zpr´avu. Je definov´ano kl´ıˇcov´e slovo
”imsg“, kter´e slouˇz´ı pro rozliˇsen´ı, ˇ
ze se nejedn´a o standardn´ı HTML odkaz. Syntaxe cel´eho odkazu je takov´ato: imsg:<message name="..." ...>
Po kliknut´ı na nˇejak´y odkaz zjiˇst’uje komponenta HTMLBrowser, o jak´y typ odkazu se jedn´a. M˚uˇze to b´yt bud odkaz do internetu, v takov´em pˇr´ıpadˇe dojde k otevˇren´ı prohl´ıˇzeˇce, nebo se jedn´a o skok na jin´e m´ısto v aktu´aln´ı str´ance, ten se pˇrirozenˇe provede, nebo je nale-zen speci´aln´ı odkaz
”imsg“. Tehdy HTMLBrowser nedˇel´a se str´ankou nic, nam´ısto toho vyˇsle zpr´avu do syst´emu, jak vypl´yv´a ze syntaxe. V uveden´em pˇr´ıkladˇe jde o synchronizaˇcn´ı zpr´avu jm´enem
”sync.transcript“, coˇz ˇr´ık´a, ˇze zpr´ava byla vysl´ana z nˇejak´e komponenty Transcript, zdroj
”manual“ naznaˇcuje pˇriˇcinˇen´ı uˇzivatele - logicky po kliknut´ı myˇs´ı. Po-sledn´ı argument zpr´avy ud´av´a ˇcas pro synchronizaci.
Dolarov´a notace je ˇcasto pouˇz´ıv´ana ve skriptovac´ıch jazyc´ıch, kde uvozuje promˇenn´e. T´ımto stylem se nechali inspirovat i autoˇri MBrowseru. Pˇri naˇc´ıt´an´ı z´aznam˚u pˇrepisu a generov´an´ı HTML str´anky pomoc´ı v´yˇse popsan´e ˇsablony se za promˇenn´e uvozen´e dolarem ”$“ dosazuj´ı hodnoty stejnojmenn´ych argument˚u z jednotliv´ych pˇrepis˚u.
Uˇz bylo ˇreˇceno, ˇze ˇc´ast
”tˇelo“ je ve v HTML str´ance pouˇzito pr´avˇe tolikr´at, kolik je z´aznam˚u v seznamu pˇrepis˚u. Pˇri generov´an´ı str´anky se postupuje tak, ˇze v ˇsablonˇe jsou nahrazeny vˇsechny promˇenn´e a takto prefabrikovan´y kus HTML k´odu je pˇrid´an jako dalˇs´ı ˇ
c´ast str´anky. Promˇenn´a \$start je nahrazena hodnotou argumentu start pr´avˇe zpra-cov´avan´eho uzlu <record>, stejnˇe jako promˇenn´a \$text je nahrazena textem obsaˇzen´ym v argumentu text adt.
Komponenta Transpript je d´ale napˇr´ıklad vyuˇzita pro zobrazen´ı odkaz˚u pˇri vyhled´av´an´ı kl´ıˇcov´ych slov v nahr´avce.
Za zm´ınku jeˇstˇe stoj´ı vyjmenovat zpr´avy, kter´e Transcript pˇrij´ım´a a zpracov´av´a:
• synchronizaˇcn´ı zpr´avy - v jejich d˚usledku se okno posouv´a tak, aby byl zobrazen pˇrepis, kter´y odpov´ıd´a tomu, co je pr´avˇe slyˇset a vidˇet na jin´ych komponent´ach • zpr´avy pro naˇc´ıt´an´ı z´aznam˚u s pˇrepisem - zdroj je bud textov´y ˇretˇezec se z´aznamy,
• zpr´avy pro vyhled´av´an´ı zobrazen´eho textu - str´anka se posune tam, kde se nach´az´ı hledan´y text
MediaPlayer
Tato velmi d˚uleˇzit´a komponenta zajiˇst’uje pˇrehr´av´an´ı videa, konkr´etnˇe nˇekter´y modul pro pˇrehr´av´an´ı dan´eho operaˇcn´ıho syst´emu. V MS Windows nejˇcastˇeji Windows media pla-yer, v Unixu napˇr´ıklad VLC nebo GStreamer. Zapouzdˇren´ı tohoto modulu do MBrowseru je realizov´ano pomoc´ı wxWidgets, konkr´etnˇe tˇr´ıdy wxMediaCtrl.
Nejvˇetˇs´ı slabinou t´eto komponenty je synchronizace. Dosavadn´ı koncepce je asi takov´a, ˇ
ze z´akladn´ı tempo pˇrehr´av´an´ı determinuje pr´avˇe MediaPlayer a ostatn´ı komponenty se mu podˇrizuj´ı, poruˇsuje tak z´akladn´ı koncept synchronizace pomoc´ı zpr´av. Vymyslet alternativn´ı ˇreˇsen´ı je vˇsak pomˇernˇe obt´ıˇzn´e. MediaPlayer napˇr´ıklad reaguje na zpr´avu o dokonˇcen´ı vytv´aˇren´ı vˇsech komponent po spuˇstˇen´ı MBrowseru, n´aslednˇe zaˇcne bufferovat a ˇcek´a dokud neobdrˇz´ı stanoven´y poˇcet zpr´av o dokonˇcen´ı bufferov´an´ı, to v pˇr´ıpadˇe kdyˇz je aktivn´ıch v´ıce MediaPlayer˚u.
V konfiguraˇcn´ım souboru je d´ale parametrizov´ano jak ˇcasto jsou vys´ıl´any synchronizaˇcn´ı zpr´avy. Obvykle je to doba jedn´e sekundy. Modul Timer, kter´y rozes´ıl´a synchronizaˇcn´ı zpr´avy, je souˇc´ast´ı tohoto pˇrehr´avaˇce. Mediaplayer na nˇe totiˇz nen´ı schopen reagovat tak, aby vˇse fungovalo plynule. Reaguje jen na zpr´avy vyvolan´e manu´alnˇe, tzn. start, stop, pause a samozˇrejmˇe skok na konkr´etn´ı m´ısto v nahr´avce.
Je tˇreba se zam´yˇslet jak ˇreˇsit situaci, kdy je nutn´e pˇrehr´avat jeden obraz z´aroveˇn sn´ıman´y ze tˇr´ı kamer. Dalˇs´ım znaˇcn´ym probl´emem je to, ˇze v cel´em syst´emu neexistuje pˇr´ıznak toho, zda se video v dan´em okamˇziku opravdu pˇrehr´av´a nebo je napˇr´ıklad poza-staveno.
Button
Komponenta Button pˇredstavuje obyˇcejn´e tlaˇc´ıtko, kter´e je zobrazen´e mezi ostatn´ımi viditeln´ymi komponentami v oknˇe MBrowseru. M´a urˇcenou velikost a pozici a sv˚uj nadpis. Slouˇz´ı vesmˇes k jedin´e vˇeci, a totiˇz inicializaci nˇejak´e akce. Za t´ımto ´uˇcelem je tˇreba v konfiguraˇcn´ım souboru nastavit argument onclick tak, ˇze se mu pˇriˇrad´ı text zpr´avy, kter´a bude vysl´ana do syst´emu po kliknut´ı. Zpr´avu odchyt´ı c´ılov´a komponenta, nebo komponenty a vykonaj´ı na jej´ım z´akladˇe dalˇs´ı akci.
TextBox
Dalˇs´ı vizu´aln´ı komponentou je TextBox, tedy textov´e pole. Slouˇz´ı k pˇrij´ım´an´ı textov´ych ˇretˇezc˚u od uˇzivatele, a ten je pak uchov´av´an ve vnitˇrn´ı promˇenn´e. Reaguje na zpr´avu SendMessage a to tak, ˇze vyˇsle dalˇs´ı zpr´avu a jako data k n´ı pˇripoj´ı pr´avˇe ˇretˇezec, kter´y obsahuje a kter´y pˇredt´ım uˇzivatel zadal. Konkr´etn´ı podoba zpr´avy, tedy hlavnˇe jej´ı jm´eno je opˇet nastaviteln´a v konfiguraˇcn´ım souboru. Spojen´ı komponent tlaˇc´ıtko a textov´y r´ameˇcek je nasnadˇe. Uˇzivatel edituje text v r´ameˇcku a posl´eze klikne na tlaˇc´ıtko, kter´e vys´ıl´a pr´avˇe jednu zpr´avu, konkr´etnˇe SendText.
URLGet
Pˇr´ıkladem nevizu´aln´ı komponenty je URLGet. Tato komponenta umoˇzˇnuje uˇzivateli nahr´at lok´aln´ı soubor nebo dokument ze vzd´alen´eho serveru, kter´y je urˇcen´y cestou a
jm´enem. Takto z´ıskan´a data poˇsle zpr´avou. Komponenta m´a dva konfiguraˇcn´ı argumenty - cestu ke zdroji dat a pˇredpis zpr´avy, ke kter´e budou data po z´ısk´an´ı pˇripojena. Kompo-nenta reaguje kromˇe zpr´avy get pro naˇcten´ı dat, tak´e na zpr´avy set, kter´ymi jde za bˇehu MBrowseru nastavit hodnoty konfiguraˇcn´ıch atribut˚u.
Pˇr´ıklad zˇretˇezen´ı komponent ve spolupracuj´ıc´ı funkˇcn´ı celek
Na obr´azku 2.5 je vidˇet pˇr´ıklad pouˇzit´ı komponent, chceme-li naˇc´ıst data s pˇrepisy z m´ısta specifikovan´eho uˇzivatelem za bˇehu MBrowseru.
Uˇzivatel vypln´ı pole s adresou, klikne na tlaˇc´ıtko, coˇz zp˚usob´ı odesl´an´ı poˇzadavku get spoleˇcnˇe s adresou komponentˇe URLGet, kter´a staˇzen´a data posl´eze pˇred´a pomoc´ı dalˇs´ı zpr´avy Transcriptu.
D˚uleˇzitou drobnost´ı pro tvoˇren´ı rozs´ahlejˇs´ıch konfiguraˇcn´ıch soubor˚u s mnoha objekty, jako jsou tlaˇc´ıtka a podobnˇe, kterou je tˇreba m´ıt na pamˇeti, je to, ˇze po kliknut´ı na nˇejak´e tlaˇc´ıtko je zpr´ava SendText doruˇcena vˇsem textov´ym pol´ım (v r´amci jedn´e skupiny). Po-kud bychom tedy neudˇelali ˇz´adn´e doplˇnkov´e opatˇren´ı, spustila by se lavina ud´alost´ı m´ısto p˚uvodnˇe zam´yˇslen´e jedn´e. T´ım doplˇnkov´ym opatˇren´ım je elegantn´ı vyuˇzit´ı argument˚u amsg, popsan´ych v´yˇse.
Chceme-li, aby jedno konkr´etn´ı textov´e pole reagovalo na stisknut´ı opˇet jednoho kon-kr´etn´ıho tlaˇc´ıtka, je tˇreba udˇelat n´asleduj´ıc´ı: tlaˇc´ıtku d´ame unik´atn´ı jm´eno v r´amci skupiny a textov´e pole nastav´ıme tak, aby pˇrij´ımalo zpr´avu SendText pouze od tohoto tlaˇc´ıtka. Podobnˇe lze nastavit i zbyl´e komponenty tak, aby byli prov´az´any jedna k jedn´e.
Pˇr´ıklad:
<button name="unique_button" ... onclick="<message name="sendText"/>" ... /> <textbox name="unique_textbox" ... amsg=".*unique_button:sendText" ... />
tlaˇc´ıtko klik
<message name=”poˇsli text”/>
textov´e pole poˇsli text editace textu
stahuj
<message name=”stahuj” url=”http://server.cz/soubor”/>
staˇzen´ı dat
transcript
<message name=”nacti” data=”...”/>
naˇcten´ı dat a zobrazen´ı
Kapitola 3
Funkce zpˇ
etn´
e vazby v MBrowseru
V t´eto ˇc´asti je pops´ano, co bylo pˇrid´ano a jak byl MBrowser vylepˇsen tak, aby uˇzivatel mohl upravovat pˇrepis z rozpozn´avaˇce.
3.1
Vestavˇ
en´
y www browser
Prvn´ım n´apadem jak realizovat zad´an´ı bylo pˇrepracovat v´ychoz´ı komponentu HTMLBrowser tak, aby nebyla postavena na wxHtmlWindow, ale na nˇejak´em jin´em modulu, kter´y je plno-hodnotn´ym prohl´ıˇzeˇcem. To by umoˇznilo implementovat ˇreˇsen´ı tohoto zad´an´ı napˇr´ıklad v JavaScriptu uvnitˇr takov´eho prohl´ıˇzeˇce. V JavaScriptu by se naprogramovalo jak uˇzivatelsk´e rozhran´ı, tak i komunikace se vzd´alen´ym serverem. Znamenalo by to zapojit do projektu vestavˇen´y web prohl´ıˇzeˇc, coˇz se po mnoh´ych pokusech a d˚ukladn´em zkoum´an´ı uk´azalo jako pˇr´ıliˇs rozs´ahl´y a n´aroˇcn´y krok, vzhledem k faktu, ˇze zad´an´ım pr´ace bylo vlastnˇe nˇeco jin´eho. Podobn´a komponenta, kter´a by v sobˇe zapouzdˇrovala prohl´ıˇzeˇc a poskytovala k mˇenu nˇejak´e univerz´aln´ı rozhran´ı napˇr´ıˇc platformami, a jak´a byla pouˇzita pro vytvoˇren´ı
MediaPlayeru, ve wxWidgets, neexistuje. Takov´a moˇznost, kdy se v r´amci nˇejak´eho okna spouˇst´ı vlastnˇe extern´ı aplikace, je pro potˇreby komponenty Transcript nedostaˇcuj´ıc´ı, jelikoˇz jej´ı chov´an´ı potˇrebujeme upravit - derivovat z hotov´eho prohl´ıˇzeˇce vlastn´ı tˇr´ıdu a rozˇsiˇrovat ji.
Bylo tedy tˇreba hledat takov´y prohl´ıˇzeˇc, kter´y je pˇrenositeln´y a poskytuje rozhran´ı pro embedding - vloˇzen´ı do jin´e aplikace. Kromˇe pˇrenositelnosti, je tak´e tˇreba m´ıt na pamˇeti i podm´ınky licence. Nejenom z tohoto d˚uvodu je tedy pouˇzit´ı MS Internet Exploreru nere´aln´e. Po nemal´em p´atr´an´ı a nejedn´e konzultaci jsem dospˇel ke dvˇema moˇzn´ym ˇreˇsen´ım -Safari alias wxWebKit a Firefox (dˇr´ıve Mozilla) alias wxMozilla.
C´ılem projektu wxWebKit [6] je zpˇr´ıstupnit WebKit (j´adro prohl´ıˇzeˇce Safari) v MS Win-dows a v Linuxu prostˇrednictv´ım knihovny wxWidgets. Safari je internetov´y prohl´ıˇzeˇc prvotnˇe vyv´ıjen´y pro poˇc´ıtaˇce Apple Macintosh, jeho zdrojov´y k´od je otevˇren´y a existuj´ı verze i pro jin´e platformy.
WxWebKit je vyv´ıjen souˇcasnˇe s WebKitem a jak se p´ıˇse na str´ank´ach tohoto projektu, tak tento v´yvoj postupuje dopˇredu pomalu, ale jistˇe. Postup instalace je, zhruba asi takov´y, ˇze je tˇreba st´ahnout cel´y projekt WebKit a zkompilovat ho pro pouˇzit´ı jako wxWebKit. Nejdˇr´ıve je tˇreba nainstalovat vˇsechny z´avislosti, tzn. vˇsechen prerekvizitn´ı software, vˇcetnˇe wxWidgets zkompilovan´ymi s doplˇnkov´ymi pˇrep´ınaˇci. Po velk´em ´usil´ı a dlouh´e dobˇe jsem nainstaloval vˇse potˇrebn´e a st´ahl aktu´aln´ı verzi wxWebKitu a i ten se mi nakonec podaˇrilo zkompilovat, spustit vˇsak uˇz ne, aˇckoli jsem postupoval podle n´avodu.
Vzdal sem pr´aci s t´ımto projektem a vˇenoval se wxMozilla [5]. Po kr´atk´em hled´an´ı v internetov´ych zdroj´ıch sem zjistil, ˇze v´yvoj toho projektu se zastavil v polovinˇe roku 2005! Pot´ykal jsem se s obdobn´ymi probl´emy jako v pˇredchoz´ım pˇr´ıpadˇe. Na rozd´ıl od wxWebKitu, kter´y se mi v souˇcasn´e dobˇe zd´a jako pˇr´ıliˇs mlad´y - jeˇstˇe ve v´yvoji, se wxMozilla uk´azal jako mrtv´y projekt, jehoˇz z´avislosti pˇredpokl´adaj´ı pˇr´ıtomnost prohl´ıˇzeˇce Mozilla, jehoˇz v´yvoj byl pˇred ˇcasem ukonˇcen. Tuto knihovnu se mi nepodaˇrilo zkompilovat.
Po dohodˇe s vedouc´ım jsem se pokusil vˇec ˇreˇsit vestavˇen´ım Firefoxu do tohoto projektu vlastn´ımi silami. Jedn´a se o vestavˇen´ı j´adra prohl´ıˇzeˇce jm´enem Gecko nebo sp´ıˇse vestavˇen´ı frameworku - (syst´emu, ˇci r´amce) pro Gecko, kter´y se jmenuje
GRE(Gecko Runtime Environment) a to s pouˇzit´ım XPCOM, coˇz je pˇrenositeln´a objektov´a technologie (podobn´a COM na MS Windows), pouˇzit´a k zobecnˇen´ı vytvoˇren´ı, vlastnˇen´ı a ruˇsen´ı objekt˚u a jin´ych dat v cel´em Firefoxu [3].
V souˇcasn´e dobˇe neexistuje ˇz´adn´y
”vestavovac´ı soubor n´astroj˚u“, tedy jak´asi minim´aln´ı knihovna, kterou by program´ator mohl snadno a pohodlnˇe pouˇz´ıt pro vestavˇen´ı. Tv˚urci prohl´ıˇzeˇce na n´ı sice pracuj´ı, ale to urˇcitˇe jeˇstˇe nˇejak´y ˇcas potrv´a. Opˇet bylo tˇreba st´ahnout vˇsechny zdrojov´e k´ody, splnit rozliˇcn´e z´avislosti a vˇse ruˇcnˇe zkompilovat. Na rozd´ıl od WebKitu bylo vˇse snazˇs´ı a podaˇrilo se prohl´ıˇzeˇc zkompilovat a zprovoznit. Ot´azka vestavˇen´ı vˇsak t´ımto nebyla zdaleka vyˇreˇsena.
Po dalˇs´ım dlouh´em zkoum´an´ı a zkouˇsen´ı jsem zjistil, ˇze pro embedding v Linuxu se ˇcasto pouˇz´ıv´a nadstavbov´a knihovna pro GKT (soubor n´astroj˚u pro tvorbu grafick´eho uˇzivatelsk´eho rozhran´ı). Pro MS Windows tu je moˇznost pouˇzit´ı Active X a existuje i alternativa pro Macintosh. Jelikoˇz pracuji v Linuxu zkompiloval se mi pˇr´ıklad pouˇz´ıvaj´ıc´ı pr´avˇe GKT, coˇz pro mˇe nebylo zvl´aˇstn´ım pˇr´ınosem, protoˇze zapouzdˇrovat opˇet toto do wxWidgets je dalˇs´ı komplikac´ı, kter´a by nav´ıc pop´ırala pouˇzit´ı wxWidgets jinde neˇz v linuxu.
Mezi staˇzen´ymi zdrojov´ymi k´ody jsem nalez pˇr´ıklad pro wxWidgets, byl vˇsak urˇcen pro MS Windows a tak se nezkompiloval. Pokusil jsem se ho pouˇz´ıt, avˇsak marnˇe. Mnoh´e materi´aly dostupn´e na str´ank´ach [3] t´ykaj´ıc´ıch se vestavˇen´ı jsou silnˇe neaktu´aln´ı. Zjistit s jak´ymi parametry kompilovat a proti jak´ym knihovn´am linkovat aplikaci s vestavˇen´ym prohl´ıˇzeˇcem je bez funkˇcn´ıho pˇr´ıkladu opravdu oˇr´ıˇsek. I kdyˇz jsem postupoval podle n´avod˚u, nepodaˇrilo se mi zprovoznit ani pˇr´ıklad pro MS Windows ani vytvoˇrit vlastn´ı.
Vr´atil jsem se k b´ad´an´ı nad nefunkˇcnost´ı wxMozilla a porovn´aval ho s pˇr´ıkladem pro wxWidgets. Zjistil jsem sem, ˇze v pˇr´ıkladu pro Windows oproti wxMozilla ˇc´ast inicia-lizaˇcn´ıho k´odu chyb´ı. Posb´ıral jsem tedy stˇr´ıpky informac´ı ze vˇsech prostudovan´ych zdroj˚u a pokusil se vytvoˇrit testovac´ı aplikaci s pouˇzit´ım k´odu z wxMozilla. To se mi koneˇcnˇe podaˇrilo, ´uspˇeˇsnˇe jsem inicializoval j´adro Firefoxu a vytvoˇril okno ve wxWidgets, kter´e obsahovalo budouc´ı prohl´ıˇzeˇc.
K tomu, aby vznikla pouˇziteln´a aplikace bylo vˇsak zapotˇreb´ı mnohem v´ıce, totiˇz imple-mentovat vˇsechno to, co umˇela wxMozilla. Nestaˇc´ı jen vytvoˇrit okno, ale je nutn´e ho tak´e prov´azat s celou aplikac´ı. Tento ´ukol by podle m´eho soudu vydal na samostatn´e zad´an´ı a m´ym ´ukolem bylo nˇeco zcela jin´eho, proto jsem upustil od snahy vestavˇet webov´y prohl´ıˇzeˇc do MBrowseru a soustˇredil jsem se na vylepˇsen´ı existuj´ıc´ı komponenty Transcript.
3.2
Rozˇ
s´ıˇ
ren´ı komponenty Transcript
Poˇzadavkem bylo nˇejak´ym zp˚usobem editovat vˇety pˇrepisu z rozpozn´avaˇce. Byla zvolena jednoduch´a koncepce - uˇzivatel klikne napˇr´ıklad stˇredn´ım tlaˇc´ıtkem na jeden konkr´etn´ı pˇrepis, naˇceˇz se zobraz´ı dialog pro ´upravu toho textu a po dokonˇcen´ı editace uˇzivatel zmˇenu potvrd´ı a nov´y text se zap´ıˇse na m´ısto p˚uvodn´ıho. Uˇzivatel mus´ı m´ıt moˇznost editaci
pˇreruˇsit. wxHtmlWindow neposkytuje ˇz´adn´y zp˚usob jak by uˇzivatel mohl editovat zobrazen´y text. Je tˇreba pouˇz´ıt dalˇs´ı tˇr´ıdy, kter´e takovou vlastnost zprostˇredkuj´ı.
Zde se vyskytl prvn´ı zpoˇc´atku neviditeln´y probl´em. Jak bylo pops´ano v jedn´e z pˇ redcho-z´ıch ˇc´ast´ı na odkaz v komponentˇe wxHtmlWindow nelze kliknout pouze stˇredn´ım tlaˇc´ıtkem myˇsi. Po mnoha pokusech, jsem zvolil jinou kombinaci uˇzivatelsk´ych akc´ı, kter´e vyvolaj´ı dialog pro ´upravu textu: souˇcasn´e kliknut´ı stˇredn´ıho tlaˇc´ıtka a jeˇstˇe lev´eho nebo prav´eho, nebo kombinaci kl´avesy
”Ctrl“ a kliknut´ı lev´eho nebo prav´eho tlaˇc´ıtka myˇsi.
V r´amci komponenty Transcript bylo zapotˇreb´ı rozˇs´ıˇrit funkˇcnost virtu´aln´ı metody OnLinkClicked. Ta byla v komponentˇe HTMLBrowser pˇreps´ana na nevirtu´aln´ı a zast´ınila svoj´ı zdˇedˇenou metodu OnLinkClicked z wxHtmlWindow. To bylo zapotˇreb´ı, aby nedoch´azelo k implicitn´ımu spouˇstˇen´ı extern´ıho prohl´ıˇzeˇce, pˇri kliknut´ı na odkaz do s´ıtˇe internet.
V metodˇe OnLinkClicked definovan´e v r´amci Transcriptu byla tedy pˇrid´ana sekce pro zachycen´ı v´yˇse popsan´ych kombinac´ı klik˚u a pˇr´ıpadnˇe kl´aves. Aˇckoli tato metoda nen´ı vol´ana pˇri kliknut´ı na odkaz v wxHtmlWindow stˇredn´ım tlaˇc´ıtkem, tak kdyˇz je kliknuto prav´ym nebo lev´ym tlaˇc´ıtkem, tak informace o tom, zda je stˇredn´ı tlaˇc´ıtko tak´e stisknuto, jsou kupodivu dostupn´e.
Aby bylo moˇzno editaˇcn´ı dialog zobrazit ve vhodn´em m´ıstˇe nad komponentou Transcript, bylo tˇreba zjistit souˇradnice textu - HTML odkazu - vˇety pˇrepisu nejdˇr´ıve v r´amci t´eto kom-ponenty a posl´eze je pˇrepoˇc´ıtat na celou pracovn´ı plochu.
Zjistit souˇradnice tohoto textu se opˇet uk´azalo jako sloˇzitˇejˇs´ı, neˇz by se na prvn´ı pohled mohlo zd´at. Pˇri vykon´av´an´ı funkce OnLinkClicked m´a program´ator k dispozici ukazatel na objekt reprezentuj´ıc´ı kliknut´y HTML odkaz. Je moˇzn´e zjistit jeho pozici a velikost. Tato pozice je vˇsak relativn´ı vzhledem k nadˇrazen´e buˇnce, nikoli k cel´emu wxHtmlWindow. Pˇri parsov´an´ı - naˇc´ıt´an´ı HTML str´anky do tohoto objektu se z HTML k´odu vytv´aˇr´ı jak´asi hierarchie bunˇek, kter´e mohou obsahovat dalˇs´ı buˇnky a aˇz na nejniˇzˇs´ı ´urovni obsahuj´ı nˇejak´y HTML element. Struktura tˇechto bunˇek vˇsak nekoresponduje s DOM (Document Object Model).
Napˇr´ıklad, je-li na str´ance zobrazena tabulka a v jedn´e buˇnce t´eto HTML tabulky je odkaz, d´ale pak, kdyˇz program´ator m´a k dispozici referenci na objekt reprezentuj´ıc´ı tento odkaz, tak teoreticky tˇret´ı rodiˇcovsk´y objekt zm´ınˇen´eho odkazu by mˇel odpov´ıdat cel´e tabulce. Rodiˇcem odkazu je buˇnka tabulky, jej´ım rodiˇcem je ˇr´adek, a tˇret´ım rodiˇcem je cel´a tabulka. Tˇr´ıda wxHtmlWindow vytv´aˇr´ı vlastn´ı hierarchii, o n´ıˇz jsem se v dokumentaci nic nedoˇcetl a tak nezb´yvalo, ˇze pˇribliˇzn´e poziˇcn´ı parametry objevit zkouˇsen´ım.
Komponentˇe Transcript toto ˇreˇsen´ı bohuˇzel ub´ır´a na obecnosti, nicm´enˇe nevid´ım jin´eho v´ychodiska, jak potˇrebn´e souˇradnice zjistit.
Vˇsechny doposud popsan´e ´ukony se odehr´avaj´ı ve vizu´aln´ıˇc´asti komponenty Transcript. Z´ıskan´e ´udaje o pˇrepisu, kter´y je urˇcen ˇcasem spuˇstˇen´ı (argument start) a souˇradnice v r´amci okna, jsou odesl´any lok´aln´ı zpr´avou do nevizu´aln´ı ˇc´asti komponenty, kde dojde k jejich zpracov´an´ı. To se dˇeje ve funkci FeedbackRaise.
Zde jsou souˇradnice pˇrepoˇc´ıt´any na celou prcovn´ı plochu a v dan´em m´ıstˇe zobrazeno mod´aln´ı okno, kter´e obsahuje textov´e pole, kter´e je pˇredvyplnˇeno dosavadn´ım textem. Toto okno je vytvoˇreno pomoc´ı derivovan´e tˇr´ıdy z wxDialog a textov´e pole pomoc´ı tˇr´ıdy zaloˇzen´e na wxTextCtrl. Bylo tˇreba doplnit odchyt´av´an´ı kl´aves Enter a Escape, prvn´ı ukonˇc´ı editaci a zmˇeny uloˇz´ı do pamˇeti, druh´a kl´avesa znamen´a ukonˇcen´ı a zahozen´ı zmˇen.
Text z pˇrepisu, kter´y je pˇred´an k editaci je nejprve vyhled´an v z´aznamech pomoc´ı vyhled´avac´ı metody tˇr´ıdy RecordList, krit´eriem je shoda argumentu start. Doˇslo-li ke zmˇen´am v tomto textu, je uloˇzen zpˇet do patˇriˇcn´eho z´aznamu v RecordListu. To samo o sobˇe jeˇstˇe nem´a za n´asledek viditelnou zmˇenu tohoto textu pro uˇzivatele.
Obsah Recordlistu je pˇrev´adˇen na HTML str´anku a pak naˇcten pomoc´ı metody z wxHtmlWindow pouze jednou, pˇri inicializaci cel´e komponenty. Dluˇzno dodat, ˇze takto vznikl´a str´anka je pomˇernˇe velik´a (samotn´e pˇrepisy maj´ı znaˇcn´y objem) a tˇr´ıdˇe wxHtmlWindow trv´a notnou chv´ıli neˇz ji naˇcte. Proto, aby i uˇzivatel uvidˇel zmˇenu po editaci a z´aroveˇn ne-bylo nutn´e generovat celou HTML str´anku z RerodListu, je tento text nahrazen zvl´aˇst’ RerodListuu a zvl´aˇst’ v HTML str´ance. Bohuˇzel tato optimalizace pˇrin´aˇs´ı jen nepatrn´e zrychlen´ı, protoˇze wxHtmlWindow mus´ı naˇc´ıst str´anku stejnˇe znovu celou.
3.3
Pr´
ace se z´
aznamy pˇ
repis˚
u
Sch´ema komponent, uveden´e jako pˇr´ıklad 2.5, bylo pouˇzito jako prostˇredek pro automatick´e stahov´an´ı aktualizovan´ych pˇrepis˚u ze serveru.
Samotn´e naˇc´ıt´an´ı jak´ychkoli dat do MBrowseru je vˇsak ponˇekud problematick´e. Uˇz v pˇredeˇsl´e ˇc´asti bylo ˇreˇceno, ˇze bylo tˇreba ˇreˇsit probl´emy s k´odov´an´ım. Z´aludnost t´eto chyby tkv´ı v tom, ˇze pod operaˇcn´ım syst´emem MS Windows je vˇse v poˇr´adk˚u, ale v Linuxu se zobrazovaly textov´e pˇrepisy s chybami - znaky s diakritikou se vypisovaly ´uplnˇe ˇspatnˇe. Nejdˇr´ıve jsem si myslel, ˇze probl´em je ve zdrojov´ych datech, pozdˇeji sem zkouˇsel upravo-vat hlaviˇcku (konkr´etnˇe metainformaci o k´odov´an´ı) HTML st´anky, kter´a je zobrazov´ana v Transcriptu, naˇceˇz sem zjistil, ˇze ta je ´uplnˇe ignorov´ana.
Probl´em se nach´az´ı v samotn´em j´adˇre prohl´ıˇzeˇce, v modulu, kter´y je pouˇz´ıv´an k naˇc´ıt´an´ı jak´ychkoli dat ze soubor˚u i internetu do MBrowseru. Podle toho, co mi bylo ˇreˇceno o historii MBrowseru, byl v´yvoj tohoto projektu zah´ajen s ANSI verz´ı wxWidgets, kde staˇc´ı m´ıt zdrojov´e soubory k´odov´any v lok´aln´ım k´odov´an´ı uˇzivatelsk´eho prostˇred´ı a vˇse se zobrazuje jak m´a. S pˇrechodem na UNICODE verzi wxWidgets bylo tˇreba u vˇsech naˇc´ıtan´ych ˇretˇezc˚u pˇrev´est jakousi
”filtraci“ - pˇrevod z obyˇcejn´eho ˇretˇezce znak˚u do ˇretˇezce pouˇz´ıvan´eho v r´amci wxWidgets. Jeli ˇretˇezec korektnˇe naˇcten do wxString, zobrazuje se jiˇz vˇse jak m´a.
Pr´ace s ˇretˇezci v r˚uzn´em k´odov´an´ı, pr´ace s tˇr´ıdami pro ˇretˇezce ve wxWidgets a pr´ace s datov´ymi
”streamy“ - proudy je pomˇernˇe znaˇcnˇe komplikovan´a. V kombinaci s, podle m´eho n´azoru, mal´ymi schopnostmi a nespolehlivost´ı tˇr´ıdy wxURL, pouˇzit´e jako z´aklad pro naˇc´ıt´an´ı dat v MBrowseru je to do budoucna beznadˇejn´e. Aby bylo moˇzn´e naˇc´ıtat data v libovoln´em k´odov´an´ı, bylo by zapotˇreb´ı pˇrepracovat naˇc´ıt´an´ı dat v MBrowseru od z´akladu.
3.4
Komunikace se vzd´
alen´
ym serverem
Dalˇs´ı souˇc´ast´ı zad´an´ı bylo to, aby MBrowser dok´azal uˇzivatelem opraven´y pˇrepis odeslat na vzd´alen´y server. Pˇredpokladem pro to byly dvˇe vˇeci, jednak pˇrev´est pˇrepisy z RecordListu do textov´eho ˇretˇezce a tento pak odeslat.
Extrakce dat z objektu tˇr´ıdy RecordList byla, snad jako jedin´a vˇec z tohoto projektu, snadn´a. K tˇr´ıdˇe RecordList jsem pˇridal metodu, kter´a projde vˇsechny z´aznamy seznamu a u kaˇzd´eho pak vˇsechny argumenty a postupnˇe je uloˇz´ı do ˇretˇezce jako XML text. Zvolen´ym v´ystupn´ım k´odov´an´ım je UTF-8. Pˇrevod ˇretˇezce z wxString na standardn´ı ˇretˇezec znak˚u z jazyka C (char *) nebo std::string jazyka C++ je trivi´aln´ı s pouˇzit´ım spr´avn´e konverzn´ı funkce, kterou nab´ız´ı wxString.
Odesl´an´ı takto pˇripraven´ych dat na vzd´alen´y server vˇsak opˇet znamenalo pˇrekonat dalˇs´ı komplikace. Zm´ınˇen´a tˇr´ıda wxURL, kterou MBrowser pouˇz´ıv´a k z´ısk´av´an´ı dat, neposkytuje rozhran´ı pro z´apis do souboru, potaˇzmo odes´ıl´an´ı dat do internetu. Abych zachoval zvolenou koncepci MBrowseru, tedy pouˇzit´ı protokolu HTTP, zvolil jsem pro ukl´ad´an´ı dat pouˇzit
tˇr´ıdu wxHTTP. Jak jej´ı n´azev napov´ıd´a, slouˇz´ı ke komunikaci po socketech pomoc´ı protokolu HTTP. Umoˇzˇnuje odes´ılat poˇzadavky na vzd´alen´y server jak pomoc´ı metody GET, tak i POST. Druh´a moˇznost je pr´avˇe ta, pomoc´ı kter´e se d´a XML pˇrepis odeslat na server. Kromˇe samotn´ych dat k odesl´an´ı bylo tˇreba spr´avnˇe nastavit hlaviˇcku odes´ılan´eho poˇzadavku [10] [15].
Zvolil sem tento zp˚usob:
Content-Type: text/xml; charset=utf-8 Connection: close
Tedy pˇredat data na konci dotazu, tak jak jsou, bez ˇz´adn´ych dodateˇcn´ych form´atovac´ıch znaˇcek a podobnˇe. Connection: Close umoˇzˇnuje synchronn´ı komunikaci, tzn najednou odeslat data a pak ˇc´ıst odpovˇed’ ze secketu jako ze souboru, dokud nebudou pˇreˇctena vˇsechna data - dostaneme se na konec souboru.
Data se bohuˇzel takto nedala odeslat, po dlouh´em testov´an´ı, odchyt´av´an´ı HTTP packet˚u a hled´an´ı pˇr´ıˇciny jsem dospˇel k z´avˇeru, ˇze tˇr´ıda wxHTTP si neum´ı poradit s vˇetˇs´ım mnoˇzstv´ım pˇriloˇzen´ych dat, neˇz je pˇribliˇznˇe 10kB (kilo byte).
Po konzultaci mi vedouc´ı m´e pr´ace doporuˇcil knihovnu Asio [1], kter´a zprostˇredkov´av´a komunikaci hlavnˇe na protokolech TCP/IP a na rozd´ıl od tˇr´ıdy wxURL nebo wxHTTP nepo-skytuje program´atorovi tak abstraktn´ı rozhran´ı, kde staˇc´ı napˇr´ıklad jen zadat URL adresu zdroje a na v´ystupu oˇcek´avat pˇrijat´a data. Pˇri pouˇzit´ı knihovny Asio je tˇreba ruˇcnˇe - po-stupnˇe zavolat funkce pro vytˇren´ı socketu, pˇripojen´ı ke vzd´alen´emu serveru, zaps´an´ı zpr´avy do socketu a n´aslednˇe pˇreˇcten´ı odpovˇedi. Samotnou zpr´avu je tak´e tˇreba napsat ruˇcnˇe, tzn vytvoˇrit poˇzadavek podle protokolu HTTP a pˇrijatou zpr´avu opˇet podle standardu HTTP rozkl´ıˇcovat. I proto, ˇze je tato tematika pˇredmˇetem v´yuky na naˇs´ı ˇskole, a kdyˇz jsem se nav´ıc mohl spolehnout na dobrou dokumentaci a pˇr´ıklady ke knihovnˇe Asio a hlavnˇe jej´ı funkˇcnost podaˇrilo se mi odes´ıl´an´ı dat na server implementovat.
Tato funkcionalita je souˇc´ast´ı tˇr´ıdy RecordList konkr´etnˇe nov´e metody ExportXMLFile. Zp˚usob odes´ıl´an´ı opraven´eho pˇrepisu v r´amci cel´eho MBrowseru je navrˇzen takto: podobnˇe jako pˇri stahov´an´ı pˇrepis˚u m´a uˇzivatel k dispozici textov´e pole, kde specifikuje cestu k c´ıli pro odesl´an´ı a po kliknut´ı na patˇriˇcn´e tlaˇc´ıtko se cesta odeˇsle zpr´avou komponentˇe Transcript, kter´a odeˇsle data pomoc´ı metody ExportXMLFile sv´e vnitˇrn´ı instance tˇr´ıdy RecordList.
Proto, aby na server nemohly odes´ılat data neopr´avnˇen´e osoby, je k odes´ılan´ym dat˚um v hlaviˇcce zpr´avy pˇripojena z´akladn´ı HTTP autentizace.
Pˇr´ıklad zad´an´ı tˇechto ´udaj˚u:
http://uˇzivatelsk´e_jm´eno:[email protected]/cesta/dokument
Tˇr´ıdu wxURL a wxHTTP jsem pouˇzil, pouze k anal´yze uˇzivatelem zadan´e URL k c´ıli, respektive k vygenerov´an´ı z´akladn´ıho autentizaˇcn´ıho k´odu z pˇrihlaˇsovac´ıho jm´ena a hesla.
3.5
Sklad pˇ
repis˚
u
K tomu, aby mˇel MBrowser kam odes´ılat data a odkud je stahovat, bylo zapotˇreb´ı vy-tvoˇrit server, kter´y by byl schopen komunikovat prostˇrednictv´ım protokolu HTTP, upraven´e pˇrepisy pˇrij´ımat, archivovat a nab´ızet ke staˇzen´ı dalˇs´ım uˇzivatel˚um.