abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 13:22 | IT novinky

Samsung oznámil, že program Linux on DeX končí. Android 10 už nebude podporován. Linux on DeX umožňuje spouštět linuxový desktop a aplikace z vybraných telefonů od Samsungu připojených pomocí Samsung DeX.

Ladislav Hagara | Komentářů: 3
dnes 12:00 | Komunita

Ubuntu slaví 15 let od vydání první verze. Přesně před patnácti lety, 20. října 2004, byla vydána první verze 4.10 s kódovým názvem Warty Warthog.

Ladislav Hagara | Komentářů: 0
včera 20:20 | Pozvánky

Ve středu 23. října 2019 se od 16.00 koná akce na téma Oracle Labs - Live for the Code. Představí projekty Oracle Labs, na kterých se pracuje i v České republice: Oracle Labs Data Studio a GraalVM. Místo konání: budova Oracle v Praze–Jinonicích. Vstup po registraci zdarma. Občerstvení zajištěno.

Ladislav Dobiáš | Komentářů: 1
18.10. 09:44 | Upozornění

Byly zveřejněny videozáznamy přednášek z konference LinuxDays 2019, která proběhla 5. a 6. října v Praze. Odkazy na videa společně s prezentacemi naleznete v programu, případně můžete jít rovnou na stránku video. Záznamy pořizovalo Audiovizuální centrum SiliconHill.

Petr Krčmář | Komentářů: 18
17.10. 18:55 | Nová verze

Bylo vydáno OpenBSD 6.6. Opět bez oficiální písně. Z novinek lze zmínit například sysupgrade(8).

Ladislav Hagara | Komentářů: 5
17.10. 08:36 | Nová verze

Vyšla nová verze monitorovacího řešení Centreon 19.10.0. Novinek je spousta (realtime API, podpora JIRA, vylepšený systém notifikací...), ale těmi nejdůležitějšími je pro mnohé uživatele podpora nové verze rrdtool 1.7.x a php 7.2. Systém tak půjde bez problémů provozovat na jiných distribucích než CentOS 7. Kompletní přehled novinek v seznamu změn. Předpřipravená appliance i samotné části jsou k dispozici na oficiálních stránkách.

Max | Komentářů: 0
17.10. 01:00 | Komunita

Dnes vyjde Ubuntu 19.10 s kódovým názvem Eoan Ermine. Přehled novinek v poznámkách k vydání. Ubuntu 20.04 LTS bude Focal Fossa.

Ladislav Hagara | Komentářů: 14
16.10. 22:11 | Zajímavý projekt

Padesátiny Unixu lze oslavit také hrou The Unix Game aneb na unixové roury pomocí Scratche.

Ladislav Hagara | Komentářů: 2
16.10. 21:44 | Komunita

Vývojáři svobodného 3D softwaru Blender oznámili, že nejnovějším firemním sponzorem Blenderu je společnost Adidas. Jedná se o úroveň Corporate Silver, tj. 12 tisíc eur ročně.

Ladislav Hagara | Komentářů: 37
16.10. 18:22 | Komunita

V září proběhla každoroční konference Akademy komunity KDE. Nyní jsou záznamy přednášek dostupné online. Témata se dotýkají aplikací a knihoven KDE, jejich adaptaci pro různá speciální použití (vestavěná zařízení či rozšířená realita) i obecně vývoje a distribuce softwaru.

Fluttershy, yay! | Komentářů: 0
Kdy jste naposledy viděli počítač s připojeným běžícím CRT monitorem?
 (20%)
 (4%)
 (11%)
 (39%)
 (24%)
 (2%)
Celkem 435 hlasů
 Komentářů: 23, poslední dnes 18:52
Rozcestník

www.AutoDoc.Cz

Kommander - 2 (Starý parser)

13. 10. 2005 | Michal Vyskočil | Programování | 6150×

Kommander je nástroj pro psaní jednoduchých aplikací s grafickým uživatelským rozhraním. Dnes si více rozebereme výhody a nevýhody starého parseru. Zmíním i možnost používat jiný skriptovací jazyk než shell.

Vkládání příkazů

Skript v Kommanderu je běžný textový SGML soubor. Můžeme jej tedy editovat ve svém oblíbeném editoru (například ve vimu), Většina lidí ale asi využije spíše prostředí Kommander Editoru. Příkaz Edit Kommander Text nás zavede do editačního okna, které jsme viděli v předchozím dílu (Kommander - 1 (Skriptované GUI)). Teď si je popíšeme podrobněji.

kommander 2 kommander text 3

  1. Zde vybereme widget, pro který budeme psát obslužný skript. Pokud nám nevyhovuje rozbalovací seznam, tak vedlejší tlačítko zobrazí widgety ve formě stromu.
  2. Seznam Text for vybírá akci, při které dojde ke spuštění skriptu. Prvek Installer má vyplněnou akci initialization. To znamená, že daný kód se provede při inicializaci okna formuláře.
  3. Tento prvek by se měl jmenovat spíše Insert widget, protože slouží ke vložení jména widgetu do textu.
  4. File zobrazí dialog, v němž vybereme soubor, jehož obsah se vloží do našeho skriptu
  5. Pravděpodobně nejdůležitější tlačítko (především pro začátečníky) je Function..., které zobrazí seznam všech funkcí a příkazů Kommanderu. V něm si každý může najít potřebné funkce, včetně jejich popisu.

kommander 2 functions browser

Toto okno je velmi praktické, protože vám umožňuje snadno proniknout do hlubin Kommanderu a jeho funkcí. Příkazy jsou rozděleny do sedmi skupin:

  • Array - funkce pro práci s poli.
  • DCOP - což jsou funkce pro obsluhu widgetů. Každý widget má skupinu funkcí, kterým rozumí. Viz KDE: tipy a triky - III (DCOP a KDialog).
  • File - funkce pro práci se soubory.
  • Input - zobrazuje vstupní dialogy (v minulém díle jsme viděli příkaz savefile).
  • Kommander - klíčová slova a příkazy Kommanderu - (@if, @exec, ...).
  • Message - zobrazuje okna se zprávami.
  • String - funkce pro práci s řetězci.

Ve sloupci Parameters vidíme parametry dané funkce a poslední sloupec obsahuje krátký popis funkce a její syntaxe. Tlačítko s velkou modrou šipkou pak vloží text do spodního textového pole a stiskem OK dojde k vložení funkce do kódu. Vzhledem k této skutečnosti je zbytečné psát referenční příručku ke Kommanderu, vše potřebné máte v okně Functions Browser. Ale pokud byste na ní trvali, tak ji naleznete na docs.kde.org. Dále raději píšu o věcech, které takto nezjistíte - a některé z nich mi daly pořádně zabrat, než jsem na ně přišel.

Akce

Každý widget má množinu akcí, které může vykonat. Nejčastější akce jsou default a population. Nejčastěji používanou je právě default, která třeba u tlačítka značí jeho stisknutí. Formuláře navíc mají initialization a destroy, které se provádí při statu a ukončení aplikace.

Akce default se spouští při zavolání prvku. Nejjednodušším příkladem je rozbalovací seznam ComboBox1, který v této akci má napsáno @widgetText. Tím dojde k tomu, že budou následující ekvivalentní.

@ComboBox1
@ComboBox1.text

Samozřejmě může být v oné akci napsán jakýkoliv kód, například transformace textu na něco jiného.

Check Boxy (přepínače) a Radio buttony (skupinové přepínače) nemají akci default. Namísto toho mají checked, semichecked a unchecked. Kód se spouští, pokud je tlačítko vybráno, napůl vybráno (pokud je třetí stav povolen) nebo nevybráno. Díky tomu nemusíme stav tlačítek zjišťovat, stačí potřebný kód napsat do odpovídajících sekcí.

Ukázková aplikace

Původně jsem chtěl pro demonstraci vlastností jazyka Kommanderu použít některou z existujících aplikací, ale nakonec jsem si ji musel sám napsat. Nedělá sice nic užitečného, ale je jednoduchá a přizpůsobena tomuto seriálu. Můžete si jí stáhnout a vyzkoušet.

kommander 2 demo 1

Proměnné

Pokud, stejně jako já, považujete proměnné za základ všech (tedy alespoň procedurálních) programovacích jazyků, pak asi zažijete menší šok. Práce s proměnnými je v Kommanderu docela zamotaná a co víc, dokumentace (které není mnoho) o tomto tématu mlčí.

Takže mi nezbývalo nic jiného, než se ponořit do čtení zdrojových kódů aplikací napsaných v Kommanderu. Tak jsem objevil čtyři způsoby, jak Kommander pracuje s proměnnými:

  1. Proměnné prostředí - dříve se k nim přistupovalo poněkud krkolomně pomocí příkazu @exec(echo $FOO). Dnes již Kommander obsahuje funci @env(FOO).
  2. Proměnné v shellu - protože obslužné rutiny běží v shellu, je používání proměnných úplně stejné. Uvozují se znakem $.
  3. Globální proměnné - způsob, který je hojně využívám v instalátoru, a znáte jej i z minulého dílu. Klíčem jsou dvě funkce @setGlobal(foo, hodnota) a @global(foo). Jak už jsem říkal, každý obslužný skript běží samostatně, a proto proměnné, které potřebujeme i jinde v programu, musíme převést na globální.
  4. Proměnné v cyklech - jazyk Kommanderu obsahuje i svoje speciální cykly a v nich se používají proměnné. K těmto proměnným se přistupuje pomocí znaku @.

    @for(i,1,5,1)
      @Message.info(@i)
    @endif

Na tomto by snad nebylo nic tak těžkého, kdyby... Naprosto neřešitelným problémem pro mě bylo, jak použít proměnnou shellu jako parametr některé z funkcí. Vysvětlím na malém příkladě. Mám proměnnou foo a chci její obsah uložit do widgetu label. Kód, který by asi každý napsal nějak takto:

foo="Hello, world!"
@label.setText($foo) # nic se nestane
@label.setText(@foo} # chyba, @foo není definován

nefunguje. Nakonec se mi podařilo najít řešení v podobě výrazu:

foo="Hello, world!"
dcop @dcopid KommanderIf setText label $foo

Tedy řešení. Po tomto zjištění jsem se pokorně vrátil ke globálním proměnným. Zůstala jedna výhoda. Alespoň teď vidíme, jak přesně starý parser Kommanderu pracuje.

@Widget.názevFunkce(Obsah) # se převede na volání
dcop @dcopid KommanderIf názevFunkce Widget Obsah

Pokud neznáte DCOP (Desktop COmmunication Protocol), potom vězte, že se jedná o rozhraní, kterým spolu mohou programy (nejčastěji v KDE) komunikovat. Prvním parametrem na příkazovém řádku je identifikační číslo běžícího skriptu. Dále následuje jméno rozhraní, jméno funkce. Potom následují parametry pro funkci setText, a to jméno widgetu a text, který se má vložit. Více o DCOP naleznete v článku KDE: tipy a triky - III (DCOP a KDialog).

Klíčová slova Kommanderu

Přiznám se, že konceptu klíčových slov Kommanderu příliš nerozumím. Jistě, je dobré mít příkazy jako @dcopid, který vrací identifikaci běžícího okna. A nebo příkazy pro práci s globálními proměnnými a podobně.

Ovšem smysl příkazů @if, @for a @while mi uniká. Přesto jsou součástí jazyka. Jenže jejich implementace je více než podivná! První nevýhodou je, že není možné tyto příkazy zanořovat! Kód

@if ( ...)
  @if ( ... )
  @endif
@endif

skončí chybovým hlášením Unknow special: endif! No a věc, která mě dostala ještě více, je nepřítomnost klíčového slova @else. Díky tomu je tato podmínka prakticky nepoužitelná.

Dalším aspektem, který snižuje použitelnost výrazu @if jsou neexistující konvence pro návratové hodnoty. Pravdivost příkazu @if je definována jako nenulové číslo, anebo neprázdný řetězec. Jenže taková funkce @String.find vrací při neúspěchu -1. Funkce @String.compare vrací při rovnosti řetězců 0, pokud je řetězec menší, tak -1, jinak 1. Což je implementace vhodná pro řazení řetězců, ale ne pro porovnávání rovnosti řetězců v podmínce. Pokud máte možnost, vyhněte se těmto funkcím, protože je evidentní, že je to celé šité horkou jehlou!

ScriptObject

Velkým rozdílem oproti klasickým skritpům je, že každý obslužný skript běží odděleně. U větších objektů potřebujeme udělat dekompozici a opakující se (nebo logické) části dát jinam. Řešením je widget ScriptObject. Tam si můžeme vložit potřebný kód a zavoláním @ScriptObject jej vykonáme. Tyto skripty trpí dvěma nevýhodami. Jednak netuším, zda vůbec podporují parametry (nikde jsem to nenašel). Dalším problémem je, že ač nevizuální, dělají problémy při používání správce rozložení.

Na druhou stranu jsou potřebné při používání signálů a slotů (více dále). Pokud chceme sofistikovanější funkce, nezbyde nám nic jiného, než použít klasický shellový způsob './cesta/k/souboru/knihovna.sh'. Tím bohužel přijdeme o výhodu Kommanderu, že je vše v jednom skriptu.

Signály a sloty

Signály a sloty je způsob, kterým spolu widgety z knihovny Qt mohou komunikovat (více viz Začínáme KProgramovať - I). A protože používáme Qt widgety, používáme i signály a sloty. V Editoru propojujeme patřičné signály se sloty v okně Edit Connections.

kommander 2 connections

Tento koncept se mi bez příkladu špatně vysvětluje. V demo aplikaci máte záložku Signály a sloty, kde máte příklad. Máme rozbalovací seznam (ComcoBox) jménem Partitions, který obsahuje seznam oddílů. Ten naplníme při startu příkazem

@Partitions.insertItems(@exec(df | awk '/^\/dev/ {print substr($1,6)}' | sort),0)

Tento kód nám naplní seznam všech oddílů bez úvodního /dev/. Nyní chceme zobrazit informace o celkové kapacitě, volném a použitém místě. V této chvíli využijeme ScriptObject z předchozí části, protože ten bude zjišťovat velikosti a vypisovat je.

@Space.setText(Kapacita @exec(df --block-size 1K -h /dev/@Partitions.text \
| awk '/dev/ {print $2}')B)

Zjištění jiných hodnot než celkové velikosti je už analogické. Stačí změnit parametr příkazu print.

Tento kód se bude provádět při startu, po naplnění seznamu. A dále po změně widgetu Partitions. K tomu je nutné správně propojit patřičný signál a slot, jak ukazuje tento obrázek.

kommander 2 connections-1

Odesílatelem je widget Partitions, který vyšle signál widgetTextChanged(const QString&) (textWidgetuZměněn). Příjemcem je objekt Size, respektive jeho slot execute (proveď se). Tím dojde při výběru jiného disku k aktualizaci hodnot.

Použití jiného skriptovacího jazyka

Při psaní kódu se nemusíte omezovat (ne)možnostmi shellu. Kommander nabízí snadnou integraci s jiným programovacím jazykem. V dokumentaci jsem nenašel, které jsou podporované. Osobně jsem zkusil Perl, Python a Ruby, ale předpokládám, že bude stačit, aby interpret dokázal načítat vstup ze standardního jazyka. Ostatně můžete vyzkoušet svůj oblíbený interpret (třeba interpret jazyka C?) a o výsledku poreferovat v diskuzi. Pro Pythonisty mám dobrou zprávu, Kommander zachovává odsazení, takže jeho používání nic nebrání.

 @execBegin(python)
 import os
 def hello():
  os.system('kdialog --msgbox "Hello from Python!"')
 hello()
 @execEnd

