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:55 | Nová verze

    Byla vydána verze 1.93.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
    dnes 14:00 | Komunita

    Svobodný operační systém ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows, slaví 30. narozeniny.

    Ladislav Hagara | Komentářů: 4
    dnes 11:00 | IT novinky

    Společnost Raspberry Pi má nově v nabídce flash disky Raspberry Pi Flash Drive: 128 GB za 30 dolarů a 256 GB za 55 dolarů.

    Ladislav Hagara | Komentářů: 2
    dnes 10:22 | Zajímavý software

    Technologie Skip pro multiplatformní mobilní vývoj, která umožňuje vývojářům vytvářet iOS a Android aplikace z jediné Swift a SwiftUI kódové základny, se s vydáním verze 1.7 stala open source.

    Ladislav Hagara | Komentářů: 3
    dnes 03:33 | Zajímavý software Ladislav Hagara | Komentářů: 1
    dnes 00:11 | Nová verze

    Byla vydána nová major verze 34.0.0 webového prohlížeče Pale Moon (Wikipedie) vycházejícího z Firefoxu. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 1
    včera 16:11 | Humor

    Win8DE je desktopové prostředí pro Wayland, inspirované nechvalně proslulým uživatelským rozhraním Metro z Windows 8. Nabízí dlaždicové rozhraní s velkými tlačítky a jednoduchou navigací, optimalizované pro dotyková zařízení. Cílem projektu je přetvořit design operačního systému Windows 8 do funkčního a minimalistického rozhraní vhodného pro každodenní použití na Linuxu.

    NUKE GAZA! 🎆 | Komentářů: 11
    včera 14:33 | Nová verze

    Laboratoře CZ.NIC vydaly Datovku 4.28.0 a Mobilní Datovku 2.6.0. Hlavní novinkou je ukládání rozpracovaných datových zpráv do konceptů. Datovka je svobodné multiplatformní aplikace pro přístup k datovým schránkám a k trvalému uchovávání datových zpráv v lokální databázi.

    Ladislav Hagara | Komentářů: 6
    včera 14:22 | Zajímavý projekt

    Unix Pipe Game je vzdělávací karetní hra zaměřená na děti a rodiče, která děti učí používat unixové příkazy prostřednictvím interaktivních úkolů. Klíčovým prvkem hry je využití symbolu | pro pipeline neboli 'rouru', který umožňuje propojit výstupy a vstupy jednotlivých unixových příkazů, v tomto případě vytištěných na kartičkách. Předpokládá se, že rodič má alespoň nějaké povědomí o unixových příkazech a jejich provazování pomocí |.

    … více »
    NUKE GAZA! 🎆 | Komentářů: 3
    včera 13:55 | Zajímavý software

    PCIem je linuxový framework, který vytváří virtuální zařízení PCIe pomocí technik, které umožňují hostitelskému operačnímu systému rozpoznat tyto syntetické 'neexistující' karty jako fyzické zařízení přítomné na sběrnici. Framework PCIem je primárně zamýšlen jako pomůcka pro vývoj a testování ovladačů bez nutnosti použít skutečný hardware. Dle tvrzení projektu si fungování PCIem můžeme představit jako MITM (Man-in-the-Middle), který se nachází mezi ovladači a kernelem.

    NUKE GAZA! 🎆 | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (17%)
     (5%)
     (0%)
     (10%)
     (21%)
     (3%)
     (5%)
     (2%)
     (11%)
     (36%)
    Celkem 570 hlasů
     Komentářů: 17, poslední dnes 15:24
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Bešová minilaskonka

    7.6.2005 10:00 | Přečteno: 1963× | BASH | poslední úprava: 8.6.2005 06:40

    Dnes to bude jen taková drobnost. Implementace basename a ověření platného jména proměné.

    Basename je součástí coreutils a jeho binárka zpravidla nemá víc jak nějakých 13kB. Standardní použití v shelu většinou vypadá tak, že se zavolá v rámci subshellu a jeho výsledek použije přímo v parametru nějakého příkazu nebo pro přiřazení do proměné. Pokud to v příslušném scriptu uděláme jen párkrát, nic se neděje. Pokud se to však musí udělat třeba tisíckrát, tak už nás může zajímat, že se shell musí forknout a zavolat exec na binárku basename. Přitom samotné vlastnosti bourne shellu dosažení stejného efektu umožňuje. Nejlepšího výsledku (nejrychlejšího provedení) lze samozřermě dosáhnout přímo v kódu.

    purename="${1%/}"          # bugfix pro adresáře s / nakonci
    purename="${purename##*/}" # odstranění adresáře
    purename="${purename%$2}"  # odstranění přípony (může být třeba i v proměnné nebo parametru)

    Pokud si někdo chce udělat funkci, která bude děla to samé jako basename, tak může

    basename() { set -- "${1%$2}"; set -- "${1%/}"; echo ${1##*/}; }

    Ale má to háček. Při použití této funkce ji stejně zpravidla použijete uvnitř $() a to je zase fork, i když si ušetříte exec(basename). Výjimkou jsou přesměrování typu basename bla/bla/bla.bla >>soubor.txt I když tady by bylo před celým cyklem vhodné udělat exec >>soubor.txt nebo do něj přesměrovat cyklus [for|while] ... done >>soubor.txt

    Pro přiřazení do proměnné by bylo vhodnější si udělat speciální funkcičku, která by název proměnné dostala jako parametr, nebo to udělat přímo v kódu jak je uvedeno na začátku. Taková funkcička může vypadat třeba takto:

    basenameset()
    {
      set -- "$1" "${2%$3}"
      set -- "$1" "${2%/}"
      case "$1" in
        [^a-zA-Z]*|*[^a-zA-Z0-9]*|case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while|time);; # špatné jméno proměnné
        ?*) eval $1=\"${2##*/}\";; # správné jméno proměnné (neprázdné)
      esac
    }

    A tím jsme se dostali oslým můstkem k druhé úloze, ověření platného jména proměnné.

    A když už se bavíme o rychlosti, tak pár testíků.

    $ for((i=0;$i<10000;i++)); do touch zbytecne_dlouhej_prefix_$i; done
    $ cat basename.sh
    #!/bin/bash
    
    dir="${1:-.}"
    
    for i in "${dir%/}/"*
    do
            a="$(basename "$i")"
    done
    $ cat basename_in_shell.sh 
    #!/bin/bash
    
    basename() { set -- "${1%$2}"; echo ${1##*/}; }
    
    dir="${1:-.}"
    
    for i in "${dir%/}/"*
    do
            a="$(basename "$i")"
    done
    $ cat basenameset.sh 
    #!/bin/bash
    
    basenameset() 
    {
        set -- "$1" "${2%$3}"
        case "$1" in
            [^a-zA-Z]*|*[^a-zA-Z0-9]*);;
            ?*) eval $1=\"${2##*/}\";;
        esac
    }
    
    dir="${1:-.}"
    
    for i in "${dir%/}/"*
    do
            basenameset a "$i"
    done
    $ time ./basename.sh
    
    real    0m17.545s
    user    0m5.410s
    sys     0m10.020s
    $ time ./basename_in_shell.sh 
    
    real    0m10.081s
    user    0m3.120s
    sys     0m5.400s
    $ time ./basenameset.sh 
    
    real    0m1.461s
    user    0m1.350s
    sys     0m0.010s
    $
    Myslím, že je to názorné tak akorát. Nakonec zas až tak moc mini ta laskonka není rozsahem, pouze obsahem.        

    Hodnocení: 100 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    7.6.2005 10:08 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
    Rozbalit Rozbalit vše To samé?
    $ basename2() { set -- "${1%$2}"; echo ${1##*/}; }
    $ basename2 /usr/bin/
    
    $ basename /usr/bin/
    bin
    
    7.6.2005 10:11 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
    Rozbalit Rozbalit vše Re: To samé?
    Ještě doplním:
    $ basenameset /usr/bin/
    $
    
    tedy prázdný řetězec.
    7.6.2005 10:13 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
    Rozbalit Rozbalit vše Re: To samé?
    Sorry, nepřečet jsem si to pořádně :-).
    $ basenameset a /usr/bin/
    $ echo $a
    
    
    7.6.2005 10:16 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: To samé?
    OK. Big bug. Snadný fix.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    7.6.2005 10:24 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: To samé?
    Když tak nad tím přemýšlím, tak to není až zas takový bug. Používat basename na jména adresářů není až zas tak typické použití a strkat tam ještě navíc lomítko je vyložený naschvál :-). Když už to někdo chce takto použít, tak si to může fixnout. Pro běžné použití je to zbytečné.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    7.6.2005 10:49 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
    Rozbalit Rozbalit vše Re: To samé?
    No pokud o něčem tvrdíš, že to dělá to samé jako basename a nedělá, tak to je bug, o opaku mě nepřesvědčíš :-). Kdybys to nazval něco jako basename, tak klidně :-).

    A čím jiným vykuchat název adresáře než pomocí basename?
    7.6.2005 11:30 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: To samé?
    Fixnutou verzí :-)
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    7.6.2005 21:30 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
    Rozbalit Rozbalit vše :-(
    Tedy, dočíst se ,,standartní`` už i u nich, to zamrzí :-(
    Copak toho není dost?
    8.6.2005 06:40 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: :-(
    Už i u nich? Oni tohle vynalezli. Oni si to možná nechají patentovat :-)
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    13.10.2005 23:09 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše pokus v Pythonu
    Zkusil jsem zhruba totéž v Pythonu. Tady jsou výsledky:
    $ cat basename.py
    #!/usr/bin/env python
    import os
    
    for file in os.listdir('.'):
      a = os.path.basename('./' + file)
    $ time ./basenameset.sh
    
    real    0m3.417s
    user    0m3.152s
    sys     0m0.096s
    $ time ./basename.py
    
    real    0m0.343s
    user    0m0.252s
    sys     0m0.076s
    
    
    Takže v Pythonu je to asi tak desetkrát rychlejší. O složitosti nemluvě. Ale je pravda, že to není úplně _přesně_ totéž.
    14.10.2005 12:35 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: pokus v Pythonu
    Ano, jinými slovy, basename implementované v tom samém jazyce jako je spracovávaný script, ve kterém to potřebujete je vždycky rychlejší než volat něco externě a python je rychlejší než bash. Zkuste si napsat script, který udělá basename ze svého parametru a použijte ho místo bashového basename ve scriptu basename_in_shell.sh. Myslým, že se budete dost divit. Mimochodem perlivé
    #!/usr/bin/env perl
    use File::Basename;
    $a=basename($_) foreach (<.*>);
    
    je o 5% rychlejší :) (Což bude nejspíš stejně způsobeno o chlup rychlejším natažením perl interpretru než pythonu)
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    14.10.2005 12:44 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: pokus v Pythonu
    Safra, chybička se vloudila. Správně má být
    #!/usr/bin/env perl
    use File::Basename;
    $a=basename($_) foreach (<*>);
    což je jen o cca 2% rychlejší.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

    Založit nové vláknoNahoru

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