abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 18:00 | IT novinky

    DuckDuckGo AI Chat umožňuje "pokecat si" s GPT-3.5 Turbo od OpenAI nebo Claude 1.2 Instant od Anthropic. Bez vytváření účtu. Všechny chaty jsou soukromé. DuckDuckGo je neukládá ani nepoužívá k trénování modelů umělé inteligence.

    Ladislav Hagara | Komentářů: 1
    včera 14:22 | IT novinky

    VASA-1, výzkumný projekt Microsoftu. Na vstupu stačí jediná fotka a zvukový záznam. Na výstupu je dokonalá mluvící nebo zpívající hlava. Prý si technologii nechá jenom pro sebe. Žádné demo, API nebo placená služba. Zatím.

    Ladislav Hagara | Komentářů: 2
    včera 04:44 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 140 (pdf) a HackSpace 77 (pdf).

    Ladislav Hagara | Komentářů: 0
    včera 01:00 | Nová verze

    ESPHome, tj. open source systém umožňující nastavovat zařízení s čipy ESP (i dalšími) pomocí konfiguračních souborů a připojit je do domácí automatizace, například do Home Assistantu, byl vydán ve verzi 2024.4.0.

    Ladislav Hagara | Komentářů: 0
    18.4. 22:11 | IT novinky Ladislav Hagara | Komentářů: 0
    18.4. 20:55 | Nová verze

    Neziskové průmyslové konsorcium Khronos Group vydalo verzi 1.1 specifikace OpenXR (Wikipedie), tj. standardu specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro AR (rozšířenou realitu) a VR (virtuální realitu). Do základu se z rozšíření dostalo XR_EXT_local_floor. Společnost Collabora implementuje novou verzi specifikace do platformy Monado, tj. open source implementace OpenXR.

    Ladislav Hagara | Komentářů: 2
    18.4. 17:22 | Nová verze

    Byla vydána nová verze 0.38.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 4.4 nebo novější a také libplacebo 6.338.2 nebo novější.

    Ladislav Hagara | Komentářů: 13
    18.4. 17:11 | Nová verze

    ClamAV (Wikipedie), tj. multiplatformní antivirový engine s otevřeným zdrojovým kódem pro detekci trojských koní, virů, malwaru a dalších škodlivých hrozeb, byl vydán ve verzích 1.3.1, 1.2.3 a 1.0.6. Ve verzi 1.3.1 je mimo jiné řešena bezpečnostní chyba CVE-2024-20380.

    Ladislav Hagara | Komentářů: 2
    18.4. 12:11 | IT novinky

    Digitální a informační agentura (DIA) oznámila (PDF, X a Facebook), že mobilní aplikace Portál občana je ode dneška oficiálně venku.

    Ladislav Hagara | Komentářů: 10
    18.4. 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 2
    KDE Plasma 6
     (68%)
     (11%)
     (2%)
     (20%)
    Celkem 566 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Kommander - 2 (Starý parser)

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

    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.