Jak vidíte, kód v Pythonu je uzavřen mezi @execBegin(python) a @execEnd. Uvnitř už můžete používat libovolné konstrukce Pythonu, případně Kommanderu. Podle dokumentace není doporučené psát tento kód v událostních skriptech jednotlivých widgetů kvůli možným problémům s návratovými hodnotami. Kommander rovněž neklade žádná omezení na počet použitých jazyků.

Problém se zavináčem

V Perlu i Ruby má zavináč syntaktický význam. Proto je nutné tyto výrazy uvodit ještě jedním zavináčem, aby je parser snadno poznal od svých výrazů.

@execBegin(perl)
open(MTAB, "/etc/mtab");
@@foo = <MTAB>;
foreach (@@foo) {
  print $_;
}
@execEnd

Závěr

Dnes jsme se seznámili s používáním Kommander Editoru. Zjistili jsme, co je to akce (omlouvám se za neoficiální překlad). Zkusili si nevýhody starého parseru Kommanderu (práce s proměnnými). Díky čemuž už víme, jak Kommander pracuje uvnitř. Dále známe potíže s některými klíčovými slovy a funkcemi. To, vše bylo motivací k tvorbě nového parseru.

Dále jsme se, pokud jsme už neprogramovali v Qt, seznámili s komunikací mezi widgety - signály a sloty. Za třešničku na dortu potom můžeme považovat možnost použít prakticky jakýkoliv jiný skriptovací jazyk. V dalším díle opustím starý parser a budu se věnovat tomu novému.

       

Hodnocení: 100 %

        špatnédobré        

Nástroje: Tisk bez diskuse

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

Marián Kyral avatar 13.10.2005 07:14 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše @String.compare
Funkce @String.compare vrací při rovnosti řetězců 0, pokud je stačí si to pamatřetězec menší, tak -1, jinak 1. Což je implementace vhodná pro řazení řetězců, ale ne pro porovnávání rovnosti řetězců v podmínce. Pokud máte možnost, vyhněte se těmto funkcím, protože je evidentní, že je to celé šité horkou jehlou!

Já bych spíše řekl, že tohle je standartní chování dle C :-)

Tam se běžně používá: if (!strcmp(....)), což znamená, že řetězce jsou stejné. Možná trochu matoucí, ale dá se na to zvyknout.
Marián Kyral avatar 13.10.2005 07:17 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: @String.compare
pokud je stačí si to pamatřetězec

Omlouvám se za ten zmatek, nějak jsem blbě kliknul, něco to udělalo, ale co, to jsem zjistil až když už bylo pozdě :-(
13.10.2005 11:18 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: @String.compare
To ano, ale parser Kommanderu by měl přece jenom pracovat na vyšší úrovni, než funkce z C. Ale máš pravdu, měl jsem to tam napsat.
When your hammer is C++, everything begins to look like a thumb.
13.10.2005 14:53 Jiří (BoodOk) Kadeřávek | skóre: 19 | blog: BoodOk | Brno
Rozbalit Rozbalit vše Kommander
Trochu jsem si s Kommanderem hral a musim rici, ze myslenka je vyborna, ale prakticka implementace problematicka. Prace s nim se mi zdala tezkopadna, nektera omezeni mi prisla nelogicka. Mozna za Erikovi krivdim, treba to proste neslo lepe implementovat, ale s Kommanderem se mi nepracovalo pohodlne.
Věda má v sobě určitou zpupnost, že čím dokonalejší techniku vyvineme, čím více se dozvíme, tím lepší budou naše životy.

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.