Jonathan Thomas oznámil vydání nové verze 4.1 video editoru OpenShot (Wikipedie). Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.
Při běžné migraci virtuálního stroje mezi hypervizory se jeho MAC adresa přesune na jiný leaf switch. EVPN tuto změnu distribuuje pomocí BGP Type-2 route a MAC mobility sequence number. Problém nastává, pokud útočník podvrhne zdrojovou MAC adresu jiného zařízení. Leaf může změnu interpretovat jako legitimní přesun MAC a rozšířit ji přes BGP do celé fabric. Výsledkem může být přesměrování provozu určeného původnímu zařízení. Autor článku rozebírá možnosti detekce pomocí sledování MAC moves, BGP route reflektorů a kontroly na přístupové vrstvě.
Vývojáři desktopového prostředí Enlightenment (Wikipedie) a souvisejících knihoven Enlightenment Foundation Libraries (EFL) vydali nové verze. Enlightenment byl vydán ve verzi 0.28.0 a Enlightenment Foundation Libraries ve verzi 1.29.
Cloudflare zjistil, že některé odpovědi modelu GLM-5.3 obsahovaly části dat z předchozích požadavků jiných zákazníků. Příčinou byla kombinace chybné konfigurace a chyby v inference enginu SGLang. Model podporoval kontextové okno 1 048 576 tokenů, ale GPU KV cache pool měl kapacitu pouze 681 280 tokenů. Při překročení kapacity docházelo k nesprávnému zpracování odmítnutého požadavku. Decode část systému následně pracovala se starými
… více »Vývojáři Knot Resolver vysvětlují, jak změnili rozhodování o tom, které DNS záznamy ponechat v cache a které odstranit. Článek obsahuje skutečná měření: devět hodin DNS provozu při 2 000 QPS, srovnání cache o velikosti 25 MB a 40 GB a také porovnání s BIND 9, kromě algoritmů obsahuje konkrétní doporučení pro konfiguraci a diagnostiku.
Největší kryptoměnová burza světa Binance se stala terčem útoku, při kterém podvodníci odcizili během několika minut kryptoměny v hodnotě přibližně 6,3 miliardy dolarů. Jedná se o největší kryptoměnovou krádež v historii, přibližně čtyřikrát větší než loňský útok na burzu Bybit. Binance se podařilo ve spolupráci s partnery zmrazit aspoň aktiva v hodnotě zhruba 3 miliard dolarů a slíbila, že veškeré ztráty pokryje z vlastních prostředků.
Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.
Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?
Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.
Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.
$a = new A();
Což je na tvrdo globální namespace - zkoušel sem čachrovat s use NS; atd. ale bez úspěchu
Jsem v koncích... má někdo nápad? Uniká mi něco?
Díky moc za radu/postrčení!
$trida = Model::factory('JmenoTridy');
A v té statické metodě factory ošéfovat co je třeba.
V krajním případě tohle použiju, děkuju za návrh!
Nenapadá někoho něco ještě lepšího? Nejraději bych psal:
$trida = new JmenoTridy();Ale zdá se, že tohle nemá řešení
namespace NS;
class A extends \A {
}
Pro požadavek 2) zavolám v jádře:
... $a = new A(); ...Interpret nahraje třídu z jádra... donutit na jinou ho dokážu pouze konstruktem uses, ale pak nebude fungovat varianta, kdy nová třída neexistuje. Opravdu si začínám myslet, že to prostě nemá řešení a budu muset udělat nějaký workaround typu factoring... Díky
vymyslím si, že v jedné implementaci chci aby metoda A::X vracela jiný výsledekJak moc jiný?
při vytváření instance ve zbytku aplikace volám: $a = new A();Proč to nemůžete ve zbytku aplikace volat jinak?
vymyslím si, že v jedné implementaci chci aby metoda A::X vracela jiný výsledekJak moc jiný?
Typicky jde o customizace nějaké obecné metody. Např. metoda standardně vypisuje všechny soubory v adresáři, ale já chci v jedné implementaci, aby nevypisovala skryté (.*) - tedy zdědím, předeklaruju tu metodu, ta zavolá původní metodu a profiltruje výsledek na .*
při vytváření instance ve zbytku aplikace volám: $a = new A();Proč to nemůžete ve zbytku aplikace volat jinak?
Ne včechna užití té třídy jsou napsaná mnou - využívám framework.
Před chvílí sem s kolegou vykoumal řešení, které mi příjde akceptovatelné: core třída i ta implementační budou mít jméno s nějakým prefixem a v autoloaderu zařídím vedle require příslušného souboru také vytvoření aliasu třídy na "bezprefixový zápis". Např.
// deklaruju core v souboru $core_prefix/A.php
class Core_A {};
// deklaruju změněnou třídu v souboru $implementacni_prefix/A.php
class Implementace_A extends Core_A {}
// v běžném kódu používám
$a = new A();
// popř.
class B extends A {}
// v autoloaderu podle jména třídy najdu správný include
require_once($classname);
class_alias($prefix.$classname, $classname);
Nic lepšího asi nevymyslím
Např. metoda standardně vypisuje všechny soubory v adresáři, ale já chci v jedné implementaci, aby nevypisovala skryté (.*) - tedy zdědím, předeklaruju tu metodu, ta zavolá původní metodu a profiltruje výsledek na .*Není jednodušší nechat tu původní metodu bejt a udělat si ten filtr bokem?
$fileFinder = new FileFinder(); $filter = new NoHiddenFilesFilter($fileFinder->getFiles()); $files = $filter->getFiltered();Nebo použít dekorátor
$baseFileFinder = new FileFinder(); $noHiddenFilesFinder = new NoHiddenFilesFinder($fileFinder); $files = $noHiddenFilesFinder->getFiles();V obou případech nemusíte na původní třídu ani hrábnout.
class aplikace -(1)-> class fileFinder -(2)-> class htmlRendererRozhodnu se, že chci upravit fileFinder diskutovaným způsobem. A mám následující možnosti: 1) aplikace musí být naprogramovaná tak, že umí nahradit třídu fileFinder jinou (např. v konfiguráku bude jméno třídy) 2) fileFinder musí mít rozhraní pro aplikování vybraných operací s možností ovlivnit výsledné chování - tedy fileFinder musí mít rozhraní pro pluginy a v runtime někde uloženou jejich konfiguraci - to je Vaše řešení? 3) do místa (1) vložím vlastní kód, který udělá co bude potřebovat, využije třeba alternativní třídu pro fileFinder, ale pak musí zajistit volání htmlRendereru v kroku (2) sám 4) řešení co sem navrhl odpoledne - tedy nějak elegantně zařídím, aby celá aplikace používala místo třídy fileFinder úplně jinou třídu (potomka původní nebo implementující stejný interface) Varianta 1) a 2) je OK, ale vyžaduje předem vyspecifikované podporované změny chování aplikace. Každé rozšíření těchto možností znamená netriviální úpravu aplikace. Navíc tato řešení neumí měnit předky používaných metod. Neumí se "vklínit" do posloupnosti dědění, a nahradit pouze jeden článek. Takto je možné pouze v libovolném místě řetěz dědění přetnout a pak znovu doimplementovat až do finálních tříd (tedy redundance kódu a druhotně podobný nešvar jako má 3) Varianta 3) se mi hrubě nelíbí. Vyžaduje dost redundantní práce. Co říkáte na Variantu 4)?
Pokud je tohle posloupnost volání, tak to je instance něčeho co pracovně nazývám architektura trubka nebo štafeta. Tam máte natvrdo zadrátovánou tu šipku č. 2 a nemůžete s tím nic udělat. To je váš hlavní problém, kterého se potřebujete zbavit. Pokud byste volání předělal takto:class aplikace -(1)-> class fileFinder -(2)-> class htmlRenderer
class aplikace -> class fileFinder
<- $files
-> class htmlRenderer
Tak s tím můžete pak dělat co chcete.
varianta (A): nezávisle fungující Finder a Filter
class aplikace -> class fileFinder
<- $files
-> class fileFilter
<- $filteredFiles
-> class htmlRenderer
nebo
varianta (B): Dědění nebo lépe Dekorátor
class aplikace -> class filteredFileFinder
-> class fileFinder
<- $files
<- $filteredFiles
-> class htmlRenderer
Mým cílem je aplikace, která něco umí a je možné ji co nejširším způsobem a s co nejmenčí redundancí kódu upravovat.Můžete tohle aplikovat na stávající požadavky, nebo ty, které s nějakou rozumnou pravděpodobností očekáváte, ale nemůžete udělat univerzální stroj.
1) aplikace musí být naprogramovaná tak, že umí nahradit třídu fileFinder jinou (např. v konfiguráku bude jméno třídy)To je klasický příklad použití vzoru Factory.
varianta (C): Factory
$className = getConfigOption("fileFinderClass");
$factory = new FileFinderFactory();
$fileFinder = $factory->createFileFinder($className);
2) fileFinder musí mít rozhraní pro aplikování vybraných operací s možností ovlivnit výsledné chování - tedy fileFinder musí mít rozhraní pro pluginy a v runtime někde uloženou jejich konfiguraci - to je Vaše řešení?To by byl následující kód:
varianta (D): Filter jako plugin funkcionalita Finderu $filter = new WhateverFilter(); $fileFinder = new FileFinder($filter); $files = $fileFinder->getFiles();To je ještě další varianta, kterou můžete použít.
3) do místa (1) vložím vlastní kód, který udělá co bude potřebovat, využije třeba alternativní třídu pro fileFinder, ale pak musí zajistit volání htmlRendereru v kroku (2) sámTo je něco čemu byste se měl vyhnout - fileFinder by měl výsledek vracet a ne štafetově předávat a mělo by mu být úplně jedno kdo ho zavolal a komu ten výsledek vrátí. Pak nebude problém s vložením kódu.
4) řešení co sem navrhl odpoledne - tedy nějak elegantně zařídím, aby celá aplikace používala místo třídy fileFinder úplně jinou třídu (potomka původní nebo implementující stejný interface)Tím pouze používáte pneumatické kladivo tam kde stačí trochu ťuknout hřebíček.
Neumí se "vklínit" do posloupnosti dědění, a nahradit pouze jeden článek.Proto se dědění moc nepoužívá - vytváří vazby moc natvrdo. Pokud tam potřebujete něco vklínit, je lepší použít volnější vazby, viz příklady. V kódu nahoře jsem označil varianty ABCD, chtěl bych shrnout výhody a nevýhody každé: A) (nezávislé třídy Finder a Filter) nejobecnější možnost, kde ani jedna třída neví o jiné - můžete kombinovat všechno se vším a udělat téměř jakékoliv chování. B) (Filter jako dekorátor nad Finderem) něco jako dědění, můžete před a po volání základního Finderu provést libovolnou modifikaci a vrátit výsledek ve stejném formátu. Oproti dědění můžete ty modifikace libovolně nabalovat na sebe a to i v době běhu aplikace. C) (Factory) výroba různých komponent (Finderů, Filtrů, ...) je schována na centrální místo, a případně konfigurovatelná uživatelem. Řekl bych, že to je spíš doplňková záležitost k ostatním variantám. D) (Plugin Filter) implicitně předpokládáte že se nějaký filtr použít musí, byť třeba prázdný. Hodí se, pokud je hodně jednoduchých Filtrů ale třeba jen jeden Finder. Místo jednoho filtru můžete třeba pluginovat pole filtrů atd.
Ale každopádně sem si moc rád přečetl a ujasnil výše zmíněné varianty.
A) je fajn, ale až příliš volná - přecijen chci nastavit nějaké mantinely (co má aplikace z byznys pohledu umět)
B) se mi hodně líbí a tak nějak sedí mému stylu
C) souhlasím, dobrá věc, ale dělat tak všechny třídy v celé aplikaci je IMO nesmysl (a ani to nejde)
D) vnímám jako nejsprávnější, ale (alfa) sem na to línej, (beta) těžko se to mění a projekt žije a vyvíjí se, ...
Hlavní motivací pro pneumatické kladivo je nedůvěra v zákazníky
...kdybych vymyslel variantu laserové dělo, s chutí kladivo zahodím
...nejspíš tedy půjdu cestou "pneumatického kladiva"Akorát že, i když tu třídu nahradíte v runtime nebo nějakým hackem s include, tak nevyřešíte podstatu problému a to sice, že budete mít pořád na krku tu odpornou povinnost v náhradní třídě volat ten htmlRenderer.
C) souhlasím, dobrá věc, ale dělat tak všechny třídy v celé aplikaci je IMO nesmysl (a ani to nejde)Jsou na to frameworky.
Myslím, že ne... resp. šikovným designem metod docílím toho, že bude nějaká "worker" metoda, kterou můžu měnit a další metody zařídí začlenění do systému - těch se dotýkat nebudu (moct). Navíc je tak velice elegantně vyřešeno automatické používání nové funkčnosti v celém systému....nejspíš tedy půjdu cestou "pneumatického kladiva"Akorát že, i když tu třídu nahradíte v runtime nebo nějakým hackem s include, tak nevyřešíte podstatu problému a to sice, že budete mít pořád na krku tu odpornou povinnost v náhradní třídě volat ten htmlRenderer.
Jako např? ...jak řeší dědění z těchto tříd? Nechci už moc prudit, odkaz na doc úplně stačíC) souhlasím, dobrá věc, ale dělat tak všechny třídy v celé aplikaci je IMO nesmysl (a ani to nejde)Jsou na to frameworky.
Díky!
šikovným designem metod docílím toho, že bude nějaká "worker" metoda, kterou můžu měnitSuper, to zní dobře.
Jako např? ...jak řeší dědění z těchto tříd? Nechci už moc prudit, odkaz na doc úplně stačíZkuste se podívat/inspirovat např. http://substrate-php.org/ případně existuje asi kopa alternativ... hledejte "php ioc framework". Dědění (implementace) bych doporučil na nějaký čas úplně vynechat a zkusit to řešit přes ten "šikovný design"...Díky!
Tiskni
Sdílej: