Ubuntu 26.04 (Resolute Raccoon) už nebude v desktopové instalaci obsahovat GUI nástroj 'Software & Updates'. Důvodem jsou obavy z jeho složitosti pro běžné uživatele a z toho plynoucích bezpečnostních rizik. Nástroj lze doinstalovat ručně (sudo apt install software-properties-gtk).
Thomas Dohmke, bývalý CEO GitHubu, představil startup Entire - platformu pro spolupráci vývojářů a agentů umělé inteligence. Entire získalo rekordních 60 milionů dolarů na vývoj databáze a nástrojů, které mají zefektivnit spolupráci mezi lidmi a agenty umělé inteligence. Dohmke zdůrazňuje potřebu přepracovat tradiční vývojové postupy tak, aby odpovídaly realitě, kdy většinu kódu produkuje umělá inteligence.
Toyota Connected North America oznámila vývoj open-source herního enginu Fluorite, postaveného na frameworku Flutter. Pro renderování grafiky využívá 3D engine Filament od společnosti Google a dle svého tvrzení cílí na konzolovou kvalitu her. Fluorite je zřejmě navržen tak, aby fungoval i na méně výkonném hardware, což naznačuje možnost použití přímo v ICE systémech vozidel. Zdrojový kód zatím zveřejněný není.
Byl vytvořen nástroj a postup pro překonání věkového ověření platforem Discord, Kick, Twitch, Snapchat (a možná dalších), kód je open-source a dostupný na GitHubu. Všechny tyto sítě používají stejnou službu k-ID, která určuje věk uživatele scanem obličeje a na původní server posílá pouze šifrovaná metadata, ty ale sociální síť už nedokáže sama nijak validovat, 'útok' spočívá ve vygenerování a podstrčení legitimně vypadajících ověřovacích metadat.
Jihokorejská kryptoměnová burza Bithumb přiznala vážné selhání interních systémů, které ji vystavilo riziku sabotáže a nezabránilo chybné transakci v hodnotě přes 40 miliard dolarů (814 miliard Kč). Druhá největší kryptoměnová burza v Koreji minulý týden při propagační akci omylem rozeslala zákazníkům zhruba 620 000 bitcoinů místo 620 000 wonů (8700 Kč). Incident vyvolal pokles ceny bitcoinu o 17 procent. Většinu
… více »Google Chrome 145 byl prohlášen za stabilní. Nejnovější stabilní verze 145.0.7632.45 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Zpátky je podpora grafického formátu JPEG XL, viz Platform Status. Odstraněna byla před třemi lety. Nový dekodér JPEG XL jxl-rs je napsán v Rustu. Zobrazování JPEG XL lze vyzkoušet na testovací stránce. Povolit lze v nastavení chrome://flags (Enable JXL image format).
Byla vydána nová verze 1.26 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.
CrossOver, komerční produkt založený na Wine, byl vydán ve verzi 26. Přehled novinek v ChangeLogu. CrossOver 26 vychází z Wine 11.0, D3DMetal 3.0, DXMT 0.72, Wine Mono 10.4.1 a vkd3d 1.18. Do 17. února lze koupit CrossOver+ se slevou 26 %.
KiCad je nově k dispozici také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit [Mastodon, 𝕏].
Šenčenská firma Seeed Studio představila projekt levného robotického ramena reBot Arm B601, primárně coby pomůcky pro studenty a výzkumníky. Paže má 6 stupňů volnosti, dosah 650 mm a nosnost 1,5 kilogramu, podporované platformy mají být ROS1, ROS2, LeRobot, Pinocchio a Isaac Sim, krom toho bude k dispozici vlastní SDK napsané v Pythonu. Kompletní seznam součástek, videonávody a nejspíš i cena budou zveřejněny až koncem tohoto měsíce.
… více »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ší.