Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie). Servo mimo jiné nově zvládne animované obrázky APNG a WebP.
Na chytré telefony a počítačové tablety v Rusku bude od začátku příštího měsíce povinné předinstalovávat státem podporovanou komunikační aplikaci MAX, která konkuruje aplikaci WhatsApp americké společnosti Meta Platforms. Oznámila to dnes ruská vláda. Ta by podle kritiků mohla aplikaci MAX používat ke sledování uživatelů. Ruská státní média obvinění ze špehování pomocí aplikace MAX popírají. Tvrdí, že MAX má méně oprávnění k přístupu k údajům o uživatelích než konkurenční aplikace WhatsApp a Telegram.
Společnost PINE64 stojící za telefony PinePhone nebo notebooky Pinebook publikovala na svém blogu srpnový souhrn novinek. Kvůli nedostatečnému zájmu byla ukončena výroba telefonů PinePhone Pro.
Po pěti měsících vývoje byla vydána nová verze 0.15.1 programovacího jazyka Zig (GitHub, Wikipedie). Verze 0.15.0 byla přeskočena. Přispělo 162 vývojářů. Přehled novinek v poznámkách k vydání.
Před sedmi lety společnost Valve představila fork projektu Wine s názvem Proton umožňující v Linuxu přímo ze Steamu hrát počítačové hry do té doby běžící pouze ve Windows. Aktuální přehled podporovaných her na stránkách ProtonDB
Společnost DuckDuckGo rozšířila svůj AI chat Duck.ai o GPT-5 mini (𝕏). Duck.ai umožňuje anonymní přístup bez vytváření účtů k několika modelům umělé inteligence. Aktuálně k GPT-4o mini, GPT-5 mini, Llama 4 Scout, Claude Haiku 3.5 a Mistral Small 3.
Marek Tóth v příspěvku DOM-based Extension Clickjacking: Data ve správcích hesel v ohrožení na svém blogu popsal novou clickjacking techniku s několika variantami útoků a otestoval ji proti 11 správcům hesel. Výsledkem bylo nalezení několika 0-day zranitelností, které mohly ovlivnit uložená data desítek milionů uživatelů. Jedno kliknutí kdekoliv na webové stránce kontrolované útočníkem umožňovalo ukrást uživatelská data ze
… více »Na dnešní akci Made by Google 2025 (YouTube) byly představeny telefony Pixel 10 s novým čipem Google Tensor G5 a novými AI funkcemi, hodinky Pixel Watch 4 a sluchátka Pixel Buds 2a.
The Document Foundation oznámila vydání nové major verze 25.8 svobodného kancelářského balíku LibreOffice. Podrobný přehled nových vlastností i s náhledy v poznámkách k vydání (cs) a také na Youtube a PeerTube.
Zeek (Wikipedie), původně Bro, byl vydán v nové major verzi 8.0.0. Jedná se o open source platformu pro analýzu síťového provozu. Vyzkoušet lze online.
Tak jsem uvnitř podmínky grep
u potřeboval vyhodnotit nějakou složitější věc a měl jsem možnost napsat to jako annonymní sub
a nebo do
. Položil jsem si otázku co bude rychlejší?
Vnitřek podmínky grep
u vypadal nějak podobně takhle:
my $attr = $_; my $successors = $successors{$attr}; $successors and do { my $res; $res = exists $successors->{$_} and last foreach (predecessors($attr)); !$res }
my $attr = $_; my $successors = $successors{$attr}; $successors and sub { exists $successors->{$_} && return 0 foreach predecessors($attr); 1 }->()
Výsledný kód jsem trošku benchmarkoval a verze se sub
je až o 50% pomalejší (samozřejmě v závislosti na okolní režiji). Ale proč? Odpověď je celkem jednoduchá, annonymní subrutina se pokaždé znovu skompiluje. (Trošku zjednodušuji, ona se ve skutečnosti jednou předkompiluje a pak se jí mění syntaktický kontext, ale ve výsledku je pro každé zavolání vnitřní smyčky vytvořená nová subrutina. Kdybych si ji někam ukládal tak bude pokaždé na jiné adrese, atd.) Dá se tomu nějak zabránit? Jistě, vytvořit immutable annonymní subrutinu a Perl je tak chytrý, že ji skompiluje jen jednou.
my $attr = $_; my $successors = $successors{$attr}; $successors and sub { exists $_[0]->{$_} && return 0 foreach predecessors($_[1]); 1 }->($successors, $attr)
Takový kód je pak prakticky stejně rychlý jako do
. Co je na tom zajímavého? Snad jen to, že do
v perlu se tak hezky chová, skompiluje se jen jednou i když obsahuje proměnné v syntaktickém kontextu a je tedy rychlejší než použití annonymního sub
.
Pokud si chcete taky pohrát, tak zde je text kompletního benchmarku:
#!/usr/bin/env perl use strict; use Benchmark qw(:all :hireswallclock); my $count = 100; my %successors = map +($_, {$_ => undef}), 1..$count; sub predecessors {($_[0]-1) .. ($_[0]+1)} sub none (&@) { &{$_[0]} && return 0 foreach @_[1..$#_]; 1 } cmpthese(-2, { 'do' => sub { do {my $attr = $_; my $successors = $successors{$attr}; do { my $res; foreach (predecessors($attr)) { $res = exists $successors->{$_} and last } !$res } } foreach 1 .. $count; }, 'sub' => sub { do {my $attr = $_; my $successors = $successors{$attr}; sub { exists $successors->{$_} && return 0 foreach predecessors($attr); 1 }->() } foreach 1 .. $count; }, 'subimmu' => sub { do {my $attr = $_; my $successors = $successors{$attr}; sub { exists $_[0]->{$_} && return 0 foreach predecessors($_[1]); 1 }->($successors, $attr) } foreach 1 .. $count; }, 'none' => sub { do { my $successors = $successors{$_}; none {$successors->{$_}} predecessors($_); } foreach 1 .. $count; }, 'evalblock' => sub { do {my $attr = $_; my $successors = $successors{$attr}; eval { my $res; foreach (predecessors($attr)) { $res = exists $successors->{$_} and last } !$res } } foreach 1 .. $count; }, 'evalstr' => sub { do {my $attr = $_; my $successors = $successors{$attr}; eval ' my $res; foreach (predecessors($attr)) { $res = exists $successors->{$_} and last } !$res ' } foreach 1 .. $count; }, });
Pro zajímavost jsou doplněny ještě další varianty. Není překvapením, že blokové použití eval
u je stejně rychlé jako do
nebo immutable sub
. Trochu jsem byl zklamán rychlostí při použití krásné elegantní šablonované funkce none
. Tam se vlastně stejně jako při normálním annonymním sub
pokaždé znovu skompiluje první parametr a jestě ke všemu se tato subrutina volá uvnitř foreach
, takže to ve výsledku dopadne hůř. No a nejhorší je eval
stringu, nic divného, že
P.S.: Nakonec jsem se do
úplně vyhnul a použil jednu z vlastností if
, že vrací hodnotu podmínky. No co, aspoň jsem nahlédl do chování perl
u zase o kousek hloub. Ekvivalent shora uvedených kódů pak nakonec vypadá asi takhle:
if (my $successors = $successors{$_}){ my $res; $res = exists $successors->{$_} and last foreach (predecessors($_)); !$res }
Ano, to je celý vnitřek podmínky grepu, ušetřím ještě jednu alokaci proměnné, což je podle mých měření dokonce víc než zavolání sub
Tiskni
Sdílej:
do
nerobí to isté, čo sub
. Ako píšu v dokumentácií, Not really a function.
.
do
jednoducho vyhodnotí blok.
sub
vytvorí anonymnú funkciu, ktorej kopíruje kontext (pre ostatných, google: perl closures)