Na YouTube byly zveřejněny videozáznamy přednášek z hackerské konference DEF CON 33, jež proběhla 7. až 10. srpna v Las Vegas.
Bun (Wikipedie), tj. běhové prostředí (runtime) a toolkit pro JavaScript a TypeScript, alternativa k Node.js a Deno, byl vydán ve verzi 1.3. Představení novinek také na YouTube. Bun je naprogramován v programovacím jazyce Zig.
V Lucemburku byly oznámeny výsledky posledního kola výzev na evropské továrny pro umělou inteligenci neboli AI Factories. Mezi úspěšné žadatele patří i Česká republika, potažmo konsorcium šesti partnerů vedené VŠB – Technickou univerzitou Ostrava. V rámci Czech AI Factory (CZAI), jak se česká AI továrna jmenuje, bude pořízen velmi výkonný superpočítač pro AI výpočty a vznikne balíček služeb poskytovaný odborníky konsorcia. Obojí bude sloužit malým a středním podnikům, průmyslu i institucím veřejného a výzkumného sektoru.
Byla vydána (𝕏) zářijová aktualizace aneb nová verze 1.105 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.105 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Ve Firefoxu bude lepší správa profilů (oddělené nastavení domovské stránky, nastavení lišt, instalace rozšíření, uložení hesla, přidání záložky atd.). Nový grafický správce profilů bude postupně zaváděn od 14.října.
Canonical vydal (email) Ubuntu 25.10 Questing Quokka. Přehled novinek v poznámkách k vydání. Jedná se o průběžné vydání s podporou 9 měsíců, tj. do července 2026.
ClamAV (Wikipedie), tj. multiplatformní antivirový engine s otevřeným zdrojovým kódem pro detekci trojských koní, virů, malwaru a dalších škodlivých hrozeb, byl vydán ve verzi 1.5.0.
Byla vydána nová verze 1.12.0 dynamického programovacího jazyka Julia (Wikipedie) určeného zejména pro vědecké výpočty. Přehled novinek v příspěvku na blogu a v poznámkách k vydání. Aktualizována byla také dokumentace.
V Redisu byla nalezena a v upstreamu již opravena kritická zranitelnost CVE-2025-49844 s CVSS 10.0 (RCE, vzdálené spouštění kódu).
Ministr a vicepremiér pro digitalizaci Marian Jurečka dnes oznámil, že přijme rezignaci ředitele Digitální a informační agentury Martina Mesršmída, a to k 23. říjnu 2025. Mesršmíd nabídl svou funkci během minulého víkendu, kdy se DIA potýkala s problémy eDokladů, které některým občanům znepříjemnily využití možnosti prokázat se digitální občankou u volebních komisí při volbách do Poslanecké sněmovny.
jedna dva tři čtyři pět šest sedm osm devět desetVýsledek je smazání řádky tři a sedm a ke každé též jedné prázdné řádky, aby vzniklo:
jedna dva čtyři pět šest osm devět deset
Řešení dotazu:
cat soubor.txt | paste -sd# | sed 's/##[[:alnum:]]*##/@/g;s/@/\n\n/g;s/#/\n/g'Jestli se v tom tvojem textu vyskytujou křížky nebo závináče, budeš muset místo nich zvolit jinačí znaky.
paste -sd# | sed 's/##[[:alnum:]]*##/\n\n/g;s/#/\n/g'Nějak mi to nemyslí.
Tak se podívejme, jestli by to stačilo:
sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }' \ <<< $'\n\na\n\nb\n\nc\nd\n\ne\n\n\nf\n\ng\n\n\nh\n\ni\nj\nk\n\nl'
Očekávání:
c d i j k
Tvrdá realita:
a c d g h i j k l
Tyhle domácí úkoly obvykle vyžadují pár triků — právě proto, aby se nedaly tak snadno „vyřešit“ na ABCLinuxu.
find DIR -not -empty -type f -printf "%s\t%f%-260s\t%p\n" | sort -k 1,2 -t$'\t' | uniq -w260 -D | cut -f 3 -d $'\t' | xargs md5sum | sort | uniq -w32 --all-repeated=separate | cut -c 34-
(echo; echo; cat data.txt; echo;echo ) | paste --serial --delimiters=\# | sed 's/##\+\([^#]\+##\+\)\+/##/g;s/^##\+//;s/##\+$//;s/#/\n/g' c d i j k
Jo, mým testem to prochází v pohodě.
Tohle je návod, jak to vyřešit, nikoliv řešení. Existuje na to one-liner, to je jisté; on se tu hned vynoří někdo s Perlem.
Já bych to udělal megatěžkopádně, s pořádnými testy. Tady je totiž hned několik zajímavých situací, které je potřeba napřed přesně dodefinovat a poté správně ošetřit, například:
Nuže, pojďme vymyslet testovací nástroj, říkejme mu test.sh
, který bude chrlit vstupy se všemi možnými podrazy. Je sice jednoduchý, ale při dostatečně velkém počtu vstupů nakonec vygeneruje všechny výše zmíněné patologické případy, protože taky umí „náhodně“ generovat bloky řádků o velikostech 0 a 1, z nichž některé skončí na začátku a konci souboru, některé možná hned po sobě atp.
#!/bin/bash set -euo pipefail if (($# < 1)); then echo 'Expected arguments.' 1>&2; exit 11; fi print_input() { local -ir random="$1" blocks=10 limit=2 range='limit + 2' local -i j k r local nl= RANDOM=random for ((j = 0; j < blocks; ++j)); do ((r = RANDOM % range)) || : ((r < limit)) && line='unwanted' || line='wanted' printf "$nl" for ((k = 0; k < r; ++k)); do printf '%s %u/%u/%u\n' "$line" "$i" "$j" "$k" done nl=$'\n' done } RANDOM=0 || : declare -ir files=1000 declare -i i random for ((i = 0; i < files; ++i)); do printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,} random=RANDOM diff -y --color <(print_input "$random") <(print_input "$random" | "$@") || : printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,} done
Napřed pojďme otestovat test.sh
. Zkusíme tam dát kočku. Tady očekáváme výsledek bez rozdílů, tedy diff -y
neukáže žádné šipky a pravá (DSSS) i levá (KSČM) strana diff
ů bude stejná. Tím se také potvrdí (dobře, ne tak úplně), že celý trik s pseudonáhodnými čísly a se stabilními (tedy na prostěradle zaschlými) náhodnými semeny funguje. Tedy, pravděpodobně!
./test.sh cat
Další krok bude, že si teď místo kočky vytvoříme skutečnou implementaci toho algořiťmu. Říkejme mu třeba window.awk
. Má v sobě malou optimalizaci, která hlídá, aby se nikdy nedrželo v paměti víc řádků, než je nezbytné, ale jinak je to obyčejný, tupý stavový automat:
#!/usr/bin/awk -f function finalize_block(i) { if (length(block_window) >= MIN_BLOCK_LENGTH) { if (newline_due) print "" newline_due = 1 for (i = begin; i < end; ++i) print block_window[i] } delete block_window begin = end = 0 } BEGIN { MIN_BLOCK_LENGTH = 2 delete block_window[0] begin = end = 0 } !$0 { finalize_block() next } { block_window[end++] = $0 } length(block_window) > MIN_BLOCK_LENGTH { if (newline_due) print "" newline_due = 0 print block_window[begin] delete block_window[begin++] } END { finalize_block() }
Když to splácáme všechno dohromady, bude to dokonce i fungovat:
./test.sh ./window.awk
Výsledné diff
y ukazují, že to skutečně požírá unwanted
řádky, že to mezi bloky wanted
řádků nechává vždy právě jeden prázdný řádek, ať už prázdných řádků a příliš krátkých bloků mezi nimi bylo, kolik chtělo, že to netrousí prázdné řádky na začátku a konci výstupu, atd.
Leč když to aplikujeme na jedno níže uvedené řešení, tak … ejhle, je to rozbité:
./test.sh sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }'
perl -00nE 'print if split("\n", $_) >= 2'Jen pro pořádek tady je ten Perl.
perl -F'\n' -00E 'print if @F >= 2'
cat fredy72.txt | awk 'BEGIN{RS=""}{if(split($0,a,"\n")>=2)print $0"\n"}'
To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti. Za to by zápočet nebyl. Ale je to cool, to bezesporu.
(Kromě toho to není správně; trousí to prázdné řádky na konci.)
awk 'BEGIN { RS = "" } split($0, a, "\n") >= 2 { print p "\n" p = $0 } END { if (p) print p }'
Tahle↑ verze by vyřešila ty extra řádky, ale celý blok v paměti mi nepřijde jako výhra.
ale celý blok v paměti mi nepřijde jako výhra
RS = "\n\n"
, není řešením?
možná něco jako
awk 'BEGIN{RS="\n\n";FS="\n";ORS="\n\n"}{if($2)print $0}'ale AWK víceméně nepoužívám, takže jen odhaduji.
FS = "\n"
→ zase celý blok v paměti. Když budu mít blok o velikosti 100 TB, než přijde první "\n\n"
, tak to na většině mašin nedám.
wanted wanted unwanted wanted wanted(Off-topic: „
{if($2)print $0}
“ se řekne prostě $2
.)
"To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti."K tomu ma inspiroval ten perl on-liner hore, kde je pouzita command line option:
-00Ta option, alebo nastavenie premennej v skripte
$/ = ""sposobi, ze perl bude pracovat v tzv. paragraph mode, t.j. po blokoch.
Tiskni
Sdílej: