• No results found

Spraakmaker user interface

N/A
N/A
Protected

Academic year: 2021

Share "Spraakmaker user interface"

Copied!
56
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

Spraakmaker user interface

Citation for published version (APA):

Verstegen, J. F. H., & van Asten, A. C. M. (1992). Spraakmaker user interface. (IPO rapport; Vol. 865). Instituut voor Perceptie Onderzoek (IPO).

Document status and date: Gepubliceerd: 27/08/1992

Document Version:

Uitgevers PDF, ook bekend als Version of Record

Please check the document version of this publication:

• A submitted manuscript is the version of the article upon submission and before peer-review. There can be important differences between the submitted version and the official published version of record. People interested in the research are advised to contact the author for the final version of the publication, or visit the DOI to the publisher's website.

• The final author version and the galley proof are versions of the publication after peer review.

• The final published version features the final layout of the paper including the volume, issue and page numbers.

Link to publication

General rights

Copyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright owners and it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights. • Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain

• You may freely distribute the URL identifying the publication in the public portal.

If the publication is distributed under the terms of Article 25fa of the Dutch Copyright Act, indicated by the “Taverne” license above, please follow below link for the End User Agreement:

www.tue.nl/taverne Take down policy

If you believe that this document breaches copyright please contact us at: openaccess@tue.nl

(2)

Instituut voor Perceptie Onderzoek

Postbus 513, 5600 MB Eindhoven

Rapport no. 865

Spraakmaker user interface

J.F.H.

Verstegen

en A.C.M. van Asten

(3)

Spraakmaker

User

Interface

verslag van het afstudeerwerk

1n samenwerking met Mw A. van Asten verricht op het

Instituut voor Perceptie Onderzoek

te

Eindhoven

1n het kader van

de deeltijdopleiding Hogere Informatica aan de

HOGESCHOOL EINDHOVEN

Bedrijfsmentor: Dr. Ir. H.C. van Leeuwen Studiementor: Ir. A.A.J.M. van den Hocven

J .F.H. Verstegen, Maasbree, juli 1991

(4)

Spraakmaker User Interface

Inhoud

Hoofdstuk 1: Inleiding . . . 1 1.1: Spraakonde:rzoek . . . 1 1.2: Uitgangssituatie . . . 2 1.2.1: Hardware . . . 2 1.2.2: Software . . . 2

1.2.2.1: Het prindpe va Spraakmaker ... 3

1.2.2.2: De Giid . . . 4 1.3: Onze taken . . . . . . 5 1.3.1: Tonen en manipuleren . . . 5 1.3.2: Plaatsin.gsalgolitme . . . 6 1.3.3: Giid-ed.itor . . . 6 1.3.4: Interface-besturing . . . 6 1.3.5: Koppeling . . . 7 1.4: Implementatie mogelijkheden . . . . . . 7 1.4.1: Systeemprogrammatuur ... 7 1.4.2: X-Wmdows . . . . . . . . . 7 1.5: Het verslag . . . . . . . 10 Hoofdstuk 2: De Grid-editor . . . 11 2.1: Theoretisch ontwerp . . . . . . . . 11 2.1.1: Gewenste mogelijkheden . . . . . . 11 2.1.2: Het gebru.ik . . . . . . . . 11 2. 1.2.1: Selecteren . . . . . 12 2.1.2.2: Tekstinvoer . . . . . . 13 2.1.2.3: Correcties . . . . . . . . . . . . . . . . . . . . . . 13 2.1.3: mogelijke oplossing . . . . . . . . . . . . 13 2.2: Ontwerpen Window . . . . . . 15

2.3: Tonen van de Grid . . . . . . 16

2.4: Evaluatie van events . . . 18

2.5: Reactie op de events . . . 19

2.5.1: Indrukken van muisknop . . . 20

2.5.1.1: Bepaal gewenste actie . . . 20

2.5.1.2: Herstel van de oude toestand ... 21

2.5.1.3: .A1maken eerder geselecteerde actie ... 21

2.5.2: Bewegen van de muis . . . 22

2.5.2.1: Wijziging van datum of token ... 22

2.5.2.2: (Ont)koppelen van syncmarker ... 23

(5)

Spraakmaker User Intertace Inhoud

2.5.3.1: Wijziging van datum of teken ... . 24

2.5.3.2: Invoeging van een teken ... . 25

2.5.3.3: (Ont)koppelen van syncmarkers ... . 25

2.5.4: Invoer vanaf toetsenbord 26 2.5.5: OVerige gebruikteevents ... . 28

2.5.5.1: Binnenkomen in window ... . 28

2.5.5.2: Verlaten window ... . 28

2.5.5.3: Verandering in zichtbaarheid van het window ... . 28

2.5.5.4: ConfigweNotify ... . 28

2.6: Verwerking van wijzigingen ... . 29

2.6.1: Wijziging van datum of token(s) ... . 29

2.6.2: Wijziging van syncmarkers ... . 30

Hoofdstuk 3: Koppeling ... . 31

3.1: User Interface modules onderling ... . 31

3.1.1: Dataoverdracht ... . 31

3.1.2: Coördinatie van events ... . 31

3.1. 3: Communicatie probleem ... . 33

3.2: Interface aan PROLOG ... . 34

3.2.1: Dataoverdracht ... . 34 3.2.2: Communicatie mechanisme ... . 35 Hoofdstuk 4: Conclusies . . . .. 36 4.1: Samenwerking ... . 36 4.2: Ervaringen ... . 36 4.3: Aanbevelingen ... . 38 Bijlagen 41 A: De opdracht 41 B: Het IPO ... . 42

C: Het X-Window pakket ... . 43

D: De events ... . 44

E: Termen ... . 46

(6)

Spraakmaker User Inter.face Inleicüng: spraakonderzoek

Hoofdstuk 1: Inleiding

1.1 Spraakonderzoek

Onlangs •communiceerde• een oudere dame met een automatische telefoonbeantwoorder: "Kunt u (de beantwoorder) hem (de eigenaar) even zeggen, dat hij mij terug moet bellen•. Deze kennelijke :m1svatt:ing over de huidige mogelijkheden vcm zo'n apparaat is minder komisch dcm het lijkt. Als eenmaal gekozen is voor automaten van velerlei soort, dan is het de taak van de ontwerpers er voor te zorgen, dat de automaten zonder voorkennis gebruikt kunnen worden, dat zij zich dus gedragen zoals een leek op het gebied van de interne werking van zulke automaten mag verwachten.

De verwezenlijking van een dergelijke taak schept vele problemen. Voordat een automaat een persoon als communicatiepartner kan vervangen, moet onder andere een analyse plaatsvinden van de ontvangen spraak en een ter zake tekst weer in spraak omgezet worden.

Ten einde de kennis van spraak, en in het bijzonder het omzetten van geschreven tekst in spraak, een flinke stap voorwaarts te brengen, werd ruim 5 jaar geleden, geïnitieerd door SPIN (Stimulenngs Programma JNformaticaonderzoek), een landelijk gecoörcüneerd

onderzoekprogramma ASSP (Analyse en Synthese van SPraak) gestart. In dit programma werkten een zestal, meestal aan universiteiten verbonden, onderzoekinstituten samen. Elk instituut nam een deel van het noodzakelijke onderzoek voor zijn rekening. Als resultaat van deze onderzoeken zijn op de divezse instituten afgeronde gedeelten van

computerpro-gramma's (modules) gerealiseerd, die tezamen een systeem opleveren, Spraakmaker geheten, dat geschreven tekst omzet in verstaanbare spraak.

Een vcm de projecten in het ASSP programma is het samenvoegen van de diverse ontwikkelde modules tot een geheel, dat dan onder meer alS gereedschap voor verder onderzoek op het gebied van omzetting van tekst naar spraak dienst kan doen.

Het samenvoegen van de modules vindt plaats op het IPO (zie bijlage B voor een nadere beschrijving).

De reeds aanwezige hard- en software bood vele, tot dcm toe nog niet gebruJk:te,

mogelijkheden. Derhalve is besloten de samengevoegde modules tevens te voorzien van een grafisch, met de muis te besturen, gebruikezsinter.face. Het uiteindelijke

(7)

Spraakmaker User Inter.tace Inleiding: spraakondeiZoek

Samen met collega A. van Asten heb ik gewerkt aan het vormgeven van dit inter.tace.

1.2 Uitgangssituatie

1.2.1 Hardware

Als hardware is bij de aanvang van het ASSP project op alle instituten gekozen voor gebruik van V AX-machines van DEC (Digital Equipment Corporation). draaiend onder het VMS besturingssysteem.

Aangezien er tijdens het project veel ontwikkelde software tussen de diverse instituten zou worden uitgewisseld, was zo maximale zekerheid verkregen dat de op deze instituten ontwikkelde programmatuur op elkaar zou aansluiten.

1.2.2 Software

De mogelijkheid van VMS om in verschillende talen geschreven modules aan elkaar te koppelen. liet de instituten een zekere vrijheid in de keuze van de door hen gebruikte programmeertalen.

Zo zijn modules geschreven in de taal PASCAL. in FORTRAN en in PROLOG.

Voor het hier besproken werk is enkel van belang. dat het programma. dat al deze modules samenvoegt tot het Spraakmaker systeem, geschreven is in de taal PROLOG (Quintus

PROLOG versie 2.4 van Westmount).

Het bij de aanvang van ons werk aanwezige Spraakmaker raamwerk bood de mogelijkheid om tekst in te voeren, het resultaat van de analyse van de diverse modules op een tekst scherm te tonen en correcties in de resultaten van die analyses aan te brengen. De communicatie tussen gebruiker en programma geschiedde volledig door middel van commando's, die na vertoon van een prompt op regelniveau ingevoerd kunnen worden.

