Ondřej Filip publikoval reportáž z ceremonie podpisu kořenové zóny DNS. Zhlédnout lze také jeho nedávnou přednášku Jak se podepisuje kořenová zóna Internetu v rámci cyklu Fyzikální čtvrtky FEL ČVUT.
Společnost BenQ uvádí na trh novou řadu monitorů RD určenou pro programátory. První z nich je RD240Q.
Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem nadále zůstává Frontier od HPE (Cray) s výkonem 1,206 exaFLOPS. Druhá Aurora má oproti loňsku přibližně dvojnásobný počet jader a dvojnásobný výkon: 1,012 exaFLOPS. Novým počítačem v první desítce je na 6. místě Alps. Novým českým počítačem v TOP500 je na 112. místě C24 ve Škoda Auto v Mladé Boleslavi. Ostravská Karolina, GPU
… více »GHC (Glasgow Haskell Compiler, Wikipedie), tj. překladač funkcionálního programovacího jazyka Haskell (Wikipedie), byl vydán ve verzi 9.10.1. Přehled novinek v poznámkách k vydání.
Po 9 týdnech vývoje od vydání Linuxu 6.8 oznámil Linus Torvalds vydání Linuxu 6.9. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna. Později také na Linux Kernel Newbies.
Byla vydána verze 0.2.0 v Rustu napsaného frameworku Pingora pro vytváření rychlých, spolehlivých a programovatelných síťových systémů. Společnost Cloudflare jej letos v únoru uvolnila pod licencí Apache 2.0.
Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.
Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.
Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].
V lednu byl otevřen editor kódů Zed od autorů editoru Atom a Tree-sitter. Tenkrát běžel pouze na macOS. Byl napevno svázán s Metalem. Situace se ale postupně mění. V aktuálním příspěvku Kdy Zed na Linuxu? na blogu Zedu vývojáři popisují aktuální stav. Blíží se alfa verze.
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.
Tiskni Sdílej:
$ basename2() { set -- "${1%$2}"; echo ${1##*/}; } $ basename2 /usr/bin/ $ basename /usr/bin/ bin
$ basenameset /usr/bin/ $tedy prázdný řetězec.
$ basenameset a /usr/bin/ $ echo $a
$ 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.076sTakže v Pythonu je to asi tak desetkrát rychlejší. O složitosti nemluvě. Ale je pravda, že to není úplně _přesně_ totéž.
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)
#!/usr/bin/env perl use File::Basename; $a=basename($_) foreach (<*>);což je jen o cca 2% rychlejší.