Multipatformní renderovací jádro webového prohlížeče Servo je na crates.io. S vydáním verze 0.1.0 (LTS).
Nadace FreeBSD Foundation před týdnem oznámila projekt Laptop Integration Testing. Vyzvala dobrovolníky, aby pomocí nástroje otestovali podporu FreeBSD na svých zařízeních a výsledky odeslali vývojářům. Vznikla stránka Nejlepší notebooky pro FreeBSD.
Na začátku srpna vstoupí v účinnost nová evropská pravidla transparentnosti pro umělou inteligenci (AI). Zavádějí povinnost jakýkoli AI obsah označit, informovat o takzvaných deepfakes a upozornit uživatele, že komunikuje s umělou inteligencí. Cílem opatření je omezit šíření manipulativního či klamavého obsahu, zvýšit důvěru v digitální prostředí a chránit uživatele.
Connor Byrne z USA používal pro přihlašování na svůj iPhone 13 s iOS 18 heslo obsahující háček. Po aktualizaci na iOS 26.4 se už ale do telefonu nepřihlásí. Při přihlašování nelze tento háček zadat. Apple jej prostě odstranil [The Register].
Linus Torvalds vydal jádro Linux 7.0. Podrobný výčet změn je ke zhlédnutí na stránce Kernel Newbies, stručné výběry v LWN (část první, druhá).
Na čem aktuálně pracují vývojáři GNOME? Pravidelný přehled novinek v Týden v GNOME. Vypíchnout lze novou verzi 2026.1 přehrávače hudby Amberol (Flathub).
Byla vydána verze 12.0 s kódovým jménem Ecne linuxové distribuce Trisquel GNU/Linux. Založena je na Ubuntu 24.04 LTS a podporována bude do roku 2029. Trisquel patří mezi svobodné distribuce doporučované Nadací pro svobodný software (FSF).
Open-source citační manažer Zotero (Wikipedie, GitHub) byl vydán v nové major verzi 9. Přehled novinek v příspěvku na blogu.
Libre Graphics Meeting 2026, tj. čtyřdenní konference a setkání vývojářů a uživatelů svobodných a otevřených grafických softwarů, proběhne od 22. do 25. dubna v Norimberku. Dění lze sledovat na Mastodonu.
Vývojář Alexandre Gomes Gaigalas na GitHubu zveřejnil c89cc.sh, parser a kompilátor jazyka C89 napsaný v pouhém jediném skriptu o přibližně 8000 řádcích čistého bashe (bez dalších externích závislostí), který generuje ELF64 binárky pro x86-64. Jedná se o velmi jednoduchý kompilátor, který nepodporuje direktivy #include a dokonce ani funkci printf (lze použít puts), všechny dostupné deklarace lze nalézt v proměnné _BUILTIN_LIBC na konci skriptu. Skript je volně dostupný pod ISC licencí.
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
. Když už to někdo chce takto použít, tak si to může fixnout. Pro běžné použití je to zbytečné.
. Kdybys to nazval něco jako basename, tak klidně
.
A čím jiným vykuchat název adresáře než pomocí basename?
$ 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éž.
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ší.