De mogelijkheden om bijvoorbeeld de muis te gebruiken, standaard (alS :fl.nnware) beschikbaar op de aanwezige VAXstation 3100, werden in het geheel niet gebruikt.

1.2.2.1 Het principe van Spraakmaker

Systemen om tekst naar spraak om te zetten gebruiken meestal meerdere, achtereenvolgens aangeroepen, modules om elk op hun niveau de aangeboden tekst te analyseren. Zo is er

(8)

Spraakmaker User Interface Inleiding: uitgangssituatie

meestal een module die de tekst in zinnen opdeelt, een module die zinnen tot woorden terugbrengt, woorden tot lettergrepen, lettergrepen tot letters, letters tot klankpatronen enzovoort. Iedere doorlopen module verandert de oorspronkelijk ingevoerde tekst in meer of mindere mate.

Tekst naar spraak systemen kennen doorgaans een lineaire voorstelling van de

geanalyseerde gegevens: de uitvoer van de achtereenvolgens aangeroepen modules is een gewijzigde kopie vcm de ontvcmgen gegevens, zodat uiteindelijk de oorspronkelijke invoer slechts moeilijk herkenbaar is.

Spraakmaker daarentegen maakt gebruik van een gesynchroniseerde data structum, die alle niveaus van analyse tot dat moment bevat. Elke module voegt zijn analyse van de ontvangen gegevens toe aan de structum en laat de resultaten van de voorafgaande analyses onverlet. Zodoende is op elk moment de volledige analyse vanaf de oorspron-kelijke invoer tot dat moment beschikbaar. Bovendien heeft iedere module desgewenst de mogelijkheid om terug te grijpen op alle uitkomsten vcm analyses, die voorheen hebben plaats gehad en deze zonodig alsnog te wijzigen. Deze opzet maakt het noodzakelijk, dat er een synchronisatie plaatsvindt tussen de verschillende analyses vcm de invoer. [vcm

Leeuwen & te Lindert, 1990]

De synchronisatie wordt grafisch weergegeven door verticale lijnen, syncmarks geheten. De analyses van de diverse modules worden onder elkaar weergegeven, zodat grafisch een twee-dimensionaal raster ontstaat. De totale structum heet dan ook GRID.

(9)

Spraakmaker User Interface Inleiding: uitgangssituatie

1.2.2.2

De

GRID

Een grid bestaat uit een eindig aantal streams, cüe elk een niveau van analyse van de tekst aangeven. Streams worden onder elkaar getoond en kunnen op hun beurt weer nader uitgewerkt zijn in substreams, die elk een apart facet van de analyse van die strearn weergeven.

Een stream bestaat uit een horizontale opeenvolging van tolcens, die een eenheid uit de onderzochte tekst aangeven. Tekens zijn te beschouwen als records met juist evenveel velden als er substreams in de stream aanwezig zijn. Deze velden, datum geheten, bevatten het kleinste informatie eenheid die in die strearn mogelijk is. Een teken moet in elke

substream over een (al dan niet gevuld) datum beschikken.

De scheiding tussen twee opeenvolgende tekens wordt gevormd door de als verticale lijnen weergegeven syncmarks. Deze bestaan intern als integers; syncmarks die in meerdere streams voorkomen, en daar dus dezelfde integerwaarde hebben, dienen bij de

representatie in elk van die streams dezelfde horizontale positie in te nemen (opgelijnd te zijn). Een voorbeeld: De interne structuur: word-type-l-lex-2

I

~class-l-noun-2 Laccent-l-+-2 graph-gra-l-k-3-a-4-a-S-s-2

I

phon-pho-l-k-3-a-S-s-2

wordt voor de gebruiker weergegeven als: word:type class accent graph:gra phon:pho lex noun + klala s k a s l 3 4 5 2 .A1b 1 Voorbeeld van de opbouw van een grid; hJerin zijn:

- word, graph en phon streams in de grid;

- type, class en accent substreams binnen de stream word; - gra en pho de enige substream van graph respectievelijk phon; - lex, noun en + samen 1 teken van de stream word;

- lex, noun en + elk een datum van de betreffende substream;

- k, a en s elk zowel datum als teken van de bijbehorende (sub)stream en

(10)

Spraakmaker User Intenace Inleiding: onze taken

1.3 Taakomschrijving

Het vervangen van de commandobesturing van Spraakmaker door een intenace, dat met de muis bestuurd kan worden, is een complexe taak. Het werk is dan ook uitgevoerd door twee personen, mijn collega en ik, elk verantwoordelijk voor afgescheiden onderdelen in de implementatie. Voor goed begrip zal ik, uitgaande van de eisen die aan het intenace gesteld worden, hierna de (deel)taken in het project kort noemen. Tevens wordt een korte motivatie gegeven van de taakscheiding in ons beider werk.

1.3.1 Tonen en manipuleren

Het is de bedoeling van het intenace dat

- de grid op het (grafische) scherm getoond kan worden; - streams in willekeurige volgorde getoond kunnen worden,

- een gedeelte van de grid getoond kan worden met weglating van het overige - een enkel datum gewijzigd kan worden

- een of meerdere tekens gewijzigd of verwijderd kan c.q. kunnen worden - een teken toegevoegd kan worden

- opgelijnde syncmarks (dus met hetzelfde volgnwnmer in de diverse streams) ontkoppeld kunnen worden, dus een verschillend volgnummer krijgen

- syncmarks met verschillend volgnwnmer gekoppeld (opgelijnd) kunnen worden en hetzelfde volgnwnmer krijgen

In het bestaande programma zijn hiervoor regelcommando's beschikbaar; in het te

ontwerpen programma dient het mogelijk te zijn deze commando's aan te geven door het op de juiste plaats aank.l.ikken van de muis.

Verder moeten diverse parameters, zoals bijvoorbeeld: - de soort invoer van tekst (vanaf toetsenbord of uit file),

- de selectie op welk moment van analyse de grid getoond moet worden, - het al dan niet tonen van de syncmarknummers

met behulp van de muis ingesteld kunnen worden.

Tijdens de werkzaamheden is het wenselijk gebleken dat:

- de vele lettertypes, die het VMS systeem beschikbaar heeft, op een makkelijke manier gekozen en gebruikt kunnen worden en

(11)

Spraakmaker User Interface Inleiding: onze taken

- de gedeelten van de grid waar wijzigingen plaatsvinden zo voordelig mogelijk op het scherm getoond worden, dus dat het scherm zo scrollt dat de relevante in1ormatie automatisch zichtbaar is.

Uit deze vereisten komen de volgende deeltaken voort:

1. 3.2 ·Plaatsingsalgoritme

Ten einde de syncmarks met hetzelfde volgnummer onder elkaar in de grid te kunnen plaatsen dient er een algoritme te bestaan, dat de posities van die syncmarks bepaalt. Bij de aanvang van ons werk waren daartoe twee, enigszins van elkaar afwijkende, in Prolog geschreven, algoritmen beschikbaar. Beiden gaven echter in sommige gevallen moeilijk interpreteerbare uitvoer en waren bovendien traag. Er dient dus een nieuw

(eventueel verbeterd) en in een snellere taal geïmplementeerd algoiitme te komen, dat aan deze bezwaren tegemoet komt.

De realisering van dit algoiitme is de taak van mijn collega.

1.3.3 Grid-editor

Tot nu toe werd de giid getoond in een normaal tekstscherm met behulp van

ASCII-karakters. Op deze manier is de grid niet toegankelijk voor besturing met de muis. Er is dus een representatie op het scherm noodzakelijk, die interactie met de muis wel mogelijk maakt.

Het onderzoek naar de mogelijkheden daartoe en de realisatie van de implementatie hiervan is mijn taak.

1.3.4 Interface-besturing

Naast de functies, die in de grid-editor gerealiseerd moeten worden, dienen in het project nog vele andere functies beschikbaar te komen (bijvoorbeeld om de vele mogelijke instellingen te kunnen kiezen en wijzigen). Het is zaak ook deze functies toegankelijk te maken voor muisbestwing. Gebeurt dit niet, dan wordt de gebruikSvriendelijkheid van het interface als geheel meer geschaad, dan indien helemaal van muisbesturing afgezien wordt.

Om redenen, die bij de bespreking van de gekozen implementatie duidelijk zullen worden

(12)

Spraakmaker User Interface Inleiding: onze taken

1.3.5 Koppeling

De eenmaal gerealiseerde modules zullen uiteraard tot een werkend geheel gekoppeld moeten worden, zowel de door ons beiden vezvaardigde modules aan elkaar als deze (gekoppelde) modules als geheel aan het bestaande Spraakmaker systeem.

Zoals zal blijken (hoofdstuk 3) geven deze koppelingen meer problemen dan redelijkerwijze verwacht mocht worden.

De eerste koppeling 1s grotendeels mijn taak, de tweede de taak van mijn collega, met dien verstande, dat er noodzakelijkerwijs een gezamenlijke inbreng bij beide zal moeten zijn, aangezien de koppelingen gevolgen in ons beider modules hebben.

(13)

Spraakmaker User Interface Inleiding: implementatie mogelijkheden

1.4 Implementatie mogelijkheden

1.4.1 Systeemprogrammatuur

De bij de aanvang van het ASSP project gemaakte keuze voor het V AXfVMS

bestu-ringssysteem en de aanwezigheid van VAX 3100 werkstations geeft bijna noodzakelijkerwijs de richting aan waarin de implementatie gezocht moet worden. De op de V AX 3100 als filmware meegeleverde applicaties zijn grotendeels met de muis bestuurbaar. Aangezien dit

