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.
Společnost Meta představila OpenZL. Jedná se o open source framework pro kompresi dat s ohledem na jejich formát. Zdrojové kódy jsou k dispozici na GitHubu.
Google postupně zpřístupňuje českým uživatelům Režim AI (AI Mode), tj. nový režim vyhledávání založený na umělé inteligenci. Režim AI nabízí pokročilé uvažování, multimodalitu a možnost prozkoumat jakékoliv téma do hloubky pomocí dodatečných dotazů a užitečných odkazů na weby.
Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.
Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.
Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.
Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.
Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.
Pristup prepsat existujici implementaci v jinem jazyce je urcite mnohem lepsi nez zacinat od nuly.Ale je to menší zábava (respekt autorovi).
Podpora Pythonu 2.7-3.4Jak je toho dosaženo? Dle zdrojaku mám dojem, že se prostě nepoužívá žádná kolizní syntaxe. Jak se to dá řešit?
#: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "v {0}"Pokud by stejným stylem bylo udělaných vět více, může být v některých použita špatná předložka. Letmý pohled do slovníku rychle ukáže, kolik možností překladu podle kontextu se nabízí – úryvek ze slovnik.cz:
at - k at - na (místo, čas, stav, pohyb, cíl) at - po (cena, množství, např.o ceně k)s at - v (místo, čas, stav) at - z at - u (těsně) at - o (čas, stav) at - při (čas, stav, činnost) at - za (čas, stav) at - alespoň at - jak budete mít čas at - jak to je at - ke at - těsně u (2. p.) at - veSprávný přístup je mít jeden řetězec s celou větou se zástupnými symboly a tu přeložit. Nikoliv slepovat krátké samostatně překládané řetězce do věty s anglickým slovosledem. Naneštěstí v tomto případě to je tak trochu pointa celého toho programu. Dalo by se to zlepšit použitím delších fragmentů, ale ani to ideální nebude. Proto například Osmand má hlasovou navigaci implementovanou v Prologu a každý jazyk má vlastní pravidla, jak skládat věty pro různá oznámení. Pak můžeš mít správně slovosled podle daného jazyka, ale i skloňování, časování a další vymoženosti.
Nedávno som niečo podobné robil pre recurrence rule a podobných problémov je tam dosť veľa a časť z nich je rovnaká pre všetky projekty ktoré vyjadrujú čas/dátum v ľudsky zrozumiteľnom tvare (ak má ísť naozaj o tvar, ktorému majú bez problémov rozumieť ľudia).Vždycky když něco takového čtu, tak si říkám, že asi nejsem člověk. Nejlépe se mi používá tvar, který víceméně standardizuje ISO. Všechno vyjádřeno číselně. Všechna čísla doplněná zleva nulami do jednotného zarovnání. Všechna čísla seřazena podle váhy od největší po nejmenší. Paradoxně je takový způsob ze všech řetězcových zápisů nejvýhodnější i pro počítač.
To "on day 1 of the month", s prižmúrením očí, dáva v angličtine zmysel, ale český preklad "v 1 den v měsíci" má iný význam.To bude asi reakce na úplně jiný komentář.
PS: A len tak pre zaujímavosť, ako by vyzeralo vyjadrenie crontab v "ISO" formáte (a prípadne aj s príkladom pre recurrence rule).Oni definují formát data a času. Musel bys tam doplnit nějaké ty zápisy s crontab. Já osobně nemám problém používat crontab zápis tak jak je, bez nějakých přepisů.
""" Converts a Cron Expression into a human readable string """ class ExpressionDescriptor(object): m_special_characters = ['/', '-', ',', '*'] m_expression = '' m_options = None m_expression_parts = [] m_parsed = FalseProč jsi použil tyhle divné docstringy? V pythonu bývá zvykem používat jako docstring první řetězec v těle funkce. Ty používáš všechny před tělem funkce. Nápověda tak nefunguje:
bystrousak:~/Plocha/cron-descriptor,0$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from cron_descriptor.ExpressionDescriptor import ExpressionDescriptor >>> help(ExpressionDescriptor)
Help on class ExpressionDescriptor in module cron_descriptor.ExpressionDescriptor: class ExpressionDescriptor(__builtin__.object) | Methods defined here: | | __init__(self, expression, options=None, **kwargs) | | __repr__(self) | | __str__(self) | | format_time(self, hour_expression, minute_expression, second_expression='') | | get_day_of_month_description(self) | | get_day_of_week_description(self) | | get_description(self, type=1) | | get_full_description(self) | | get_hours_description(self)Správně by to mělo vypadat takhle:
class ExpressionDescriptor(object): """ Converts a Cron Expression into a human readable string """ m_special_characters = ['/', '-', ',', '*'] m_expression = '' m_options = None m_expression_parts = [] m_parsed = FalseCož pak v help()u vypadá:
Help on class ExpressionDescriptor in module cron_descriptor.ExpressionDescriptor: class ExpressionDescriptor(__builtin__.object) | Converts a Cron Expression into a human readable string | | Methods defined here:Nejde o problém jen u interní funkce help(), ale i různých nápověd v IDE a generování dokumentace. Když už se s tou dokumentací píšeš, tak mi přijde docela škoda jí takhle „zahodit“. Pak taky vidím, že používáš vlastní Enum:
class DescriptionTypeEnum(object): FULL = 1 TIMEOFDAY = 2 SECONDS = 3 MINUTES = 4 HOURS = 5 DAYOFWEEK = 6 MONTH = 7 DAYOFMONTH = 8 YEAR = 9Což by pro budoucí úpravy bylo lepší zapsat spíš jako:
class DescriptionTypeEnum(object): _cnt = (x for x in range(100)) FULL = next(_cnt) TIMEOFDAY = next(_cnt) SECONDS = next(_cnt) MINUTES = next(_cnt) HOURS = next(_cnt) DAYOFWEEK = next(_cnt) MONTH = next(_cnt) DAYOFMONTH = next(_cnt) YEAR = next(_cnt)Není to sice nutnost, ale může ti to ušetřit nepříjemné bugy, protože se to stará o unikátnost hodnoty. Potom tohle
if type == DescriptionTypeEnum.FULL: description = self.get_full_description() elif type == DescriptionTypeEnum.TIMEOFDAY: description = self.get_time_of_day_description() elif type == DescriptionTypeEnum.HOURS: description = self.get_hours_description() elif type == DescriptionTypeEnum.MINUTES: description = self.get_minutes_description() elif type == DescriptionTypeEnum.SECONDS: description = self.get_seconds_description() elif type == DescriptionTypeEnum.DAYOFMONTH: description = self.get_day_of_month_description() elif type == DescriptionTypeEnum.MONTH: description = self.get_month_description() elif type == DescriptionTypeEnum.DAYOFWEEK: description = self.get_day_of_week_description() elif type == DescriptionTypeEnum.YEAR: description = self.get_year_description() else: description = self.get_seconds_description()By bylo asi elegantněji zapsáno jako:
choices = { DescriptionTypeEnum.FULL: self.get_full_description, DescriptionTypeEnum.TIMEOFDAY: self.get_time_of_day_description, DescriptionTypeEnum.HOURS: self.get_hours_description, DescriptionTypeEnum.MINUTES: self.get_minutes_description, DescriptionTypeEnum.SECONDS: self.get_seconds_description, DescriptionTypeEnum.DAYOFMONTH: self.get_day_of_month_description, DescriptionTypeEnum.MONTH: self.get_month_description, DescriptionTypeEnum.DAYOFWEEK: self.get_day_of_week_description, DescriptionTypeEnum.YEAR: self.get_year_description, } description = choices.get(type, self.get_seconds_description)()Nehledě tedy na to, že si tím názvem proměnné shadowuješ interní funkci type().
for i in range(0, len(hour_parts)):Range jede vždy od nuly. Sice to ničemu nevadí, ale ani to nic nepřidává.
if len(description) > 0:Obecně všechny tyhle kontroly se dají přepsat na elegantnější
if description:Tohle
return self.get_segment_description(self.m_expression_parts[0], _("every second"), lambda s: s.zfill(2), lambda s: _( "every {0} seconds").format(s), lambda s: _( "seconds {0} through {1} past the minute"), lambda s: _("at {0} seconds past the minute"))by asi vypadalo podstatně líp, kdybys to rozepsal takhle:
return self.get_segment_description( self.m_expression_parts[0], _("every second"), lambda s: s.zfill(2), lambda s: _("every {0} seconds").format(s), lambda s: _("seconds {0} through {1} past the minute"), lambda s: _("at {0} seconds past the minute") )Já vím, je to čistě otázka vkusu, ale fakt mi to přijde podstatně čitelnější a nemusíš pak zbytečně zalamovat ty výrazy, protože se ti nevešly na konec řádku. Asi by se toho našlo víc, tohle mě napadlo jen tak v rychlosti.
for i in range(0, len(hour_parts)): ... hour_parts[i] ...je lepší (pythoničtější) psát:
for i, hour_part in enumerate(hour_parts): ... hour_part ...
Jo a misto psani sem jsi mohl rovnou udelat fork a poslat PRNerad dělám stylistické pull requesty, protože nemusí být začleněny, protože se ti něco nemusí líbit. Pak je to kopa práce k ničemu. Tohle byly spíš rady, než že by šlo o něco podstatného.![]()
Já se v takových případech zeptám Googlu, jsou stránky kde není problém naklikat si chování a vyplivne to zápis pro CRON. Nevím ale jistě jestli to jde i obráceně, tedy vložit a nechat si vypsat co se bude dít
Zrovna konfigurator CRONu se da napsat tak aby uzivatel nic nerozbyl... protoze se tam dostane jen to co tam sam v te aplikaci pustis...To ovšem pak není konfigurátor cronu, ale custom plánovač na vybrané akce. Jestli na spouštění úloh používá vlastní proces nebo cron je jen implementační detail. Webhosting tady asi řešit nebudeme. :)
Tiskni
Sdílej: