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

    Poštovní klient Thunderbird byl vydán v nové verzi 153 s kódovým názvem Meadow. Jedná se o ESR (Extended Support Release) vydání. Přehled novinek v poznámkách k vydání. Vylepšuje OAuth. Thundermail lze používat bez instalace doplňku.

    Ladislav Hagara | Komentářů: 0
    včera 22:22 | Zajímavý článek

    AI tento rok naplno vtrhla do vývoje softwaru a výrazně ovlivňuje také open source projekty. Jiří Eischmann v příspěvku Jak mění AI open source na svém blogu rozebírá několik trendů, které v open source v poslední době v souvislosti s AI pozoruje, a jak tyto trendy svět otevřeného softwaru mění (Inflace projektů, Zahlcení kontroly, Klesající motivace zveřejňovat kód).

    Ladislav Hagara | Komentářů: 2
    včera 22:00 | IT novinky

    Evropská komise (EK) vyměřila americké internetové společnosti Google pokutu 890 milionů eur (21,5 miliardy Kč) za porušení unijního nařízení o digitálních trzích (DMA). Firma se podle unijní exekutivy provinila tím, že ve vyhledávači Google Search upřednostňovala vlastní služby a že podnikům ukládala omezení, která jim bránila nasměrovat spotřebitele k alternativním, často levnějším nákupním kanálům na platformě Google Play.

    … více »
    Ladislav Hagara | Komentářů: 1
    22.7. 19:44 | IT novinky

    Samsung na akci Galaxy Unpacked July 2026 (YouTube) představil své nové telefony Galaxy Z Fold8 Ultra, Fold8 a Flip8, hodinky Galaxy Watch Ultra2 a Watch9 a chytré brýle ve spolupráci s Gentle Monster a Warby Parker.

    Ladislav Hagara | Komentářů: 0
    22.7. 16:11 | IT novinky

    Po pěti letech vývoje vyšla česká počítačová hra Scarlet Deer Inn (ProtonDB). Scarlet Deer Inn je vyšívaná temná středověká pohádka. Zatímco život ve zdánlivě obyčejné vesnici se točí kolem běžných povinností a sousedských drbů, v podzemí se skrývají zlověstná tajemství.

    Ladislav Hagara | Komentářů: 1
    22.7. 13:33 | IT novinky

    Představen byl Raspberry Pi Touch Display 2 s uhlopříčkou 10 palců a rozlišením 1200 × 1920 pixelů. Cena je 80 dolarů.

    Ladislav Hagara | Komentářů: 3
    22.7. 13:22 | Komunita

    RPCS3 (Wikipedie), tj. open source emulátor Sony PlayStation 3, snížil minimální požadavky. Nově jsou podporovány starší grafické karty ATI Radeon řady HD 2000, 3000 a 4000 z let 2007 až 2009. Na PC běží už 75 % všech her pro PlayStation 3. V budoucnu bude RPCS3 fungovat bez firmwaru z PS3. V RPCS3 byl implementován systémový modul cellSysmodule (𝕏).

    Ladislav Hagara | Komentářů: 2
    22.7. 11:00 | Zajímavý software

    Vyšel open-source nástroj winetop (MIT) — nativní CLI/TUI pro sledování a ukončování Wine, Proton, Lutris, Heroic a Bottles sezení. Seskupuje procesy podle WINEPREFIX / Steam AppId, umí bezpečně zabít jen hru (včetně Steam reaperu) a nabízí i skriptovatelné příkazy (list, kill, orphans, …). Balíčky jsou mimo jiné na crates.io, Copru (dnf copr enable kovariadam/winetop), PPA ppa:kovariadam/winetop a AUR (winetop-bin).

    kovariadam | Komentářů: 0
    22.7. 02:44 | IT novinky

    Ve spolupráci společností OpenAI a Work Louder byla představena (𝕏) hardwarová klávesnice Codex Micro pro práci s AI agenty. Cena klávesnice je 230 dolarů.

    Ladislav Hagara | Komentářů: 2
    21.7. 20:00 | Nová verze

    Byl vydán Mozilla Firefox 153.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 153 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (17%)
     (30%)
     (5%)
     (6%)
     (2%)
     (15%)
     (24%)
    Celkem 2213 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Bešová minilaskonka

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