een eis is van de door ons te ontwikkelen applicatie, ligt het voor de hand de bestaande

toepassingen als voorbeeld voor de onze te beschouwen. Bovendien garandeert deze aanpak bijna een 'lll"Uformiteit van de reeds bestaande toepassingen en de door ons te ontwikkelen, hetgeen voor de toekomstige gebruiker zeer welkom zal zijn.

De bestaande toepassingen, waarvan sommige in broncode als voorbeeld beschikbaar zijn, zijn geschreven in de taal

c

met behulp van een pakket extra functies, genaamd

X-Windows, dat de mogelijkheden van het werkstation uitbuit en deze mogelijkheden voor de programmeur toegankelijk maakt.

1.4.2 X-Windows

Het X-Window pakket, aanvankelijk door het MIT (Massachusetts Instutute of Technology) in samenwerking met DEC ontwikkeld, wordt thans onder beheer van een consortium van vele hard- en software leveranciers als "public domain pakkef verspreid (zie ook bijlage C). Het is beschikbaar voor de meeste UNIX systemen alsmede V AXfVMS en maakt de

complexe besturingssystemen van vele werkstations makkelijk toegankelijk voor de gebruiker.

De architectuur van het X-Window systeem is gebaseerd op een elient-server model. Een proces, de server, controleert alle in- en uitvoer, onderhoudt de 'Windows, de tekst en de grafische voorstellingen op het scherm, en handelt alle invoer van toetsenbord en muis af. Een toepassing, die gebruik: maakt van de X server, heet een client.

Toepassingen worden op het scherm zichtbaar gemaakt binnen 'Windows, rechthoekige gedeelten van het scherm, voorzien van een achtergrondkleur en een rand, en vele mogelijkheden tot individuele aanpassing door middel van bijvoorbeeld nieuwe windows (children), die op het oorspronkelijke window (parent) liggen of van daaruit opgeroepen worden.

De elient maakt gebruik: van resources die de server beschikbaar houdt, zoals standaard windows, lettertypes, kleuren en datastructuren. De elient kan requests aan de server

(14)

Spraakmaker User Intartace Inleiding: implementatie mogelijkheden

zenden om bijvoorbeeld een window te openen, te wijzigen, te verwijderen of om de status van een window te vernemen. De comm1.lllicatie tussen server en elient geschiedt door middel van events, een soort intenupts als gevolg van een actie van de gebruiker

(toetsaanslag, mu.tsbeweging) of om de elient van een wijziging op de hoogte te brengen (bijvoorbeeld als het window (gedeeltelijk) bedekt wordt door een ander window of weer zichtbaar gemaakt moet worden).

Voor het realiseren van toepassingen is een bibliotheek beschikbaar, genaamd XLib, een uitgebreide set functies, die volledige toegang tot en controle over het gebruik van windows mogelijk maakt. Zo'n bibliotheek bestaat voor onder andere de talen LISP, .ADA, C en

VAXPASCAL.

Hoewel de Xlib bibliotheek al veel progrommeerwerk op systeemniveau overneemt van de programmeur, blijft het werken met alleen deze bibliotheek een complexe zaak op een Vlij

laag niveau. Er zijn dan ook diverse tooikits ontstaan, die deze complexe aanroepen van

XI.ib functies reduceren tot een of enkele nieuwe aanroepen uit de toolkit.

Als standaard tooikit geldt, en is ook op V AXjVMS aanwezig, de X Toolldt, bestaande uit de Xt Intrinsles laag, een stelsel van functies, die met behulp van Xlib functies op een hoog niveau en uitgaande van standaard waarden, veel details in de implementatie van de programmeur overnemen. Vanuit deze Xt Intrinsics zijn diverse Widget Sets ontwikkeld, die een aantal gebruiksklare componenten als scroll bars, menu's, buttons (knoppen) enzovoorts bevatten. De diverse

sets

zijn in wezen hetzelfde, doch vertonen op het scherm enige

uiterlijke verschillen. V AX/VMS gebruikt de X Widget set en noemt het gehele pakket DECWindow:s. Ten behoeve van de uniformiteit met de reeds op de V AX 3100 bestaande applicaties is het zaak deze set ook in onze applicatie te gebruiken.

(15)

Spraakmaker User Interface Inleiding: implementatie mogelijkheden

I

Widgetset

Xt Intrinsics

Xlib C Interface

Netwerkv

erbinding

I

X Server

1

AJb 2 OveiZicht

vcm

de opbouw

vcm

het X "Window pakket

Het gemak van het gebruik van een tooikit gaat ten koste van de flexibiliteit, zodat waar veel gemanipuleerd wordt met data in een window, de standaard XlJb de voorkeur verdient, terwijl waar veel met standaard attributen wordt gewerkt, een tooikit goed van pas komt.

Daarom is de grid-editor ontwlkkeld met behulp van uitsluitend XIJb. Het hele Tooikit pakket, waarvan, gezien de te verwachten opbouw van de editor toch slechts zeer weinig gebruikt zal kunnen worden, hoeft dan niet steeds meegesleurd te worden. Bij de interface besturing echter komen de Tooikit en de Widget set, gezien de vele menu's, knopjes, extra 'Windows enzovoorts, bijzonder goed van

pas.

Aangezien enerzijds het programmeren met behulp van de Tooikit een heel ander karakter heeft, dan het programmeren met alleen het XlJb pakket en anderzijds de opgedragen taken efficiênt verdeeld moesten worden, is besloten dat mijn collega de interface besturing zou realiseren.

In het vervolg van het verslag zijn functies, waarvan de naam begint met alleen een X afkomstig uit Xlib, terwijl functies, die beginnen met Xt behoren tot de Toolkit.

(16)

Spraakmaker User Intenace Inleiding: het verslag

1.5 Het verslag

Na de uitgebreide inleiding over hetgeen bij de aanvang van ons werk reeds aanwezig was, zal het vervolg van dit verslag, behoudens een afsluitend hoofdstuk, uitsluitend handelen over het ontwikkelen van de grid-editor en de malisering van de koppeling. De overige hiervoor reeds aangeduide werkzaamheden zijn verricht door mijn collega. Hiermee is een taakverdeling geschapen, waarbij mijn collega enerzijds in uitsluitend C

programmeert (plaatsingsalgoritme) en anderzijds met behulp van de Toolkit en Widget set de interface besturing ontwikkelt, terwijl ik in C met behulp van het XIJb pakket de editor zal implementeren.

Om een totaal beeld van ons werk te verkrijgen, verwijs ik dan ook uitdrukkelijk naar het verslag, dat mijn collega over de verrichte werkzaamheden heeft vervaardigd.[van Asten. 1991]

Het voert in dit verslag te ver uitgebreid in te gaan op de ongeveer 50 deels omvangrijke functies. die ten behoeve van de grid-editor en de koppeling geschreven zijn. Er zal voornamelijk aandacht besteed worden aan een beschrijving van het systeem van de events en aan de problemen, die de koppelingen tussen de diverse onderdelen met zich meebrengen.

(17)

Spraakmaker User Inte:dace De Griel-editor: theoretisch ontwerp

Hoofdstuk 2: De Grid-editor

2.1 Theoretisch ontwerp

2.1.1 Gewenste mogelijkheden

De grid-editor dient zo vormgegeven te worden, dat met uitsluitend het bewegen van de muis en het incirukken van de muisknop de verschillende mogelijkheden om wijzigingen aan te brengen geselecteerd kunnen worden.

Deze mogelijkheden zijn: - het wijzigen van 1 datum;

- het wijzigen van een of meer tokens;

- het invoegen of verwijderen van een token; - het ontkoppelen van opgelijnde syncmarks; - het koppelen van niet opgelijnde syncmarks.

De mogelijkheid om de grid in een tekstscherm te tonen en dus het intenace niet te gebruiken moet aanwezig blijven; zo kan het programma ook draaien op terminals met minder grafische mogelijkheden dan de V.AX. 3100 heeft.

Zowel in de grafische voorstelling op de V AX 3100 als in een tekstscherm dienen:

- de strearns, eventueel bestaande uit substrearns, boven elkaar weergegeven te worden, - de tekens van de betreffende stream van links naar rechts afgedrukt te worden; de tokens

dienen onderling gescheiden te zijn door lijnen, de syncmarks,

- onder de grid en juist onder de syncmarks de volgnummers van die syncmarks aangegeven te kunnen worden.

2.1.2 Het gebruik

In het verslag van mijn collega, dat onder meer de intenace besturing beschiijft, zal

aangegeven zijn, dat diverse instellingen gekozen kunnen worden, waaronder het

oproepen van de editor. Na een desbetreffend signaal dient de editor de grid op het scherm te brengen; daarna kunnen wijzigingen worden aangebracht.

Hiema volgt een beschrijving van de wijze waarop de editor gebruikt zou kunnen worden om wijzigingen aan te brengen.

(18)

Spraakmaker User Intelface De Grid-editor: theoretisch ontwerp

Door het indrukken van een muisknop (MB1)1 in de grid wordt het gewenste datum o1

teken geselecteerd:

- (ruim) in het midden van het datum is het een wijziging van dat datum (of token(s) - zie

ö•

hiema -); er verschijnt een rechthoek rond het datum;

- minder dan een kwart van de totale breedte van het teken van een syncmark verwijderd is het een invoeging van een teken; een extra syncmark verschijnt;

- ma:ximaal enkele punten (pixelS) van de syncmark is het een (ont)koppeling van (een) syncmark(s); de syncmark wordt dikker en de muispunt wordt een open schaartje.

