V sobotu 1. června lze navštívit Maker Faire Ostrava, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.
Webový server Caddy (Wikipedie) s celou řadou zajímavých vlastností byl vydán ve verzi 2.8 (𝕏). Přehled novinek na GitHubu.
Byla vydána verze 3.0 (@, 𝕏) svobodného softwaru HAProxy (The Reliable, High Performance TCP/HTTP Load Balancer; Wikipedie) řešícího vysokou dostupnost, vyvažování zátěže a reverzní proxy. Detailní přehled novinek v příspěvku na blogu společnosti HAProxy Technologies.
Společnost Framework Computer představila novou vylepšenou verzi svého modulárního notebooku Framework Laptop 13 s Intel Core Ultra Series 1, displej s lepším rozlišením a novou webovou kameru. Přímo do Česka jej zatím koupit nelze.
Byla vydána nová verze 2.16 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.
TerminalTextEffects (TTE) je engine pro vizuální efekty v terminálu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
Od čtvrtka 30. 5. do soboty 1. 6. lze v Praze navštívit Veletrh vědy, tj. největší populárně naučnou akci v České republice, kterou každoročně od roku 2015 pořádá Akademie věd ČR. Vstup zdarma.
Canonical představil Ubuntu optimalizované pro jednodeskový počítač s RISC-V procesorem Milk-V Mars.
Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 24.5.1 Havier. Přehled novinek v Changelogu.
Společnost xAI založena Elonem Muskem a stojící za AI LLM modelem Grok získala investici 6 miliard dolarů.
javac
od Sunu od verze 1.5. A je to zdokumentovaná funkce, všichni (hm, skoro všichni) o ní vědí a vědí, že release projektu se dělá jako čistý build, nikdy jako výsledek inkrementální kompilace. Inkrementální kompilace je jenom pomůcka pro zrychlení vývoje (a třeba takový elcipse kompilátor dělá i horší věci, klidně přeloží soubor se syntaktickou chybou a příslušnou metodu s chybou nahradí pouze vyhozením výjimky, kde je zpráva o tom, že tam je syntaktická chyba).
Conf c = new Conf();
, tak kompilátor předpokládá, že třída Conf bude vždy vypadat tak, jak je popsána v Conf.java a všemožné optimalizace na to nejspíš spoléhají. Kdežto když použiješ Conf c = Class.forName("Conf").newInstance();
, tak by to mělo fungovat, protože se třída hledá až v runtimeu (stejně tak by parametrem forName mohla být proměnná).
Pokud tvrdíš, že třída Conf
vypadá tak a tak a potom ji vyměníš, je to jako bys otevřel slinkovaný céčkový program v hexaeditoru a začal přepisovat části odpovídající nějakému objektu - taky radši použiješ shared object (.so).
Skrátka třídy, které se navzájem "jůzujou" je lepší považovat za "slinkované", v prvním případě používáš přímo třídu Conf
, v druhém pouze třídu java.lang.Class
, která se, předpokládám, měnit nebude.
A rada na závěr: na konfiguraci je XML.
PS: v mém projektíku si z různých důvodů nemůžu konfiguraci v XML dovolit
Tak použij -D
parametry
I tak bych to řešil properties souborem na ClassPath. Kvůli jedný blbině nemusíš zbytečně rekompilovat…
pokud nepotřebuje uživatel dynamické změnyCož pravděpodobně potřebuje, když vyměňuje .class soubory. Teď nemyslím konkrétně tenhle případ - zapínání/vypínání debugování se takhle řešit dá, ale jak už tu zaznělo, je potřeba před produkčním nasazením celý projekt přebuildovat.
Co se té třídy Conf
týče:
zpravidla jsou tyto třídy javí interfaces, takže s nimi není třeba nikterak šachovat (když jo, tak se refaktoruje na obou stranách). A jak pak vypadá ta ConfImpl
třída — to je už opravdu jedno. Jenom musí implementovat ten interface. Takhle třeba funguje vychytávka services.
Docela se mi líbí ten princip modulů v NetBeans. Každý modul je rozdělen na dvě části (pozor, zjednodušuji!): první je public API (ty interfáče) a pak pod tím — ta druhá — je private API s implementací. Pomocí ClassLoaderů je zajištěno, že jiný modul se k té druhé části nedostane. Takže já pak můžu mít několik modulů, které implementují stejné veřejné API a implementace dělá něco trošku/úplně jiného. Je to v podstatě ten model services, akorát víc dotažený.
Sranda. Zrovna včera jsem na tenhle paskvil upozornil v naší aplikaci. Konstanty obencě by neměly být public
nebo package public
. Od toho jsou enum
y. (Pro rejpaly: neříkám, že to nejde nebo že se to nesmí. Ale zrovna debug level je učebnicová ukázka, jak se to používat nemá. )
Když není nazbyt, tak se to řeší takto:
public static final String SOMETHING; static { SOMETHING = "foo"; }
Takto se vytvoří jen vazba na třídu (aspoň současná verze javac
ten trik neumí odhalit) a inlinování provede až ClassLoader za běhu.
Doporučuji si přečíst pár článků o modulárním programování v Javě. Toto konkrétně se řešilo před pár lety, když designovali GlassFish v3. Obecně o modulárním programování pojednává Jaroslav Tulach z NetBeans.
Ale třeba o tom vím jen velký kulový. Koneckonců, v Javě jsem dělal naposledy před rokem.
Classloaderovou magii opravdu nemusím.
ClassLoadeři jsou mí nejlepší kamarádi. Ale já byl vždycky jinej. Když si vzpomenu třeba na ResourceClassLoader
, který natahoval aplikaci z resourců přímo z Jar archivu, takže jsem nemusel řešit takový ty lib/
adresáře a -cp
parametry… Nebo můj miláček — EndorsedClassLoader
. A endorsed.dirs
šly tam, odkud přišly.
takže jsem nemusel řešit takový tyJarJar Linkslib/
adresáře a-cp
parametry
No, až na to, že to ty knihovny přebalí a cosi to udělá s třídami — tak je to cool. Ale ten ClassLoader mi připadá trošku bezpečnější.
Tiskni Sdílej: