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 14:00 | Upozornění

    Cloudflare, tj. společnost poskytující "cloudové služby, které zajišťují bezpečnost, výkon a spolehlivost internetových aplikací", má výpadek.

    Ladislav Hagara | Komentářů: 2
    dnes 04:22 | Pozvánky

    Letos se uskuteční již 11. ročník soutěže v programování Kasiopea. Tato soutěž, (primárně) pro středoškoláky, nabízí skvělou příležitost procvičit logické myšlení a dozvědět se něco nového ze světa algoritmů – a to nejen pro zkušené programátory, ale i pro úplné začátečníky. Domácí kolo proběhne online od 22. 11. do 7. 12. 2025 a skládá se z 9 zajímavých úloh různé obtížnosti. Na výběru programovacího jazyka přitom nezáleží – úlohy jsou

    … více »
    SoutezKasiopea | Komentářů: 0
    dnes 04:11 | Nová verze

    Byla vydána nová verze 2.52.0 distribuovaného systému správy verzí Git. Přispělo 94 vývojářů, z toho 33 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.

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

    VKD3D-Proton byl vydán ve verzi 3.0. Jedná se fork knihovny vkd3d z projektu Wine pro Proton. Knihovna slouží pro překlad volání Direct3D 12 na Vulkan. V přehledu novinek je vypíchnuta podpora AMD FSR 4 (AMD FidelityFX Super Resolution 4).

    Ladislav Hagara | Komentářů: 0
    včera 03:11 | Nová verze

    Poštovní klient Thunderbird byl vydán v nové verzi 145.0. Podporuje DNS přes HTTPS nebo Microsoft Exchange skrze Exchange Web Services. Ukončena byla podpora 32bitového Thunderbirdu pro Linux.

    Ladislav Hagara | Komentářů: 1
    včera 02:33 | IT novinky

    U příležitosti státního svátku 17. listopadu probíhá na Steamu i GOG.com již šestý ročník Czech & Slovak Games Week aneb týdenní oslava a také slevová akce českých a slovenských počítačových her.

    Ladislav Hagara | Komentářů: 0
    16.11. 19:33 | Nová verze

    Byla vydána nová verze 9.19 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze například nový balíček BirdNET-Go, tj. AI řešení pro nepřetržité monitorování a identifikaci ptáků.

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

    Byla vydána nová verze 3.38 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.10 souvisejícího programovacího jazyka Dart (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    16.11. 01:33 | Nová verze

    Organizace Apache Software Foundation (ASF) vydala verzi 28 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.

    Ladislav Hagara | Komentářů: 0
    15.11. 16:11 | Nová verze

    Byl vydán Debian 13.2, tj. druhá opravná verze Debianu 13 s kódovým názvem Trixie. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (35%)
     (46%)
     (18%)
     (18%)
     (23%)
     (15%)
     (23%)
     (16%)
     (16%)
    Celkem 366 hlasů
     Komentářů: 16, poslední 12.11. 18:21
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Bešová minilaskonka

    7.6.2005 10:00 | Přečteno: 1938× | 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.