Behalve bij de keuze voor invoeging kan door het bewegen van de muis bij ingedrukte MBl de keuze nog nader bepaald worden:

- Bij selectie van een datum heeft bewegen van de muis het gevolg dat (alleen in de stream wacnin het datum staat) een of meerdere tekens als een geheel blok gekozen kunnen worden. Tijdens het bewegen van de muis geeft een rechthoek het op dat moment geselecteerde blok aan.

- Bij selectie op een syncmark verschijnt er bij het bewegen van de muis een 'elastiekje', dat de bewegingen van de muis volgt. De syncmark, die het dichtst bij de muispunt staat wordt, als hij voor koppeling in aanmerking zou kunnen komen gezien de opbouw van de grid, evenals de eerst aangeklikte, dik weergegeven.

zo

is steeds zichtbaar welke twee syncmarks bij loslaten van de muisknop gekoppeld zouden worden.

Het loslaten van :M:Bl heeft bij selectie van een datum, van een of meerdere tekens en bij de invoeging van een teken tot gevolg, dat via het toetsenbord tekst ingevoerd kan worden.

Is een syncmark geselecteerd, dan betekent het loslaten van MBl, dat zo mogelijk twee aangewezen syncmarks gekoppeld worden. Is koppeling niet mogelijk, dan verdwijnt de hele selectie. Is (ondanks de mogelijkheid van muisbeweging) maar 1 syncmark

geselecteerd, dan heeft het loslaten van MBl voorlopig geen effect; er kunnen, door herhaald indrukken en loslaten van MBl op dezelfde syncmark in verschillende streams, meerdere streams geselecteerd worden, die ontkoppeld moeten worden van die syncmark in de niet geselecteerde streams. De feitelijke ontkoppeling geschiedt door het indrukken en weer loslaten van MB3.

1

Het X-W1ndow systeem ondersteunt het gebruik van maximaal 5 verschillende muisknoppen. De VAX 3100 kent er 3, zodat alleen de knoppen 1 tjm 3 <MB1, Ml32, MB3) gebruikt worden. Het VAX Operaling System maakt een keuze tussen rechts- en linkshandig gebru1k van de muis mogelijk. Bij rechtshandig gebruik ls Ml31 de linker muisknop, :MB2 de middelste en MB3 de rechter. Bij linkshandig gebru1k ls de aanduiding predes andersom (MB1 rechts, MB3links).

(19)

Spraakmaker User Interface De Grid-editor: theoretisch ontwerp

2.1.2.2 Tekstinvoer

Na het loslaten van lv1B 1 ontstaat er midden in het geselecteerde datum of in het bovenste datum van de gekozen token(s) een rechthoekje met daarin een liggend streepje als 'cursor'. Vanaf nu is invoer van tekst vanaf het toetsenbord mogelijk. Met behulp

van

[BACKSPACE] kunnen fouten in de ingevoerde tekst verwijderd worden, [RE'I'URN] sluit de invoer af. Is een enkel datum geselecteerd, dan is de wijziging hiermee voltooid. Bij selectie

van

een of meerdere tekens echter, moeten vervolgens alle datums van dat (nieuwe) teken (eventueel als lege string) ingevoerd en met [RE'I'IJRN] afgesloten worden. Pas nadat in het laatste datum van het taken [RE'I'IJRN] iS gegeven, is de wijziging of de nieuwe invoer voltooid.

2.1.2.3 Correcties

Indien in een datum geselecteerd wordt, dat geen of slechts een karakter bevat, kan het moeilijk zijn de juiste selectie (wijziging, invoeging of (ont)koppeling) kenbaar te maken. Daarom wordt in zo'n geval door middel van een windowtje met een aanwijzing in de grtd aangegeven wat geselecteerd is. Zo kan (overtgens ook indien dit windowtje niet verschijnt) een gemaakte selectie nog ongedaan gemaakt worden door MB2 in te drukken, ongeacht of MB 1 al iS losgelaten of niet.

Een ongedaan maken van een eerdere selectie na het loslaten van de muisknop vindt ook plaats als die selectie nog niet voltooid is (door middel

van

een afsluitende [RE'I'Ul<NJ) en opnieuw MB 1 wordt ingedrukt.

2.1.3 Mogelijke oplossing

Met behulp van de in plaatsingsalgorttme

van

mijn collegae opgebouwde gegevens is het mogelijk elk datum en teken op de juiste plaats in het window te tonen.

Tevens iS het enerzijds met behulp van de gegevens uit dat algorttme en anderzijds uit de muispositie mogelijk te achterhalen in welk datum of teken de muiS zich bevindt. Door nu na te gaan hoe groot de afstand is van de muispositie tot de rand

van

het aangewezen teken, kan onderscheid gemaakt worden in de door de gebruiker verlangde aCtie. Zo kunnen alle vereiste aCties aangegeven worden door middel van het indrukken van enkel MB1. De actie wordt enkel bepaald door de plaats van de muispunt bij indrukken.

De data, die in de grtd getoond worden, worden uitgelezen uit een in andere mOdules opgebouwde en hier beschikbare database. Wijzigingen zullen zowel in de grtd in het window als in de database doorgevoerd moeten worden. Tevens moet een geSChikte

(20)

Spraakmaker User Interface De Grid-editor: theoretisch ontwerp

manier gevonden worden om wijzigingen door te geven aan het (PROLOG)programma, dat deze wijzigingen moet verwerken.

Het X-Window pakket maakt het mogelijk geb:n.tik te maken van vele, in grootte en

leesbaarheid vaiiêrende, lettertypes (fonts). Het zou jammer zijn deze mogelijkheden niet uit te buiten. Afhankelijk van het doel van het geb:n.tik (bijvoorbeeld demonstratie o1

ondezzoek) kan dan een geschikt tont gekozen worden. Bij de opzet van het programma zal hiermee rekening gehouden moeten worden.

Mb 3 Onderlinge samenhang tussen de onderdelen van het Spraakmaker pakket. 2.2 Ontwerpen window

De grtd-editor vindt zijn plaats in een window, dat op het scherm geopend moet worden. Voordat een window geopend kan worden, moeten eerst tal van voorbereidende

werkzaamheden uitgevoerd worden en kenmerken (attiibuten) voor dat window worden vastgelegd. Indien uitsluitend geb:n.tik gemaakt wordt van Xlib-:functies betekent dit de aanroep van vele :functies. Zo dient onder meer een verbinding tussen de nieuwe elient en de server tot stand te worden gebracht, dient het aanwezige screen (de achtergrond) bepaald te worden, het window gemaakt en op het scherm gebracht te worden (dit zijn twee verschillende acties).

In onze appliCatie echter is het window, waar de grid-editor zijn plaats vindt, een onderdeel van het totale ontwerp van het interface. Vele voorbereidingen en attrlbuten van het

(21)

Spraakmaker User Intenace De Grid-editor: ontwerpen window

window zijn dan ook al - met l::>ehulp van de Toolkit - uitgevoerd respectievelijk vastgelegd. Het verslag van mijn collega zal hierover l::>erichten. Slechts enkele attri.buten moeten bij het ontwerp

apart

aangegeven worden omdat die afwijken van de standaard waarden, zoals de Toolkit die kent. Zo dient aangegeven te worden welke van de mogelijke events door het window herkend moeten worden:

I" geef events aan, die ten behoeve van het window doorgegeven moeten worden • I win_attr.event_mask • ButtonPressMask I I" indrukken van willekeurige muisknop • I

ButtonReleaseMask I I" loslaten van willekeurtge muisknop • I

ExposureMask I I" wijziging in zichtbaarheid van window • I

KeyPressMask I I" indrukken van toets op toetsenbord • I

LeaveWindowMask I I" verlaten van window door mulspunt • I ButtonlMotionMask I I" beweging van MBl "I

EnterWindowMask;l" binnenkomen in window van mulspunt • I

I" maak deze afwijkingen bekend aan het window • 1

XChangeW1ndowAttributes(dpy,win,attr_mask,8cwin_attr);

De overige events worden gewoon genegeerd, indien ze in het window optreden.

Er is een mogelijkheid opengehouden om de dikte van de lijnen te variëren, waarmee bijvoorl::>eeld syncmarks en rechthoeken getekend worden:

geef de breedte van (getekende) lijnen ... • 1

gcval.line_width • 1; I" .. door aan het display • 1

XChangeGC(dpy,GCC,GCLineWidth,Bcgcval);

(22)

Spraakmaker User Interlace De Grid-editor: tonen van de grid

2.3 Tonen van de Grid

Voordat de grid-editor gebruikt kan worden, zal de grid eerst op het scherm getoond moeten worden. Hiervoor is een :functie ontworpen (void showtexto), die verder altijd aangeroepen wordt als door wijzigingen, het vrij worden van voorheen bedekte gedeelten van het window, het scrollen binnen het window, enzovoort, (gedeelten van) de grid opnieuw getoond moet(en) worden.

Deze functie zoekt in de datal:xlse naar de eerst voorkomende stzeam en de eerste bij die stream horende substream en tekent hun namen in het window. Vervolgens tekent de functie doenachter achtereenvolgens alle datums, die bij die substream horen en wel zo, dat het datum midden tussen zijn linker en rechter syncmark komt. Tevens wordt de rechter syncmark getekend; de linker syncmark is de rechter van het volgende datum. Tenslotte wordt de laatste rechter syncmark getekend.

Als de stream meer substreams heeft, worden die achtereenvolgens opgezocht, wordt onder de vorige de naam van de actuele substream getekend - de naam van de stream kan nu weggelaten worden - en worden daarachter de bijbehorende datums en hun syncmarks getekend. Zijn er verder geen substreams, dan wordt een ruimte ter hoogte van een halve letterhoogte opengelaten en wordt verder gegaan met de volgende stream.

Tenslotte wordt naar een functie gesprongen,

;· doe wat nodig is betreffende syncmarks ·; void do_syncmarCS(n, ytext)

int n, ;• 2 • (opnieuw) berekenen van de hoogte van de glid; 1 • tevens tekenen van de syncmarks ·;

ytext; ;· hoogte van de grid zonder verdiscontering hoogte syncmarks •;

die nagaat of de volgnummers van de syncmarks getekend moeten worden - dit is ingesteld in de interlace besturing - en zonodig deze nummers tekent.

soms neemt het nummer zoveel plaats in, dat de nummers van twee opeenvolgende syncmarks elkaar zouden overlappen. In de functie cio_syncmarCS() is hierin voorzien door het nummer op de eerstvolgende regel te tekenen, waar wel plaats is. Aldus staat het nummer altijd precies onder de syncmark, waomaar het verwijst.

Afhankelijk van het gekozen tont en van de (vartabele) grootte van het window kan zich de situatie voordoen, dat niet de hele grid in het window getoond kan worden. Dit heeft voor de :functie showtexto geen gevolgen. Wordt op posities getekend, die buiten het window vallen, dan wordt gewoon getekend, zonder dat dit zichtbaar is.

(23)

Spraakmaker User Intenace De Grid-editor: tonen van de grtd

Indien gedeelten van de giid bereikt moeten worden die zich op dat moment voorbij de randen van window bevinden, dan dient de editor er voor

te

zorgen, dat deze gedeelten met uitsluitend het bewegen van de muis zichtbaar gemaakt kunnen worden. De inhoud van het window dient dus zonodig aan de hand van muisbewegingen

te

kunnen scrollen.

5pra;duaallerU~ c - • - ~ -- t1

.. . - .

--·---~======~---I_EC-~•n-~•n-~·a-~n·~-~·~~S~e~tr~ln~9'~~0~h~ul~a~v--~M~o·~lil~v--~Sc~I~U~p~---;----~~~~---r---~~~

phl_dom.oin phl_domain phl_donaln ~ phi_dom.phh l.abei.Lyper word.L>"P•• .cl.assr .I eau .subc.au .ace• ..arnbisr subw.L)-pe: morpb.typer S)ioS)·h sr:~ph-!1•'"' phon.phor .SI.l'l .dun fr.omoo;.nn diph.dr lnt.o.freq: .declir pltch.type: .lr.omer .onset.: .dun Spraakmaker> I I I p1'0 [subsUnont-5&11

-s S)'l

