Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.18. Díky 174 přispěvatelům.
Miliardy korun na digitalizaci služeb státu nestačily. Stát do ní v letech 2020 až 2024 vložil víc než 50 miliard korun, ale původní cíl se nepodařilo splnit. Od loňského února měly být služby státu plně digitalizované a občané měli mít právo komunikovat se státem digitálně. Do tohoto data se povedlo plně digitalizovat 18 procent agendových služeb státu. Dnes to uvedl Nejvyšší kontrolní úřad (NKÚ) v souhrnné zprávě o stavu digitalizace v Česku. Zpráva vychází z výsledků víc než 50 kontrol, které NKÚ v posledních pěti letech v tomto oboru uskutečnil.
Nadace Wikimedia, která je provozovatelem internetové encyklopedie Wikipedia, oznámila u příležitosti 25. výročí vzniku encyklopedie nové licenční dohody s firmami vyvíjejícími umělou inteligenci (AI). Mezi partnery encyklopedie tak nově patří Microsoft, Amazon a Meta Platforms, ale také start-up Perplexity a francouzská společnost Mistral AI. Wikimedia má podobnou dohodu od roku 2022 také se společností Google ze skupiny
… více »D7VK byl vydán ve verzi 1.2. Jedná se o fork DXVK implementující překlad volání Direct3D 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.
Byla vydána verze 12.0.0 knihovny libvirt (Wikipedie) zastřešující různé virtualizační technologie a vytvářející jednotné rozhraní pro správu virtuálních strojů. Současně byl ve verzi 12.0.0 vydán související modul pro Python libvirt-python. Přehled novinek v poznámkách k vydání.
CreepyLink.com je nový zkracovač URL adres, 'díky kterému budou vaše odkazy vypadat tak podezřele, jak je to jen možné'. Například odkaz na abclinuxu.cz tento zkracovač převádí do podoby 'https://netflix.web-safe.link/logger_8oIlgs_free_money.php'. Dle prohlášení autora je CreepyLink alternativou ke zkracovači ShadyURL (repozitář na githubu), který dnes již bohužel není v provozu.
Na blogu Raspberry Pi byla představena rozšiřující deska Raspberry Pi AI HAT+ 2 s akcelerátorem Hailo-10 a 8 GB RAM. Na rozdíl od předchozí Raspberry Pi AI HAT+ podporuje generativní AI. Cena desky je 130 dolarů.
Wikipedie slaví 25. výročí svého založení. Vznikla 15. ledna 2001 jako doplňkový projekt k dnes již neexistující encyklopedii Nupedia. Doména wikipedia.org byla zaregistrována 12. ledna 2001. Zítra proběhne v Praze Večer svobodné kultury, který pořádá spolek Wikimedia ČR.
Po více než dvou letech od vydání předchozí verze 2.12 byla vydána nová stabilní verze 2.14 systémového zavaděče GNU GRUB (GRand Unified Bootloader, Wikipedie). Přehled novinek v souboru NEWS a v aktualizované dokumentaci.
Google Chrome 144 byl prohlášen za stabilní. Nejnovější stabilní verze 144.0.7559.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 10 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře (YouTube).
with.Python 2.5 přináší jednoduchý způsob, jak předávat generátorům hodnoty. Tak jak byly představeny ve verzi 2.3, dokázaly pouze vrátit výstup. Nebyla možnost, jak do nich přidat nějaké nové informace. Špinavé triky spočívaly v používání globálních proměnných, přes které se potřebné parametry předávaly.
Co je to vlastně generátor? Jedná se o objekt, který vytváří svoje hodnoty dynamicky za běhu. Klasickým příkladem je xrange. Zatímco range vytvoří celý seznam v paměti a potom se nad ním iteruje, generátorový xrange hodnoty vytváří a vrací průběžně. Jednoduchý příklad je:
def counter (maximum):
i = 0
while i < maximum:
yield i
i += 1
Výsledkem volání counter(10) je iterátor vracející hodnoty od 0 do 9. Konstrukce yield se chová podobně jako return, pouze s tím rozdílem, že lokální proměnné zůstávají v paměti (podobá se to tak statickým proměnným v C). Metoda next() tedy znovu zavolá kód iterátoru, ovšem s tím, že hodnoty jsou zachovány z předchozí iterace.
Zatímco do teď byl yield příkazem, který nevracel hodnotu, v nové verzi se jedná o výraz, jehož výsledek je možné svázat se jménem proměnné.
val = (yield i)
Doporučuje se kód vždy uzavřít do závorek, pokud s návratovou hodnotou něco děláte. Nejsou sice pokaždé důležité (PEP 342 obsahuje přesná pravidla, kdy je použít a kdy ne), ale je jednodušší je používat vždy, přesto, že to může být mírně nepythonovské. Metoda send(value) odesílá hodnoty do generátoru. Nejlepší bude asi uvést příklad:
def counter (maximum):
i = 0
while i < maximum:
val = (yield i)
# Pokud došlo k předání parametru, změň vnitřní hodnotu čítače
if val is not None:
i = val
else:
i += 1
a zde je způsob, jakým můžeme ovlivnit hodnoty vnitřního čítače:
>>> it = counter(10)
>>> print it.next()
0
>>> print it.next()
1
>>> print it.send(8)
8
>>> print it.next()
9
>>> print it.next()
Traceback (most recent call last):
File ``t.py'', line 15, in ?
print it.next()
StopIteration
V případě, kdy použijeme metodu send(value), yield vrací hodnotu value. Při zavolání metody next() vrací None.
Mimo send() byly přidány dvě metody. První z nich throw(type, value=None, traceback=None) slouží ke generování výjimek z těla generátoru. Druhá, metoda close(), vyvolá uvnitř generátoru výjimku GeneratorExit, která jej ukončí. Po zachycení této výjimky musí generátor vyvolat GeneratorExit, anebo StopIteration, přičemž zachycení této výjimky v těle generátoru není povoleno a vede k vyvolání RuntimeError. Případný úklidový kod musí být v bloku finally.
Souhrn těchto změn změnil generátory z pozice pouhých producentů na producenty i konzumenty. Staly se z nich korutiny (coroutines), což je obecnější forma podprogramů (subroutines). Zatímco běžné podprogramy začínají na jednom a končí na jiném místě, korutiny mohou být zavolány, ukončeny a pozastaveny na několika místech (v místech výrazu yield).
Navíc, metoda close() má jeden postranní efekt. Je volána v případě, že je objekt generátoru odklízen z paměti (odborněji garbage-collected). To znamená, že jeho kód může před svým ukončením proběhnout ještě naposledy. Syntaktické omezení, že yield není možné kombinovat s try ... finally bylo zrušeno. Tyto změny souvisí i s konstrukcí with, která je v PEP 343.
PEP 342, Coroutines via Enhanced Generators
PEP sepsal Guido van Rossum a Phillip J. Eby; implementoval Phillip J. Eby. Navíc obsahuje zajímavější [some fancier] způsoby použití generátorů jako korutin.
Konstrukce with zpřehledňuje kód, který by předtím musel používat try ... finally k zabezpečení úklidového kódu. Jedná se o novou řídící strukturu:
with expression [as variable]:
with-block
Výraz je vyhodnocen a jeho výsledkem může být objekt podporující context management protocol. Návratovou hodnotu můžeme volitelně pojmenovat. Objekt nyní může implementovat kód, který proběhne před blokem with a nějaký úklidový kód, který je proveden po ukončení bloku, včetně případu, že vyhodí výjimku.
Nejprve musíme přidat následující direktivu - from __future__ import with_statement, přičemž se očekává, že od verze 2.6 to bude výchozí nastavení. Některé standardní objekty obsahují podporu pro context management protocol už nyní. Příkladem je soubor:
with open('/etc/passwd', 'r') as f:
for line in f:
print line
Po vykonání tohoto kódu dojde k automatickému uzavření souboru a to i v případě, že smyčka for vyvolá výjimku.
Nová funkce localcontext() v modulu decimal umožňuje snadno ukládat a obnovovat kontext desítkových čísel, což zahrnuje přesnost a způsoby zaokrouhlení.
from decimal import Decimal, Context, localcontext
# Výchozí přesnost 28
v = Decimal('578')
print v.sqrt()
with localcontext(Context(prec=16)):
# V tomto bloku je nastavena přesnost 16.
# Originální stav bude automaticky obnoven
print v.sqrt()
PEP 343, The ``with'' statement
PEP sepsal Guido van Rossum a Nick Coghlan; implementoval Mike Bland, Guido van Rossum a Neal Norwitz. PEP ukazuje kód generovaný pro tuto konstrukci, který může pomoci pochopit, jak to celé vlastně pracuje.
Používat with je poměrně jednoduché. Implementace takové podpory je složitější. Spousta lidí bude používat with pouze ve spojení s existujícími objekty, a tak nepotřebuje znát nízkoúrovňové detaily. Ovšem autoři nových objektů pozadí této techniky znát musí, pokud chtějí, aby uživatelé jejich objektů mohli používat with.
Na vyšší úrovni context management protocol znamená:
__enter__() a __exit__(). __enter__() se zavolá a návratová hodnota se sváže s proměnnou VAR. Pokud nebyla napsána klauzule 'as VAR', jednoduše se zahodí.with (BLOCK) se začne provádět.__exit__(type, value, traceback), přičemž stejné údaje jsou vráceny i sys.exc_info(). Návratová hodnota této metody určuje, zda se výjimka zavolá znovu, či ne. Jakákoli nepravdivá hodnota znovu vyvolá výjimku a hodnota True ji potlačí.__exit__() se stejně zavolá, ale všechny její parametry obsahují None.Ukážeme si teď vše na příkladu, což jsou databázové transakce. Pro neznalé: každá slušná databáze zpracovává požadavky v transakcích. Transakce se sestává z jednoho nebo několika příkazů, které musí být na konci potvrzeny (commit), anebo mohou být odvolány (roll-back). Ostatní vlastnosti, jako například atomicita transakcí, nejsou pro náš příklad významné.
Cílem je mít možnost napsat něco jako:
db_connection = DatabaseConnection()
with db_connection as cursor:
cursor.execute('insert into ...')
cursor.execute('delete from ...')
Transakce může být potvrzena, pokud blok kódu proběhne bezchybně, anebo odvolána, když dojde v výjimce. Základní rozhraní pro DatabaseConnection je potom:
class DatabaseConnection:
# Databázové rozhraní
def cursor (self):
"Vrací objekt kurzor a začíná novou transakci"
def commit (self):
"Potvrdí (commit) transakci"
def rollback (self):
"Odvolá (roll-back) transakci"
Implementace metody __enter__() je jednoduchá. Pouze musí začít novou transakci. V tomto případě je konkrétní kurzor (v databázové terminologii se tak označuje ukazatel na právě zpracovávaný řádek) užitečný, takže jej vrátíme. Uživatel jej poté může pojmenovat a používat.
def __enter__ (self):
# Code to start a new transaction
cursor = self.cursor()
return cursor
Naproti tomu metoda __exit__() je trochu komplikovanější. Nejprve musí zjistit, zda nedošlo k výjimce. Pokud ne, transakci potvrdí, pokud k výjimce dojde, transakci odvolá. V následujícím kódu zajistíme znovuvyvolání výjimky vrácením výchozí hodnoty None.
def __exit__ (self, type, value, tb):
if tb is None:
# No exception, so commit
self.commit()
else:
# Exception occurred, so rollback.
self.rollback()
# return False
Nový modul contextlib obsahuje užitečné funkce a dekorátory, které usnadňují psaní objektů, které podporují with. Dekorátor se nazývá contextmanager a umožňuje nám napsat pouze jednu funkci místo psaní třídy. Generátor může pomocí yield vrátit pouze jednu hodnotu. Kód nad konstrukcí yield je proveden jako __enter__(), hodnota vrácená výrazem s yield se sváže se jménem v klauzuli as name. Kód po výrazu s yield potom slouží jako metoda __exit__(). Náš příklad teď tedy vypadá takto:
from contextlib import contextmanager
@contextmanager
def db_transaction (connection):
cursor = connection.cursor()
try:
yield cursor
except:
connection.rollback()
raise
else:
connection.commit()
db = DatabaseConnection()
with db_transaction(db) as cursor:
...
Modul contextlib rovněž obsahuje funkci nested(mgr1, mgr2, ...) která umí zkombinovat několik context manažerů, a proto není nezbytně nutné psát vnořené with. Například je možné spojit transakci se zámkem vlákna:
lock = threading.Lock() with nested (db_transaction(db), lock) as (cursor, locked): ...
V posledním díle si (občas dost letecky) probereme zbytek novinek, jako nové hierarchie tříd pro výjimky nebo způsob, jak přímo spouštět funkce z C knihoven.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Cizí termiti jsou občas zákeřní.
). Blbé je, že to navěky zůstane v URL
Blbé je, že to navěky zůstane v URLAle kdež... už je to opraveno
(define (counter)
(define value 0)
(lambda y
(set! value (+ value (if (null? y) 1 (car y))))
value))
napadlo me (mirne ovlivnen dnesnim clankem), ze pomoci generatoru jde zavest line vyhodnocovani a s tim spojene streamy. je to moc hezka hracka... ale ted otazka jestli to nekdo v praxi pouzije....