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 16:11 | IT novinky

    V Pekingu dnes proběhl 2. ročník půlmaratonu humanoidních robotů. První 3 místa obsadili roboti Honor Lightning v různých týmech. Nový rekord autonomního robota je 50 minut a 26 sekund. Operátorem řízený robot to zvládl i s pádem za 48 minut a 19 sekund. Řízení roboti měli časovou penalizaci 20 %. Před rokem nejrychlejší robot zvládl půlmaraton za 2 hodiny 40 minut a 42 sekund. Aktuální lidský rekord drží Jacob Kiplimo z Ugandy s časem 57 minut a 20 sekund [𝕏].

    Ladislav Hagara | Komentářů: 0
    17.4. 17:11 | Zajímavý článek

    Stanislav Fort, vedoucí vědecký pracovník z Vlčkovy 'kyberbezpečnostní' firmy AISLE, zkoumal dopady Anthropic Mythos (nový AI model od Anthropicu zaměřený na hledání chyb, který před nedávnem vyplašil celý svět) a předvedl, že schopnosti umělé inteligence nejsou lineárně závislé na velikosti nebo ceně modelu a dokázal, že i některé otevřené modely zvládly v řadě testů odhalit ve zdrojových kódech stejné chyby jako Mythos (například FreeBSD CVE-2026-4747) a to s výrazně nižšími provozními náklady.

    MakeIranBombedAgain❗ | Komentářů: 6
    17.4. 12:44 | IT novinky

    Federální návrh zákona H.R.8250 'Parents Decide Act', 13. dubna předložený demokratem Joshem Gottheimerem a podpořený republikánkou Elise Stefanik coby spolupředkladatelkou (cosponsor), by v případě svého schválení nařizoval všem výrobcům operačních systémů při nastavování zařízení ověřovat věk uživatelů a při používání poskytovat tento věkový údaj aplikacím třetích stran. Hlavní rozdíl oproti kalifornskému zákonu AB 1043 a kolorádskému SB26-051 je ten, že federální návrh by platil rovnou pro celé USA.

    MakeIranBombedAgain❗ | Komentářů: 12
    17.4. 12:33 | Nová verze

    Qwen (čínská firma Alibaba Cloud) představila novou verzi svého modelu, Qwen3.6‑35B‑A3B. Jedná se o multimodální MoE model s 35 miliardami parametrů (3B aktivních), nativní kontextovou délkou až 262 144 tokenů, 'silným multimodálním vnímáním a schopností uvažování' a 'výjimečnou schopností agentického kódování, která se může měřit s mnohem rozsáhlejšími modely'. Model a dokumentace jsou volně dostupné na Hugging Face, případně na čínském Modelscope. Návod na spuštění je už i na Unsloth.

    MakeIranBombedAgain❗ | Komentářů: 1
    17.4. 11:00 | Nová verze

    Sniffnet, tj. multiplatformní (Windows, macOS a Linux) open source grafická aplikace pro sledování internetového provozu, byl vydán ve verzi 1.5. V přehledu novinek je vypíchnuta identifikace aplikací komunikujících po síti.

    Ladislav Hagara | Komentářů: 4
    17.4. 02:22 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 15.0 (Mastodon). Forgejo je fork Gitei.

    Ladislav Hagara | Komentářů: 1
    17.4. 01:11 | Pozvánky

    Současně se SUSECON 2026 proběhne příští čtvrtek v Praze také komunitní Open Developer Summit (ODS) zaměřený na open source a openSUSE. Akce se koná ve čtvrtek 23. 4. (poslední den SUSECONu) v Hilton Prague (místnost Berlin 3) a je zcela zdarma, bez nutnosti registrace na SUSECON. Na programu jsou témata jako automatizace (AutoYaST), DevOps, AI v terminálu, bezpečnost, RISC-V nebo image-based systémy. Všichni jste srdečně zváni.

    lkocman | Komentářů: 1
    16.4. 15:44 | Humor

    Český úřad zeměměřický a katastrální zavedl u anonymního nahlížení do katastru nemovitostí novou CAPTCHA ve formě mapové puzzle: nepřihlášení uživatelé musí nově správně otočit devět dlaždic v 3x3 poli tak, aby dohromady daly souvislý obrázek výseče reálné mapy, přičemž na to mají pouze jeden časově omezený pokus. Test je podle uživatelů i odborníků příliš obtížný a na sociálních sítích pochopitelně schytává zaslouženou kritiku a

    … více »
    MakeIranBombedAgain❗ | Komentářů: 36
    16.4. 15:33 | Nová verze

    Byla vydána verze 1.95.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ářů: 0
    16.4. 15:22 | Zajímavý software

    Mozilla prostřednictvím své dceřiné společnosti MZLA Technologies Corporation představila open-source AI klienta Thunderbolt. Primárně je určený pro firemní nasazení.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1356 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Kommander - 2 (Starý parser)

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

    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.