il

k

:I

k

-I I

.,

[pr·e~O.ssl) [p .. st_p.utth,oO)

-2 s •YI

..

,

..

,

b

~1~1

p

-I I I I I I I I I I I I .odv [r,n,n) .oclv q 11 prop v

[$) [Ie) lao5t:,cl [v:mo~>.r,u) [pas~_par1(b,u01

IJ

-

2 2 s s s

s

.,.1

I

S)i

I

S)i ~l•l"l"ltl•l n

~ l~l~lil~l~l ~

syl syl S)i 1 S)i sy1 syl

el r ulo

Is

wl .. lijnlil;: k!-•l.ols vl.ol n

nl

I -

"lor

- 1 - - 1 - - - - 1 - - 1 -

~~

y

I" I@ I

x

kl'"l

s

riAl

n

.Atb. 4 Een voorbeeld van een gedeelte van de griel in de editor.

0

(24)

Spraakmaker User Intertace De Grid-editor: evaluatie van events

2.4 Evaluatie van events

Als de griel eenmaal op het scherm staat, moeten alle wijzigingen met behulp van de muis

uitgevoerd kunnen worden. Hiertoe staat het middel van events ter beschikldng. Deze events geven aan of er met de muis, toetsenbord enz. iets gebeurd is.

Van de in totaal 33 verschillende even~ die kunnen optreden, worden er een achttal toegelaten tot het window (zie ook 2.2). Met behulp van een - in principe eindeloze - lus (is

het window eenmaal geopend, dan geschiedt de controle volledig van hieruit totdat het programma wordt verlaten) wordt, afhankelijk van de soort event, de nodige actie ondernomen:

while (ge_status I I pointer) 1 afgewerkt moet worden • 1

XNe:x:tEvent(dpy, &event); switch(event.type) I case ButtonPress: break; case MotionNotify: break:; case ButtonRelease: break:; case KeyPress: break; case EnterNotify: break:; case LeaveNotity: break:; case Expose:

/" hou cxmtrole zolang de muispunt in het window staat of er nog wat /" wacht tot er een event komt • I

I" selecteer op soort event • I

/" indrukken van een of andere muisknop • I

/" reageer op beweging van ingedrukte muisknop • 1

/" loslaten van muisknop: maakt de selectie feitelijk definitief • 1

I" evalueer aanslag van toets • 1 I" muispunt is in window gekomen • I I" muispunt heeft window verlaten • I

/" bericht ontvangen, dat 'iets' met window is gebeurd • 1

/"roer staat geen break: verder met de volgende "I

case ContigureNotify: /" test op deze event blijkt noodzakelijk te zijn • 1

j" controle moet afgegeven worden om andere controlelus in staat te stellen zijn taken te verrich,ten

NA VOL'IOOIING MOET HIJ ZELF EEN EVEN'I (XSendevent van :EnterNotify) GENEREREN n®IEN DE CONTROLE HIER TERUG MOET KOMEN • I

break;

I /" einde evaluatie van events ·I

In deze module wordt de lus onderbroken, omdat er ook in de inteliace besturing een lus bestaat, die de events evalueert. Die lus moet op geschikte momenten ook gelegenheid krijgen om zijn werk

te

doen. Zie voor de koppeling van en de interactie tussen beide lussen Hoofdstuk 3.

2.5 Reactie op de events

2

(25)

Spraakmaker User Intenace De Grtd-ec:Utor: reactie op de events

Ten gevolge van het optreden van events kan de editor in verschUlende toestanden verkeren. Deze toestanden bepalen hoe de editor dient te reageren op de gebruiker en worden bijgehouden met behulp van drie vartabelen:

pointer: 0: muispunt bevindt zich buiten het wind.ow van de grid-editor 1: muispunt bevindt zich in dit window

ge_status: 0: wachten op het indrukken van de muisknop 1: wachten op het loslaten van de m\llsknop

2: wachten op invoer van het toetsenbeid type_select: 0: er is geen actie bezig of gewenst

1: wijziging van een datum is bezig of gewenst

2: wijziging van een of meer token(s) is bezig of gewenst 3: invoeging van een token links is bezig of gewenst 4: invoeging van een token rechts is bezig of gewenst 5: (ont)koppeling van syncmarks is bezig of gewenst

ZO kan de editor (• de lus die de optredende events test) alleen verlaten worden, indien zowel pointer ...

o

(muis buiten window) als ge_status --

o

(wachten op nieuw te starten actie, dat wil zeggen er is op dit moment geen actie aan de gang).

De ge_status verandert bijvoorbeeld na het 1n paragraaf 2.1.2 beschreven aanklikken van de muis van 0 in 1, na het eventueel bewegen en loslaten van de muis van 1 1n 2 en na voltooiing van tekstinvoer of koppeling van twee syncmarks weer in 0.

In type_select wordt bijgehouden welke actie aan de gang is.

Deze drie variabelen kunnen, samen met de acht events, (in theoiiel!) dus leiden tot 2·3·6·8 - 288 verschillende toestanden, waartn de editor kan verkeren!!

De diverse reële acties, die de optredende events oproepen, zullen hiema achtereenvolgens behandeld worden.

(26)

Spraakmaker User Interlace De Grid-editor: reactie op de events

2.5.1 Indrukken van muisknop (ButtonPress)

Deze event kan in diie situaties optreden:

1 er is niets van voorheen (ona1gemaakt) blijven liggen: bepaal, welke actie nu gewenst wordt

2 er was al eerder een (andere) muisknop ingedrukt, maar nog niet losgelaten: herstel de oude toestand (undo)

3 een eerder ingedrukte muisknop was al losgelaten, maar de bijbehorende actie is nog niet voltooid: doe dit nu, indien dit mogelijk is

2.5.1.1 Bepaal gewenste actie

Aan de hand van de exacte positie in het datum, waar de muispunt zich bevindt op het moment dat de muisknop wordt ingedrukt, wordt de actie bepaald:

De ruimte tussen twee syncmarks wordt in een instelbaar aantal (standaard 8) gelijke gedeelten verdeeld gedacht. Is de ruimte tussen de muispunt en een syncmark kleiner dan dat (8") gedeelte, dan is die syncmark gekozen; is deze ruimte groter, maar kleiner dan 3 maal dat gedeelte (met een maximum van twaalf maal de gemiddelde letterbreedte in het gekozen font), dan is een invoeging geselecteerd en in de oveiige gevallen is gekozen voor de wijziging van het aangewezen datum Oater eventueel teken).

Als de syncmarks erg dicht naast elkaar staan, kan het soms moellijk zijn, de muispunt zo te plaatsen, dat de gewenste actie ook inderdaad geselecteerd wordt. Ter controle verschijnt dan bij het indrukken van de muisknop op een geschikte plaats in het window een kadertje, dat met behulp van de woorden "change•, "insert" of "MB I couple MB3 decouple" aangeeft wat geselecteerd is. Is de geselecteerde actie, zoals aangegeven, niet de juiste, dan kan met een druk op een andere muisknop de selectie ongedaan gemaakt worden (zie 2.5.1.2).

3

1\.IBJ couplc J\IB3 dccouplc

lnsf

d

I

i k

I \\'I

"j

p

I

s h 0 I \1 I s t. 0

I

I' d

.

~

H

I~ I~ I~ I~ I~ ~ l~l~ltl~l~l~

1:1

~

A!b 5a wijziging A1b Sb invoeging A1b 5c (ont)koppeling

2.5.1.2 Herstel van de oude toestand (undo)

(27)

Spraakmaker User Intartace

De

Grid-editor: reactie op de events

Het indrukken van een muisknop, terwijl een andere muisknop reeds is ingedrukt en nog niet is losgelaten, maakt de aangeduide actie ongedaan: een getekend kadertje om een datum of een toegevoegde syncmark wordt verwijderd.

Slechts indien bij het eerste indrukken van een muisknop op of zeer nabij een syncmark is geselecteerd en dus een (ont)koppeling is aangegeven (de muispunt is nu een open schaartje), kan het indrukken van lv!B3 een actie activeren:

Als tevens MB3 wordt ingedrukt, betekent dit het ontkoppelen van de syncmark: de muispunt wordt een dicht schaartje en de syncmark in deze stream krijgt een nieuw (nog niet bestaand) volgnummer; de syncmarks in de overige streams, die gelijk waren aan het vroegere volgnummer van de geselecteerde syncmark blijven ongewijzigd.

Wordt :MB2 ingedrukt, dan betekent dit, evenals bij de andere selecties, een herstel: het open schaartje wordt weer de gewone muispunt en de verdikking van de syncmark verdwijnt.

2.5.1.3 Afmaken eerder geselecteerde actie

Als een eerder ingedrukte muisknop reeds is losgelaten, maar de bijbehorende actie nog niet is afgemaakt, wordt bij het hernieuwd indrukken van een (willekeurige) muisknop de onderbroken - vorige - actie teniet gedaan. 3

Effectief is dus zo wederom een undo-functie gecreëerd, behalve bij -ook nu weer - selectie van een (ont)koppeling.

Is (ont)koppeling geselecteerd, dan heeft het indrukken van de middelste respectievelijk de rechter muisknop hetzelfde gevolg als hiervoor in paragraaf 2.5.1.2 is aangegeven (undo respectievelijk ontkoppelen).

2.5.2 Bewegen van de muis (MotionNotify)

Het bewegen van muis - bij ingedrukte muisknop - heeft gevolgen indien wijziging van een datum is geselecteerd of de (ont)koppeling van een syncmark. Is een invoeging aangeduid, dan heeft een muisbeweging geen effect.

3

In de module is een voomening aanwezig om een gedeeltelijk Ingevoerde wijziging van een datum als geldig te accepteren. In de praktijk bleek dit niet goed bruikbaar, ook omdat bij wijziging van een token alle datums In dat

(28)

Spraakmaker User Intertace De Gild-editor: reactie op de events

2.5.2.1 Wijziging van datum of token

Wijzigingen in de grid k:wmen bestaan uit:

"' wijzigen van 1 datum of wijzigen van een teken; in het laatste geval zullen alle datums in dit token gewijzigd moeten worden.

Bij het indrukken van de muisknop wordt om het geselecteerde datum een rechthoek getekend.

Deze

rechthoek volgt de bewegingen van de muispunt en wel zo, dat steeds het token, waarin, of ter breedte wacnvan, de muispnnt zich op zeker moment bevindt, wordt omvat. Keert de muispunt terug naar het aanvankelijk aangewezen datum, dan wordt alleen dit datum omrand. Pas bij het loslaten van de muisknop wordt beslist tussen wijziging van een datum of van een teken (zie 2.5.3).

Iedere muisbeweging, hoe klein ook, genereert een event. Het zal duidelijk zijn, dat het bij elke beweging steeds opnieuw tekenen van de (ook ongewijzigde) rechthoek het systeem, ondanks zijn snelheid, hopeloos vertraagt. Daarom wordt met behulp van een array van 10(1) booleans beslist of de oude rechthoek verwijderd moet worden en een nieuwe moet worden getekend.

Het X-Window systeem plaatst alle events, ter verdere afwerking, in een lijst. Om het systeem verder te versnellen worden bovendien alle events ten gevolge van een

muisbeweging, op de laatste na, zonder meer uit deze lijst verwijderd. Zo wordt alleen de laatste beweging (op het moment dat het systeem weer een event kan evalueren) ondezzocht en is de rechthoek synchroon met de actuele muispositie.

Indien er door de muisbeweging een teken buiten de rand van het beschikbare window aangewezen dreigt te worden, wordt de inhoud van het window zo verschoven (gescrolld), dat dit laatst aangewezen teken zichtbaar is.

Daartoe wordt het gedeelte van het window, dat zowel voor als na verschuiven zichtbaar blijft, verplaatst en vervolgens wordt de hele grid op de juiste positie opnieuw getekend. Het tekenen van de hele giid geeft geen merkbare vertraging ten opzichte van het gedeeltelijk tekenen en is makkelijker te implementeren.

(29)

Spraakmaker User Interface De Grid-editor: reactie op de events

2.5.2.2 (Ont)koppelen van een syncmark

Vanaf het midden van de aanvankelijk geselecteerde syncmark wordt een 'elastiekje' (in X-Windows termen 'rubber band') getekend naar de positie waar de muispunt zich op dat

moment bevmdt.

.

.,

m

ctj.~kjwjljJjljs

bje

~ ~ ~Ntl~ ~ ~J;

De twee syncmarks, die mogelijk voor koppeling in aanmerking komen, worden dik weergegeven. Wijzigingen in zowel

het elastiekje als het dik weergeven I 8 12 14 15 107 106 16 .

J~

1~~0 1J : . van de het laatst aangewezen syncmark 15 l3 109 111 113

lOS 110

geschieden door tijdens de beweging op Afb 7 Koppeling van twee syncmcaks

de 'oude' positie opnieuw, maar dan geïnverteerd, te tekenen. Het getekende weer verdwijnt dan weer. Daarna worden met de nieuwe waarden de actuele posities aange-geven.

Ook hier geldt dat ten behoeve van de snelheid onnodige events ten gevolge van muisbewegingen uit de lijst van af te werkenevents verwijderd worden (zie 2.5.2.1). Het testen of een nieuw elastiekje getekend moet worden is niet nodig, omdat altijd de actuele muispositie aangegeven wordt.

Zodra de muis na het aanklikken beweegt, verandert de muispunt (die was een open schaartje) weer in de normale toestand. Komt de muispunt daarna weer in de buurt van de aanvankelijk aangewezen syncmark (in de aanvankelijk aangewezen stream), dan

verandert de muispunt weer in het open schaartje ten teken dat alsnog een ontkoppeling is geselecteerd. 2.5.3 Loslaten van muisknop (ButtonRelease)

Tijdens het bewegen van de muis geeft de editor voortdurend terugkoppeling aan de gebruiker over wat bij loslaten van de muisknop geselecteerd zou worden. Echter, pas bij het loslaten van de muisknop wordt bepaald welke actie daadwerkelijk uitgevoerd wordt: een wijziging, een invoeging of een (ont)koppeling.

2.5.3.1 Wijziging van datum of token

Ten gevolge van de mogelijkheid van het bewegen van de muis is tot op het laatste

moment onduidelijk of er een datum, 1 token of meerdere tekens gewijzigd moeten worden. Pas nadat de muisknop is losgelaten staat deze keuze vast. Derhalve wordt ook hier

nogmaals, aan de hand van de huidige positie van de muispunt ten opzichte van de oorspronkelijke, bepaald wat gewenst is.

(30)

Spraakmaker User Interface De Grid-editor: reactie op de events

Wordt thans weer het oorspronkelijk geselecteerde datum aangewezen, dan wordt alleen de wijziging van dat datum voorbereid.

syl 1 syl

g

/e

jg

/el

1-1 I

Afb 8 Selectie van een datum (het datum is hier tevens token)

Wordt in het oorspronkelijk aangewezen teken buiten het oorspronkelijke datum de

muisknop losgelaten, dan is de wijziging van een teken verlangd. Er wordt dan de wijziging van het bovenste datum in dat teken voorbereid.

Wordt buiten het aanvankelijk aan gewezen teken de muisknop losgelaten, dan is de vervanging van meerdere tekens door een teken gewenst. Ook dan wordt de invoer van het eerste datum in dit nieuwe teken voorbereid.

'Voorbereiden' wil hier zeggen, dat in het midden van het te wijzigen datum een klein rechthoekje verschijnt met daarin een liggend streepje als 'cursor'. Hiermee wordt

aangegeven, dat vanaf dit moment invoer van karakters via het toetsenbord mogelijk is.

syt 5)·t

1

njojg

wjoJtl

nOxwYn 1 1 -syl 11

ltl;;

