Oficiálně byl vydán Android 16. Detaily na blogu a stránkách věnovaných vývojářům.
Byla vydána nová verze 14.3 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.
CSIRT.CZ upozorňuje, že na základě rozhodnutí federálního soudu ve Spojených státech budou veškeré konverzace uživatelů s ChatGPT uchovávány. Včetně těch smazaných.
Ač semestr ve škole právě končí, bastlíři ze studentského klubu Silicon Hill neodpočívají a opět se jako každý měsíc hlásí s pravidelným bastlířským setkáním Virtuální Bastlírna, kde si můžete s ostatními techniky popovídat jako u piva o novinkách, o elektronice, softwaru, vědě, technice obecně, ale také o bizarních tématech, která se za poslední měsíc na internetu vyskytla.
Z novinek za zmínku stojí Maker Faire, kde Pájeníčko předvedlo … více »Na WWDC25 byl představen balíček Containerization a nástroj container pro spouštění linuxových kontejnerů na macOS. Jedná se o open source software pod licencí Apache 2.0 napsaný v programovacím jazyce Swift.
Do 16. června do 19:00 běží na Steamu přehlídka nadcházejících her Festival Steam Next | červen 2025 doplněná demoverzemi, přenosy a dalšími aktivitami. Demoverze lze hrát zdarma.
Apple na své vývojářské konferenci WWDC25 (Worldwide Developers Conference, keynote) představil řadu novinek: designový materiál Liquid Glass, iOS 26, iPadOS 26, macOS Tahoe 26, watchOS 26, visionOS 26, tvOS 26, nové funkce Apple Intelligence, …
Organizátoři konference LinuxDays 2025, jež proběhne o víkendu 4. a 5. října 2025 v Praze na FIT ČVUT, spustili přihlašování přednášek (do 31. srpna) a sběr námětů na zlepšení.
Po roce byla vydána nová stabilní verze 25.6.0 svobodného multiplatformního multimediálního přehrávače SMPlayer (Wikipedie).
DNS4EU, tj. evropská infrastruktura služeb DNS založená na vysoce federovaném a distribuovaném ochranném ekosystému, byla spuštěna v testovacím režimu [𝕏]. Na výběr je 5 možností filtrování DNS.
Většinou prograuju v Perlu, ale zároveň po očku sleduju Python. Můj pocit z něj se vyvýjí v takových vlnách, chvilku se mi líbí hodně, chvilku méně a tak pořád dokola. Některé věci se mi v něm líbí, ale poslední dobou je pocit spíše rozpačitý. Jeho syntaxe je, jak bych to jen řekl, příliš košatá. Ony se dělají vtípky na to, že Perlový zdroják je před komprimací k nerozeznání od stavu po komprimaci. Hloupej vtípek, ale syntaxe Perlu je vlastně strašně jednoduchá až primitivní, to se ale o Pythonu nedá říct ani omylem. Už jen těch klíčových slov! I když ke klíčovým slovům Perlu přihodím všechny ty podivné znaky se speciálním významem, tak to nebudu ani na desetině syntaktických prvků Pythonu. Jo, já vím, Lisp je Lisp, ale Perl má taky něco do sebe. (No a radši nebudu ani zmiňovat dc
, že) A proč to všechno píšu?
Dnes ráno se mi nějak nechtělo spát at tak jsem sedl k počítači a z nudy jsem si jen tak programoval. V manuálu perlsub
je taková malá ukázka, jak si vytvořit syntaktický cukr ala Python try
/except
. Cybí tam to finally
a tak jsem si to tam dodělal. A tím jsme se vrátili k tomu úvodu. V Pythonu na to musíte mít tři klíčová slova, v Perlu si to naprogramujete.
Takže text modulu TryExceptionFinally.pm
package TryExceptFinally; use strict; use warnings; use Exporter qw(import); use Scalar::Util qw(reftype); our @EXPORT = qw(try except finally); sub try (&@) { my ($try, %subs) = @_; eval { &$try }; no warnings 'uninitialized'; if ($@ and reftype $subs{except} eq 'CODE') { local $_ = $@; &{$subs{except}}; } &{$subs{finally}} if reftype $subs{finally} eq 'CODE'; } sub except (&@) { 'except', @_ } sub finally (&) { 'finally', @_ } 1;
a ukázkový kód
#!/usr/bin/env perl use strict; use warnings; use TryExceptFinally; try { die "hard"; } except { print "Ouch, I was die $_" } finally { print "Finally!\n" }; try { print "Live\n"; } except { print "Ouch, I was die $_" } finally { print "Finally!\n" }; try { print "Live\n"; } finally { print "Finally without except!\n" }; try { die "hard"; } finally { print "Finally without except!\n" }; try { die "hard"; } except { print "Ouch, I was die $_ and no finally!\n" };
No a jednotlivé typy vyjímek místo několika bloků exception, se zabalí do jednoho, třeba takto
try { code } except { /type1/ && do { code 1 } || /type2/ && do { code 1 } || /type3/ && do { code 1 } || do { # else code } }
Tiskni
Sdílej:
$SIG{INT} = sub { throw "Uplne zbytocna vynimka"; };
eval {require module && module->import(use_params)} if ($@) { $@ =~ /syntax error/ and print "syntx error in module\n" or print "somethink error when try use module: $@" }a pythonish way užívající to hezké try/except
try { require module && module->import(use_params) } except { /syntax error/ and print "syntx error in module \n" or print "somethink error when try use module: $@" }Pokud chceš aby to fungovalo stejně jako běžné
use
, tak to ještě zavřeš do BEGIN
bloku. No a exception jako objekt máme taky, takže si ve svých modulech/třídách nadefinuješ vlastní hierarchii a je vymalováno, prakticky nic co jde udělat v pythonu není problém udělat perlu, něco jde elegantněji něco naopak. Třeba generátory se v perlu nepíšou tak jednoduše jak pythonu pomocí yeld
, ale na druhou stranu v pythonu máš jen jeden typ objektů, který je ekvivalentem blessnutého hashe v perlu. V podstatě všechny objekty, třídy, jmenné prostory, funkce, ... jsou v pythonu objekty typu blessnutý hash (pythonní dict), to je trochu chudé, ne? Just joking, na druhou z toho plynou pythonu některé výhody, to nesporně Jinak to zachycování výjimek pomocí signálů (chápu to správně, že jsou to signály?) má tu nevýhodu, že je nedostane thread, kterého se to týká, nebo ano? V případě klávesnice to asi nevadí.Vzhledm k tomu, že je to signál zaslaný procesu (zaslaný terminálem), nevím, jak by jste to chtěl udělat jinak. I v pythonu keyboard interupt musí fungovat stejně. V perlu asi nějak takto:
eval { local $SIG{INT} = sub { die "Keyboard interupt"; }; code }; if ($@) { $@ =~ /Keyboard interupt/ and print "Don't disrupt me!\n" or die $@ }A to samozřejmě je thread safe, i když netuším podle čeho se určí, jestli ten signál zpracuje ten který thread.
Jinak dokážou ty výjimky taky to co python, to znamená mít v sobě informaci o call stacku, tedy o řádcích programu, kde chyba nastala, a o všech podprogramech ze kterého se tento řádek volal?Ano, jestliže si tam tu informaci přidáte. Standardní výjimky jsou textové, protože jsou tam od doby, kdy ještě ani perl nebyl objektový. Vlastní výjimky si člověk může udělat objektové a call stack si tam doplnit. Standardní textová výjimka nekončící na EOL je vždy doplněna o informaci, kde k ní došlo. Není problém (až na určité spomalení) si nad každou funkcí udělat eval wrapper a všechny výjimky odchytávat, měnit na objektové a doplňovat o call stack. V pythonu to už udělali za vás. V tomhle je python lepší, o tom žádná. Možná je na to v perlu už udělaný nějaký modul, nebo nějaká vlastnost, která jde zapnout, zatím jsem po tom nepátral.
python je postaven na jmenných prostorech, stejně tak jako každý dynamický jazyk, ať už vezmu php, smalltalk, nebo třeba objective c.a nebo třeba perl, to je přece jasné. A je taky celkem logické, že to v těch jazycích implementovali pomocí prostředků toho samého jazyka. Proč se s tím implementovat dvakrát, že. Takže v perlu jsou jmenné prostory hash a v pythonu objekt a ten je v podstatě dict. Mimochodem, perlový
local
. To jde udělat i v pythonu, ale zdaleka to nejde tak jednoduše pomocí jednoho klíčového slova jako v perlu. Jak říkám, každý jazyk je v něčem lepší a v něčem horší.
Informácie o kontexte: miesto die
používať Carp::confess
.
Samotný die
umožňuje aj iný parameter ako scalar
die new XYZ::Exception;Ono, aj catch sa dá implmentovať štýlom
try {} catch qr/aaa/ => {} catch 'AAA::Exception' => {} ...Btw, keď spomínate
local
, také jeho použitie na "dočasné" prekrytie ľubovoľnej funkcie môže byť zaujímavé Od včera mi bohužiaľ panikári kernel, takže len naznačím rozpracovanú myšlienku:
sub try (&;@) { my (my ($try, %subs) = @_; return new Exception::Block ($try, \ %subs) if defined wantarray; ... } # priklad použitia my $block = try { ... } catch A => { ... } catch qr/B) => { ... }; $block->('www.abclinuxu.cz'); $block->('www.example.com'); $block->catch (A => sub { ... })->('...');
ono, programovať multithreadovo treba vedieť, osobne si myslím, že 9 z 10tich ľudí živiacich sa programovaním to neovláda. Takisto výnimky, tiež ich treba ovládať.Tak to ani zdaleka není to o čem jsem mluvil.Informácie o kontexte: miesto
die
používaťCarp::confess
.
Carp::confess
produkuje textový výstup, který by se pro další zpracování musel parsovat a to je vždy nespolehlivé. Také to neřeší systémové výjimky generované přímo perlem. V těch die
nahradíte celkem těžko. To první jde samozřejmě nahradit vhodnými objektovými výjimkami, které si call back naplní do své vnitřní struktury pomocí caller a mohou být dále strojově zpracovány. To druhé je trochu jiné kafe a žádný elegantní způsob mě nenapadá.SamotnýNějak mi uniká k čemu by to jako mělo být dobré.die
umožňuje aj iný parameter ako scalardie new XYZ::Exception;Ono, aj catch sa dá implmentovať štýlomtry {} catch qr/aaa/ => {} catch 'AAA::Exception' => {} ...Btw, keď spomínatelocal
, také jeho použitie na "dočasné" prekrytie ľubovoľnej funkcie môže byť zaujímavéOd včera mi bohužiaľ panikári kernel, takže len naznačím rozpracovanú myšlienku:
sub try (&;@) { my (my ($try, %subs) = @_; return new Exception::Block ($try, \ %subs) if defined wantarray; ... } # priklad použitia my $block = try { ... } catch A => { ... } catch qr/B) => { ... }; $block->('www.abclinuxu.cz'); $block->('www.example.com'); $block->catch (A => sub { ... })->('...');
Nějak mi uniká k čemu by to jako mělo být dobré.Napr situácia, keď funkcia/metóda štandardne ošetruje niektoré/všetky výnimky, správne pre 90% použití. Zvyšných 10% definuje svoje vlastné ošetrenia.
with
. To taky není žádný velký problém a dělalo by to přibližně tohle. Pak my přijde jako čistější vytvořit potomka příslušného objektu.