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 18:22 | Komunita

    O víkendu probíhá v Bruselu konference FOSDEM 2026 (Free and Open source Software Developers’ European Meeting). Program konference je velice nabitý: 37 místností, 71 tracků, 1184 přednášejících, 1069 přednášek, prezentací a workshopů. Sledovat je lze i online. K dispozici budou jejich videozáznamy. Aktuální dění lze sledovat na sociálních sítích.

    Ladislav Hagara | Komentářů: 0
    dnes 18:00 | IT novinky

    Společnost Nex Computer stojící za "notebooky bez procesorů a pamětí" NexDock představila telefon NexPhone, který může funguje jako desktop PC, stačí k němu připojit monitor, klávesnici a myš nebo NexDock. Telefon by měl být k dispozici ve třetím čtvrtletí letošního roku. Jeho cena by měla být 549 dolarů. Předobjednat jej lze s vratní zálohou 199 dolarů. V dual-bootu by měl být předinstalovaný Android s Linuxem (Debian) jako aplikací a Windows 11.

    Ladislav Hagara | Komentářů: 1
    dnes 16:00 | Nová verze

    Byla vydána nová major verze 9.0 softwaru pro správu elektronických knih Calibre (Wikipedie). Přehled novinek v poznámkách k vydání. Vypíchnuta je podpora AI.

    Ladislav Hagara | Komentářů: 0
    dnes 14:22 | Nová verze

    Wasmer byl vydán ve verzi 7.0. Jedná se o běhové prostředí pro programy ve WebAssembly. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 1
    dnes 12:22 | Zajímavý software

    V reakci na nepopulární plán Microsoftu ještě více ve Windows prohloubit integraci umělé inteligence Copilot, Opera na sociální síti 𝕏 oznámila, že připravuje nativní linuxovou verzi prohlížeče Opera GX. Jedná se o internetový prohlížeč zaměřený pro hráče, přičemž obsahuje všechny základní funkce běžného prohlížeče Opera. Kromě integrace sociálních sítí prohlížeč například disponuje 'omezovačem', který umožňuje uživatelům omezit využití sítě, procesoru a paměti prohlížečem, aby se tak šetřily systémové zdroje pro jinou aktivitu.

    NUKE GAZA! 🎆 | Komentářů: 8
    dnes 06:22 | Zajímavý software

    NVIDIA vydala nativního klienta své cloudové herní služby GeForce NOW pro Linux. Zatím v beta verzi.

    Ladislav Hagara | Komentářů: 4
    dnes 04:33 | Zajímavý projekt

    Open Gaming Collective (OGC) si klade za cíl sdružit všechny klíčové projekty v oblasti linuxového hraní počítačových her. Zakládajícími členy jsou Universal Blue a Bazzite, ASUS Linux, ShadowBlip, PikaOS a Fyra Labs. Strategickými partnery a klíčovými přispěvateli ChimeraOS, Nobara, Playtron a další. Cílem je centralizovat úsilí, takže namísto toho, aby každá distribuce udržovala samostatné opravy systému a podporu hardwaru na

    … více »
    NUKE GAZA! 🎆 | Komentářů: 0
    dnes 04:11 | Bezpečnostní upozornění

    V kryptografické knihovně OpenSSL bylo nalezeno 12 zranitelností. Opraveny jsou v upstream verzích OpenSSL 3.6.1, 3.5.5, 3.4.4, 3.3.6 a 3.0.19. Zranitelnosti objevila společnost AISLE pomocí svého autonomního analyzátoru.

    Ladislav Hagara | Komentářů: 1
    včera 20:11 | Zajímavý software

    Desktopové prostředí Xfce bude mít vlastní kompozitor pro Wayland s názvem xfwl4. V programovacím jazyce Rust s využitím stavebních bloků z projektu Smithay jej napíše Brian Tarricone. Úprava stávajícího xfwm4 tak, aby paralelně podporoval X11 i Wayland, se ukázala jako špatná cesta.

    Ladislav Hagara | Komentářů: 5
    včera 19:11 | Komunita

    Desktopové prostředí KDE Plasma 6.8 poběží už pouze nad Waylandem. Vývojáři, kteří s rozhodnutím nesouhlasí, vytvořili fork KDE Plasma s názvem SonicDE (Sonic Desktop Environment) s cílem zachovat a vylepšovat podporu X11.

    Ladislav Hagara | Komentářů: 8
    Které desktopové prostředí na Linuxu používáte?
     (17%)
     (6%)
     (0%)
     (10%)
     (24%)
     (3%)
     (5%)
     (2%)
     (12%)
     (32%)
    Celkem 681 hlasů
     Komentářů: 22, poslední včera 23:06
    Rozcestník

    Kommander - 2 (Starý parser)

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

    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.