•l' '(

syl ~·I syl

kj:~/:~

Is

vj

k

_,

~

fll

I

-,

:'1

I " !!In

~1

..

~ 1~

Afb 9 Selectie van meerdere tokens

2.5.3.2 Invoeging van een token

Het gebied tussen de oorspronkelijke syncmark en de nieuwe, die verschenen Js bij het indrukken van de muisknop, wordt nu schoongemaakt, er wordt een rechthoekje omheen getekend en de invoer van het eerste datum wordt voorbereid. Dit voorbereiden is hier hetzelfde als bij de wijziging (paragraaf 2.5.3.1).

2.5.3.3 (Ont)koppelen van syncmarks

Indien de muispunt (weer) in de buurt van of op de oorspronkelijk geselecteerde syncmark staat, betekent dit de ontkoppeling van deze syncmark; dit gebeurt echter niet nu, maar

(31)

Spraakmaker User Interface De Grid-editor: reactie op de events

door het opnieuw indrukken van :tvm3. 'ZD kan tegelijk in meerdere strecnns de syncmark ontkoppeld worden van de syncmark in de niet geselecteerde strecnns. (Zie ook 2.5.1.2) Staat de muispunt niet bij de oorspronkelijk aangewezen syncmark dan betekent dit een koppeling. Het loslaten van de muisknop heeft tot gevolg dat het elastiekje verdwijnt en dat de twee syncmarks (in alle strecnns) aan elkaar gekoppeld worden. Dit geldt echter alleen, indien de laatst aangewezen syncmark dik weergegeven was (en dus ook gekoppeld kon worden). Was dit niet zo, dan heeft het loslaten van de muisknop verder geen gevolgen voor de grid.

lm dlilkl\\ m d tlklwliiJitls h m <ljljk!wji!Jjljs

l~l ~

1:

1~ ~

1·~

1

~ n~ ~1~1:1~ ~

1'~

1

~ 1:1~ ~·~~ 1~1~

•I syl srl syl :· ~·I syl

0 S 12 14 I 8 13 ]5 110 J] I 8 107 J.l 15 17 tJ

107 106 107

u

109 17 ~ ·100 106 16 lS OS 13 t5 lOS 16 IS I 15 13 109 111

lOS 106 111 lOS 110

a voor de koppeling b na de koppeling c na de ontkoppeling

Mb 10 Wijzigingen in de grid ten gevolge van (ont)koppeling (let op sync::marks 12, 107 en 400)

2.5.4 Invoer vanaf toetsenbord (KeyPress)

Invoer vanaf het toetsenbord geschiedt in principe op gelijke wijze voor wijziging van een datum, een of meerdere token(s) en voor invoeging van een nieuw token; de beschrijving van de acties wordt daarom hieronder voor al deze situaties gegeven.

Na het loslaten van de muisknop wordt het inlezen van de toetsaanslagen voorbereid (zie hiervoor). Vanaf dit moment is invoer vanaf het toetsenbord mogelijk. Wordt op een ander moment een toets ingedrukt, dan wordt die niet verwerkt en geeft het systeem een

geluidssignaal.

Het X-Window systeem heeft de mogelijkheid een string als geheel in te lezen. Van deze mogelijkheid is hier geen gebruik gemaakt, omdat dan de invoer pas onderbroken kan worden door bijvoorbeeld een actie met de muis nadat de invoer Js afgesloten met

[RE'I'URN].

Hier gebeurt het inlezen toets-voor-toets:

Allereerst wordt gecontroleerd of het een geldige toets is (speciale toetsen zoals functietoetsen en dergelijke hebben in de editor geen functie) en vervolgens wordt

onderzocht of [BACKSPACE] Js ingedrukt en zo ja, dan wordt de laatste geldige toetsaanslag verwijderd.

Van de geldige toetsaanslagen wordt het corresponderende karakter in het rechthoekje met de cursor geplaatst, nadat het rechthoekje met de breedte van het karakter Js uitgebreid. De cursor wordt wederom rechts toegevoegd. De uitbreiding van het rechthoekje geschiedt zo,

(32)

Spraakmaker User Interface De Giid-editor: reactie op de events

dat zijn midden op de plaats blijft. De uitbreiding is in principe onbeperkt in omvang, zodat het kan voorkomen, dat een invoer zelfs over de randen van de op dat moment getoonde grid komt.

De invoer wordt afgesloten met [RE'I'URN].

Was voorheen alleen wijziging van een datum geselecteerd, dan bewerkstelligt het

indrukken van [RE'I'URN], dat de hele selectie wordt afgesloten en de gewijzigde grid in het window getoond wordt.

