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í
×
    včera 11:33 | Komunita

    Přímý přenos (YouTube) z konference LinuxDays 2026, jež probíhá tento víkend v Praze v prostorách FIT ČVUT. Na programu je spousta zajímavých přednášek.

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

    Byla vydána nová verze 0.17.0 programovacího jazyka Zig (Codeberg, Wikipedie). Přispělo 206 vývojářů. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    2.10. 21:00 | Zajímavý projekt

    Open-source projekt OpenDLSS-NR je 'bitově přesná reimplementace' neuronové rendrovací sítě DLSS 5 od společnosti NVIDIA, jenže pro grafické API Vulkan (DLSS slouží k vylepšování klasickým způsobem vyrendrovaných snímků pomocí lokálních modelů umělé inteligence, a to v reálném čase). Projekt není nijak spojen se společností NVIDIA, je pouze pro OS Windows a natrénované váhy modelu si uživatelé musí obstarat sami. Zdrojový kód je k dispozici na GitHubu, pod licencí MIT s výjimkou pro komponenty třetích stran.

    AfD 💙 | Komentářů: 0
    2.10. 20:55 | Zajímavý software

    Společnost Cloudflare představila Clef a Clef-Flash, open-source rozhodovací modely určené pro rychlou a konzistentní klasifikaci vstupů. Na rozdíl od klasických LLM vracejí tyto modely deterministické striktně typované strukturované odpovědi s exaktními pravděpodobnostmi, tedy odpovědi ve stylu přelomového modelu Jev.

    … více »
    AfD 💙 | Komentářů: 1
    2.10. 04:44 | Nová verze

    Byla vydána beta verze Ubuntu 26.10 s kódovým názvem Stonking Stingray. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 26.10 mělo vyjít 15. října 2026.

    Ladislav Hagara | Komentářů: 0
    1.10. 22:22 | Nová verze

    Byla vydána verze 1.99.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 5
    1.10. 18:11 | Komunita

    Od 13. do 15. října proběhne v Praze OpenSSL Conference 2026. Na YouTube lze zhlédnout videozáznamy přednášek z loňského roku.

    Ladislav Hagara | Komentářů: 0
    1.10. 17:22 | IT novinky

    Eben Upton oznámil další zdražení jednodeskových počítačů Raspberry Pi. Tentokrát 2 GB varianty o 12,50 dolarů. Nově 2 GB Raspberry Pi 4 stojí 67,50 dolarů a 2 GB Raspberry Pi 5 stojí 77,50 dolarů.

    Ladislav Hagara | Komentářů: 6
    1.10. 13:00 | Nová verze

    OpenMandriva ROME, tj. průběžně aktualizovaná (rolling) edice linuxové distribuce OpenMandriva, byla vydána ve verzi 26.09. Vedle Flatpaku také s podporou Snapu.

    Ladislav Hagara | Komentářů: 0
    1.10. 04:33 | Zajímavý software

    Edison Design Group po více než 30 letech zveřejnil zdrojový kód svého EDG C/C++ front-endu. Ten proslul širokou podporou standardů C++ a kompatibilitou s dialekty kompilátorů od Microsoftu, GNU, Clangu, Sunu a dokonce i s prehistorickým cfrontem. EDG byl použit například v kompilátoru Intel C++ Classic, kompilátoru NVCC od firmy NVIDIA pro platformu CUDA nebo v našeptávači kódu IntelliSense v produktech společnosti Microsoft. Projekt nyní spravuje organizace The C++ Alliance a kód je dostupný pod licencí Apache 2.0, doplněnou o výjimky projektu LLVM.

    AfD 💙 | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (29%)
     (8%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2789 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Kommander - 2 (Starý parser)

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

    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ákno • Nahoru

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