Was echter een teken geselecteerd, dan wordt na [RE'IURN] het inlezen van het volgende datwn (de volgende substream) voorbereid en uitgevoerd, totdat alle datwns van dat teken geweest zijn. Pas daarna wordt de selectie afgesloten en de gewijzigde grid getoond.

Was meer dan een teken geselecteerd, dan worden al deze tekens vervangen door het ene nu ingevoerde teken. syl syl

I

nlolg wHII

nOxwYn - 1 - - 1 -syl syl

11 I

lig

"I·"

I

:lIs

!@.. x k _I s

-

-

- I

-syl syl

:tI

n ~I P.

+

I . ·\ n x <lJ

-

I

a na de selectie, voor invoer

b tijdens invoer

syl

sje

n x~

syl syl

I

syl

I

srl

I

syl syl

njolg wjelljnjljgkjaj.tlsvj:.l n gje

n 0 x w Y n

\'eJ·an

A - I - - I - der

in!

(33)

Spraakmaker User Intertace De Grid-editor: reactie op de events

c na voltooiing van de invoer

(34)

Spraakmaker User Intertace De Grid~tor: reactie op de events

2.5.5 Overige gebruikte events

De overige events die in paragraaf 2.4 zijn vermeld hebben te maken met de interactie tussen de grid~tor en de intertace besturing. Later, bij de bespreking van de koppeling tussen beide, zullen ze nog uitgebreid aan de orde komen; hier volgt slechts een korte beschrijving van hun flmctie en de reactie in deze module op hun optreden.

2.5.5.1 Binnenkomen 1n window (EnterNotify)

Dit event treedt op als de muispunt het window van de gnd-editor binnenkomt: het programma signaleert dit door de variabele pointer op 1 (• true) te zetten.

2.5.5.2 Verlaten window (LeaveNotüy)

Evenzo wordt bij het verlaten van het window de variabele pointer op 0 (• 1alse) gezet.

2.5.5.3 Verandering L"l zichtbaarheid van het window (Expose)

Het kan voorkomen dat door een buiten de editor gelegen oorzaak (een gedeelte van) het window weer zichtbaar wordt, na bedekt te zijn geweest door bijvoorbeeld een ander window. Het systeem geeft dan deze event af, waarop de editor de op dat moment actuele grid opnieuw tekent.

zo

kan het gebeuren, dat vanuit de intertace besturing een menu optie opgeroepen wordt. Er verschijnt dan onder de menubalk een klein window met de diverse

keuzemogelijkheden, dat een gedeelte van de editor bedekt. Na het maken van een keuze en het verwijderen van dit menu-window genereert het systeem een Expose, die in de editor gebruikt wordt als signaal om de (gedeeltelijk overschreven) inhoud van de editor opnieuw op het scherm te brengen.

2.5.5.4 ConfigureNotify

Deze event wordt gegenereerd als de intertace besturing de controle MOET overnemen, om welke reden dan ook; de editor moet dit dan dus ook zonder meer toestaan, hetgeen gebeurt door de controle variabelen (ge_status en pointer) zo'n waarde te geven dat de lus onmiddellijk verlaten wordt.

(35)

Spraakmaker User Intenace De Grid-editor: verwerking van wijzigingen

2.6 Verwerking van wijzigingen

De verwerking van de wijzigingen, die in de grid zijn aangebracht, zijn te onderscheiden in twee categorieën:

- wijziging met betrekking tot datums enjof token(s) - wijziging met betrekking tot syncmarks.

Beide categorieën wijzigmgen kunnen op drie niveaus beschouwd worden: - de gevolgen voor de in het window getoonde grid

- de gevolgen voor de database die aan de grid ten grondslag ligt - de gevolgen voor de verdere analyse van de tekst.

2.6.1 Wijziging van datum of token(s)

ZOlang niet [RE'I'URN] is ingedrukt bij de wijzigmg van een datum of bij wijziging van het laatste datum van het teken, worden de wijzigingen in een tijdelijke buffer bewaard. Deze buffer maakt het mogelijk de gewijzigde gegevens alvast in het window te tonen, maar maakt ook nog een herstel naar de oude waarden mogelijk.

Pas nadat de hiervoor bedoelde [RETIJRN] is afgegeven worden de wijzigingen in de

database opgenomen. Dit betekent dat alle waarden, nodig om de grid te tonen, gebaseerd zijn op de wijzigingen en een direct herstel niet meer mogelijk is.

Een herstel kan vanaf nu alleen geschieden door een hernieuwde invoer van de oude waarden.

De wijzigingen moeten tevens kenbaar gemaakt kunnen worden aan het spraakmaker systeem ten behoeve van verdere analyse. Daartoe worden de wijzigingen op het moment dat de hiervoor bedoelde [RE'I'U'RN] wordt ingedrukt, toegevoegd aan een tweetallijsten (een voor verwijderingen en een voor toevoeg1ngen). De gegevens die deze lijsten bevatten kunnen dan op een geschikt moment aan het spraakmaker systeem aangeboden worden, waarna de lijsten kunnen worden geleegd. Bij de bespreking van de koppeling (paragraaf 3.2) zal hierop nader worden ingegaan.

(36)

Spraakmaker User Inteliace De Grid-editor: verwerking vcm wijzigingen

2.6.2 Wijziging van syncmarks

ZOlang de muisknop is ingedrukt is een selectie nog niet definitief; een eventueel getoond

'elastiekje' en tweede syncmark kunnen nog gewijzigd worden. Deze wijzigingen worden

lokaal in het window aangebracht, zodat aan de data in de database niets verandert. Pas bij het loslaten van de muisknop kan aanpassing van de database nodig zijn:

Is in principe koppeling mogelijk dan volgt een procedure als hieronder beschreven. Kan er bij het loslaten van de muisknop niet gekoppeld worden, dan bestaat de mogelijkheid om dezelfde syncmark in andere streams te selecteren. Dit kan totdat MB3 ingedrukt wordt, waarna alle geselecteerde syncmarks losgekoppeld worden van de niet geselecteerde met hetzelfde nummer. Daartoe wordt een lijst van geselecteerde streams bijgehouden, totdat de ontkoppeling heeft plaats gevonden. Ook nu weer betekent het indrukken vcm de middelste muisknop {lvm2) een undo. Na voltooting of teniet doen wordt de lijst geleegd voor de volgende actie.

Ten behoeve van het testen of twee syncmarks inderdaad aan elkaar gekoppeld kunnen worden -ontkoppeling is altijd mogelijk -, bevat Spraakmaker een zeer complex algoritme. Het zou dubbelop zijn dit hele algoritme ook nog eens in het inteliace onder te brengen. Anderzijds moet tijdens muisbewegingen, dus snel, een reactie aan de gebruiker gegeven worden of koppeling mogelijk is. Daarom is besloten in het intartace een voorlopige test uit te voeren, die de beslist onmogelijke koppelingen alvast uitsluit. Dit houdt wel in, dat, nadat de gewijzigde integer waarden vcm de te koppelen syncmarks aan Spraakmaker zijn

aangeboden, Spraakmaker eerst een terugmelding met een al dan niet accoord bevinding aan het inteliace moet geven, voordat koppeling op het scherm zichtbaar gemaakt wordt. In paragraaf 3.2 zal bij de bespreking van de (problemen met de) koppeling van het Inteliace aan Spraakmaker blijken, dat vele problemen daarbij vooralsnog onopgelost zijn gebleven. De communicatie inzake de te koppelen syncmarks is een van deze problemen. In verband hiermee is nog geen aandacht besteed aan een (voorlopige) koppeling, dus een voorziening om te koppelen syncmarks tijdelijk op te slaan. In de plaats daarvan worden de data binnen het Intenace herberekend bij slagen van de (onvolkomen) test en wordt de gewijzigde grid getoond. Bij uitzondering kan dit leiden tot onbruikbare resultaten en een onleesbare grid.

Met een (hopelijk ooit geslaagde) koppeling in het vooruitzicht is dit op de koop toe genomen.

(37)

Spraakmaker User Intenace Koppeling: user intenace modules onderling

Hoofdstuk 3: Koppeling

De koppeling die in het project moet geschieden valt uiteen in twee onderdelen: - de koppeling tussen de modules van het User Interface onderling en

- de koppeling van het User Interface aan de in Prolog geschreven Spraakmaker

3.1 User Interface modules onderling

3.1.1 Dataoverdracht

De modules die ten behoeve van het User Intenace zijn ontworpen zijn alle geschreven in C. Als de data eenmaal van Prolog zijn ontvangen, kunnen die in deze modules probleemloos veiWerkt worden. Middels een opgebouwde datastructuur en enkele hulpstructuren zijn de noodzakelijke data in alle modules toegankelijk.

3.1.2 Coördinatie van events

zowel de grid-€Clitor als de interface besturing maken gebruik van muis, toetsenbord, en dus vanevents.

In de intenace besturing wordt daarbij gebruik gemaakt van de Toolkitfunctie:

;· Sit around forever waiting to process X-events. We never leave XtMainLoop. From here on, we only execute our callback routines. •;

XtMainLoop();

waarvan het commentaar terecht zegt, "dat we die nooit verlaten en van hier uit alleen "callback"routines aanroepen.

Het aanroepen van deze functie houdt impliciet in, dat alle in het window toegelaten events onderzocht worden. Met behulp van de functie:

void display _tekst()

{ I 1f (giid_displayed -- 0) { I XtAddEventHandler(widget_array[work_area],

StructureNotifyMask: I ButtonPressMask I EnterWindowMask, TRUE,WorkAreaEventHand.ler,O);

grid_displayed- 1;

wordt, zodra de grid-€Clitor wordt opgeroepen, het automatisch attesten van de events gedeeltelijk vervangen door een eigen test. De functie XtAddEventHandler<> staat toe dat voor

(38)

Spraakmaker User Intertace Koppeling: user intertace modules onderling

een nader opgegeven w:indow (hier widget_cmay[work_area] - het w:indow van de grtd-editor) nader opgegeven events (hier ButtonPressMask • indrukken mutsknoppen en EnterWindowMask •

birmenkomen in w:indow) door eigen routines verwerkt worden. De routine: XtEventHandler WorkAreaEventHandler(wkiget.tag,event) Widget widget; I char "tag; XEvent •event; switch (event->type) 1 case ButtonPress : it (giid_clisplayed. •• 1) usewindowO; break; case EnterNotify: I XSendEvent(dpy,win,False,EnterWindowMask,event); it (giid_clisplayed -- 1) usewindowO; break;

die deze verwerldng regelt, roept telkens bij het binnenkomen in het editorw:indow of het optreden van een muisindruk in dat w:indow (vanuit de interface besturlng) de (editor-)functie use_windowo aan, die leidt tot overname van de controle door de editor. De controle door de editor loopt dus als routine binnen de routine XtMainLoop().

In hoofdstuk 2 staat beschreven dat de grid-editor eveneens een lus bevat die in prindpe nooit verlaten wordt. Ter herinnering:

w.hile (ge_status I I pointer) {

XNe:r:tEvent(dpy, &event); ;·wacht tot ereenevent komt·;

event.type &• Ox7f; j" gebrujk ook een door het progromma gegenereerde event • 1

Slechts indien zowel ge_status 0 (is F ALSE) is -er is dan geen editor functie lopend - alsook

pointer 0 is muis is buiten het editor w:indow wordt de editor controle verlaten en is

-automatisch -XtMainLoop() weer actief.

Op deze manier is - op een hierna te bespreken probleem na - de interactie tussen beide lussen gerealiseerd.

3.1.3 Communicatie probleem

Het gebruik van de hiervoor gepresenteerde oplossing bleek vene van vlekkeloos te verlopen. Soms kreeg de editor de controle onverwacht niet, soms weer wel. Het probleem deed zich voor nadat vanuit de menubalk een optie opgeroepen was.

(39)

Spraakmaker User Inte:dace Koppeling: coördinatie van events

Zonder de hele theorie te hebben kunnen achterhalen, leek het probleem voort te komen uit

het feit, dat zowel

- de boven de editor aanwezige menubalk als

- elke (continu zichtbare) keuzemogelijkheid uit deze balk alsook

- elk bij aankl.ikken van een keuzemogelijkheid verschijnend window alsmede - elke keuzeregel in dit window

een apart widget (• eenvoudig window) bleek te zijn.

Zodra een window verlaten wordt geeft het systeem een event (LeaveNotify) af aan dat window en zijn parents. Evenzo geeft het systeem bij binnenkomen in een window een

EnterNotify af aan dat window en zijn parents.

Gezien de stapeling van de menu-windows leidt het met de muis bewegen over de diverse menu opties tot een massa events. Vele van deze events worden door XTMainLoopO binnen de intenace besturing ondervangen dan wel afgehandeld. Bij overschrijden van de randen van deze windows en tegelijkertijd binnenkomen in de editor dringen onvoorspelbare aantallen events echter tot de editor door.

Het is (vanwege bijvoorbeeld de noodzakelijke variabele pointer, die aangeeft of de muispunt zich in of buiten het window van de editor bevindt) beslist noodzakelijk zowel LeaveNotlty als EnterNotlty te gebnllken, zodat het niet tot het window laten doordringen van deze events niet

in aanmerking komt.

Een intensief gebruik van de 'try-and-error methode' leverde een oplossing:

- verwijder alle events, behalve de laatste, bij het afhandelen van LeaveNotify en Entemotify,

- laat de inte:dace besturing bij de overdracht van de controle aan de editor een EnterNotlty

generen en

- gebruik deze (programma-)event als signaal voor de editor, dat hij de grid moet tekenen en de controle moet overnemen.

Deze methode blijkt in de praktijk te werken; een intensievere bestudering van de theorie achter X-Windows, en met name de events, zal wellicht een betere oplossing aandragen. 3.2 Inte:dace aan PROLOG

Aangezien in het voorgaande vaker verwezen is naar deze koppeling, zal ik hier kort op ingaan, hoewel de realisatie ervan niet mijn werk is.

Hoewel het bij ons project gebruikte Prolog-systeem geen objectcode genereert, die

meegelinkt zou kunnen worden met in andere talen geschreven code, kent het systeem een goed bruikbaar inte:dace met derde generatie talen als FORTRAN, P.ASC.Al., C en dergelijke.

Referenties

GERELATEERDE DOCUMENTEN

4p 17 Toon met behulp van de grafiek op de uitwerkbijlage aan of de inzittenden van het ruimteschip zich astronaut mogen noemen na

Het doel van de opdracht is het definiëren/specificeren van een User Interface, die gebruikt kan worden in de standaard besturingssoftware van de productie machines ontwikkeld

Topic of the assignment: Creating a chatbot user interface design framework for the Holmes cyber security home network router for the company DistributIT.. Keywords: cyber

The aim of this bachelor assignment is to develop the user interface and functionalities for a new software aimed at Data Protection Officers, for the client

2) het aanmaken van een spelers profiel en aanmelden voor toernooi. 3) Inchecken voor toernooi en klaar om te spelen.. Het user account bestaat uit een emailadres

In het geval dat een indiener van een interventie meent dat bij de beoordeling van haar interventie procedureel onjuist is gehandeld, of dat de criteria voor Goed Beschreven

Wel zal in de Nota van toelichting voor de volledigheid worden uiteengezet dat aanbieders van telecommunicatiediensten en transmissiediensten op netwerken die voor omroep

Een partij steunt het streven om met de voorgestelde regeling de in haar ogen te hoge tarieven voor het bellen naar niet geografische nummers aan te pakken, maar betwijfelt of