Byl vydán Mozilla Firefox 126.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vylepšena byla funkce "Zkopírovat odkaz bez sledovacích prvků". Přidána byla podpora zstd (Zstandard). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 126 je již k dispozici také na Flathubu a Snapcraftu.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 11.0. Přehled novinek v aktualizované dokumentaci.
Byla vydána nová verze 24.0 linuxové distribuce Manjaro (Wikipedie). Její kódové jméno je Wynsdey. Ke stažení je v edicích GNOME, KDE PLASMA a XFCE.
Byla představena oficiální rozšiřující deska Raspberry Pi M.2 HAT+ pro připojování M.2 periferii jako jsou NVMe disky a AI akcelerátory k Raspberry Pi 5. Cena je 12 dolarů.
V Praze o víkendu proběhla bastlířská událost roku - výstava Maker Fair v Praze. I strahovští bastlíři nelenili a bastly ostatních prozkoumali. Přijďte si proto i vy na Virtuální Bastlírnu popovídat, co Vás nejvíce zaujalo a jaké projekty jste si přinesli! Samozřejmě, nejen českou bastlířskou scénou je člověk živ - takže co se stalo ve světě a o čem mohou strahováci něco říct? Smutnou zprávou může být to, že provozovatel Sigfoxu jde do
… více »Kam asi vede IllllIllIIl.llIlI.lI? Zkracovač URL llIlI.lI.
Společnost OpenAI představila svůj nejnovější AI model GPT-4o (o jako omni, tj. vše). Nově také "vidí" a "slyší". Videoukázky na 𝕏 nebo YouTube.
Ondřej Filip publikoval reportáž z ceremonie podpisu kořenové zóny DNS. Zhlédnout lze také jeho nedávnou přednášku Jak se podepisuje kořenová zóna Internetu v rámci cyklu Fyzikální čtvrtky FEL ČVUT.
Společnost BenQ uvádí na trh novou řadu monitorů RD určenou pro programátory. První z nich je RD240Q.
Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem nadále zůstává Frontier od HPE (Cray) s výkonem 1,206 exaFLOPS. Druhá Aurora má oproti loňsku přibližně dvojnásobný počet jader a dvojnásobný výkon: 1,012 exaFLOPS. Novým počítačem v první desítce je na 6. místě Alps. Novým českým počítačem v TOP500 je na 112. místě C24 ve Škoda Auto v Mladé Boleslavi. Ostravská Karolina, GPU
… více »Sám jsem člověkem více než cokoli jiného rozporuplným, a bohužel i mé texty jsou začasté plny rozporů. Když si jich někdy všimnu a snažím se o vysvětlování, čitelnost obvykle povážlivě klesá. Celé to je jen snaha zdokonalovat svoje vyjadřování, snaha vměstnat notně zkurvenou poezii do schémat hovorové řeči. A snad i já mohu věřit, že hledat krásná slova je lepší než zabíjet a vraždit.
V posledních týdnech se pár chytrých pánů od Javy baví tím, že jak na běžícím pásu generují návrhy specifikace closures pro jazyk Java. Vzhledem k tomu, o jaká jména se jedná, je už celkem jasné, že se closures v Javě 7 dočkáme. Ale v jaké podobě?
Nejdříve dva pojmy, velmi vulgárně a z pozice funkcionálního panice: prvotřídní funkce je funkce, která může být přiřazena do proměnné. Což implikuje pár dalších kouzel: funkce může mít jako návratovou hodnotu funkci. Funkci lze jako parametr předat funkci. Tohle samo o sobě by nebylo příliš zajímavé, všichni jistě známe ukazatel na funkci (moderní onanisté pak řetěz typově bezpečných referencí na metodu), takže co můžeme nabídnout víc?
Closure je prvotřídní funkce, ve které jsou viditelné všechny proměnné, které jsou viditelné v místě její deklarace. To jistě platí i u běžné funkce, jak jsme na ni zvyklí, ale protože ta naše je prvotřídní, můžeme ji ve skutečnosti volat i z míst, kde bychom vůbec neočekávali, že je viditelná. Malý příklad, třeba v JavaScriptu, který se docela dobře čte a je na closures postavený:
function vnejsi() { var i = 1; function vnitrni() { alert(i); } return vnitrni; } i = -1; alert(i); // -1 funkce = vnejsi(); funkce(); // 1!!!
Jeden hezký tutoriál na téma closures v JavaScriptu s řadou příkladů najdete na JavaScript Closures for Dummies.
Způsobů využití jsou spousty, zmiňme aspoň dva nejtriviálnější, které určitě přijdou vhod každému programátorovi:
Dáme si jednu drobnou ukázku: řekněme, že chceme v seznamu vyhledat všechna sudá čísla a uložit je do nového seznamu. Příklad je napsaný tentokrát v jazyce Groovy. Srovnejte sami:
cisla = 1 .. 10 // varianta 1., klasická sudaCisla = [] for (c in cisla) { if (c % 2 == 0) { sudaCisla.add(c) } } // varianta 2. sudaCisla = cisla.findAll {c -> c % 2 == 0}
No, a jak je to konečně s tou Javou? První příklad, ten v JavaScriptu, můžeme v současnosti přepsat použitím anonymní vnitřní třídy:
public class Test { public interface Funkce { public void proved(); } public static Funkce vnejsi() { final int i = 1; Funkce vnitrni = new Funkce() { public void proved() { System.out.println(i); } }; return vnitrni; } public static void main(String[] args) { final int i = -1; System.out.println(i); // -1 Funkce funkce = vnejsi(); funkce.proved(); // výborně, 1 } }
Jednu nevýhodu vidíme hned, je jí velmi rozvláčný zápis a nutnost explicitně deklarovat rozhraní. Poměr "syntaktického balastu" a výkonného kódu bývá většinou dost mizerný, ale pro jakous takous "emulaci" prvotřídních funkcí se to použít dá. Jako closure už to ale skřípe: z vnitřní třídy máme přístup jen k těm proměnným, které jsou final
(zdráhám se jim říkat konstanty). Takže když do naší JavaScriptové ukázky přidáme jeden řádek:
function vnitrni() { i++; alert(i); }
v Javě už si neškrtneme. Zajímavé je, že původně mělo být možné přistupovat ke všem proměnným vnější třídy, čímž bychom dostali plnohodnotné closures (se strašlivou syntaxí), ale zdá se, že průměrný programátor té doby pro ně ještě nebyl úplně zralý…
Používá se občas jeden hack, jehož podstata je jasně patrná na příkladu s primitivním typem: namísto hodnoty se použije (neměnitelná) reference na ni, typicky jednoprvkové pole. Pole samotné bude final
, ale jeho obsah můžeme měnit jak se nám zlíbí:
public static Funkce vnejsi() { final int[] i = new int[] {1}; Funkce vnitrni = new Funkce() { public void proved() { i[0]++; System.out.println(i[0]); } }; return vnitrni; }
S referenčními typy to pochopitelně funguje úplně stejně, ale celé to je zatraceně zběsilé a nehezké. A protože konkurence nikdy nespí (o čemž jsem se včera sám trapně přesvědčil), pohnuly se ledy i u Sunu. Za přečtení určitě stojí všechny tři zatím existující návrhy Closures for Java od pánů Gilada Brachy, Neala Gaftera, Jamese Goslinga a Petera von der Ahé – 1, 2, 3 –, stejně jako "trucpodnik" Boba Lee, Douga Lea a Joshe Blocha Concise Instance Creation Expressions.
Pěkné je, jak mezi verzemi 0.1 a 0.2 Closures for Java zmizely funkční typy a spolu s tím se výraz function types and inline function-valued expression called closures změnil na delayed-execution blocks of code called closures, ale z komentáře u verze 0.1 mi vyplývá, že jde vlastně o dva paralelní návrhy. Jeden je založený na zařazení funkcí do typového systému jazyka, druhý na využití rozhraní. Z toho je zřejmé, že je ještě velmi brzo na odhady, jak budou v Javě skutečně closures vypadat – já osobně bych dal přednost verzi založené na funkčních typech, ale ani Concise Instance Creation Expressions nakonec nevypadají tak špatně. Horké chvilky asi zažijí návrháři knihoven, které by měly zůstat zpětně kompatibilní a zároveň closures rozumným způsobem podporovat. Prozatím tedy berme výraz prvotřídní Java s jistou rezervou
Omlouvám se všem anglofilům, které pobouřil překlad výrazu first-class function jako prvotřídní funkce. Přeložit closure jako uzávěr jsem si už nedovolil, i když logiku by to mělo jak jazykovou, tak faktickou. Moje skloňování anglických jmen asi taky není úplně nejlepší…
Tiskni Sdílej:
new
(jedinou výjimkou jsou snad jenom řetězce). Potom se nemůžeš divit, že se představy, tebe jako Smalltalkera a Herona jako Javisty, o tom co je a není objektové, tak zásadně odlišují
Taky máme zcela jiné představy o eleganci (jak už jsem dávno zjistil ),
Pravda pravda. Je teda fakt, že syntaxně chudé jazyky jako např. Scheme poněkud na eleganci taky ztrácí . Mě nejde ani tak o stručnost zápisu (vždyť od toho je tu IDE), jako spíš o přehlednost (opět se neshodneme ). Nevím. Píšu trochu jinak, rád mám ve věcech jasno a podobně jako nyní v Javě jsem psal už i v C++ (přesná, dopředu promyšlená hierarchie objektů a jejich důsledné dodržování vs. spoluprogramátoři, kteří mi přenesli C kód, kde využili jeden objekt a říkali tomu program v C++ -- dle mého názoru bastl plný odkazů, pointrů, několika způsobů předávání parametů + nějaké konstrukce pro tvoření tříd apod.).
Pak to dopadá jako u Ady, kde má frontend překladače půl milionu řádků (GNAT) Je to jasné, jazyky pro kritické aplikace musí co nejvíc možných chyb odchytit už při překladu.
Na druhou stranu existují jazyky, které bych neváhal nazvat brutálně dynamicky typovanými (kde slovo brutálně znamená, že neexistuje principiální rozdíl mezi daty a algoritmy), jejichž počet syntaktických konstrukcí je mnohem menší, ale vyjadřovací schopnosti mnohem větší. (On je to sice stejně všechno Turingáč, ale víme, o čem mluvím.) Takže provádět některá zajímavá kouzla (teď mne napadá třeba runtime modifikace kódu) může být mnohem méně náchylné na chyby právě v nich. Je to samozřejmě proto, že tohle je zase jejich nedílná součást – i když žádnou syntaxi nemá.
Je zřejmé, že intention revealing závisí na rozmanitosti jazyka, a automatické odhalování chyb taktéž. Ale některé věci se prostě líp (a s méně chybami) píšou v jazycích, které něčím takovým nedisponují a disponovat nemohou. Ne že bych to byl někdy dělal, ale myslím, že to tak musí být
Předávání odkazu na funkci je přece jasným "obcházením" objektů. Pravda, neznám žádný návrh, jak by to mělo vypadat v Javě, ale pokud vezmu klasický odkaz na funkci, jak ji známe z C, je pak možné tohle:
Trida1 obj1 = new Trida1 (); Trida2 obj2 = new Trida2 (); obj1.metoda(obj2.jinaMetoda);
A včem je problém: metoda() z obj1 má přístup k jinaMetoda() z obj2 aniž by měla referenci na objekt obj2. Tedy volá metodu nějakého objektu, aniž by měla přístup k danému objektu. Tohle jsem myslel tím neobjektové a na tom trvám. Něco takového tuším umožňují i delegáty v C#.
Tak teď to už vůbec nechápu. Čím přesně se ukazatel na členskou funkci (a.k.a. delegát, a.a.k.a. vázaná metoda ) liší od rozhraní s jedinou metodou?
Pozor, ne rozhranní s jedinou metodou (v rozhranní nelze nic implementovat), ale třída. No a liší se právě tím, že místo odkazu na jednu jedinou metodu (tedy vlastně funkci) má k disposici celý objekt. Nemůžu si pomoct, ale přijde mi trochu nesystémové, když se s objektem manipuluje "mimo objekt". Prostě se mi příčí, že někdo bude "jen tak" volat metody, aniž by k tomu objektu měl přístup jako celku. Nevím jestli si rozumíme, už se do těch slovíček trochu zamotávám. Ale myslím, že ten ukázkový kód byl jasný.
Jinak máš pravdu v tom, že pokud se bavíme o třídě implementující pouze jednu metodu tak není větší rozdíl mezi vázanou metodou a touto třídou (nebo anonymní třídou).
Přesně tenhle názor jsem ještě nedávno zastával, ale ona ta parametrizace kódu funkcí je skutečně velmi užitečná. Po pár skriptících v Ruby jsem reference na metody (a hlavně na anonymní metody) definitivně rehabilitoval. Náhrada objektem anonymní třídy je sice možná, ale co mi vadí snad ještě víc než ta hromada zbytečného kódu pro vytvoření instance je nutnost deklarovat extra rozhraní, tohle by se mělo dát udělat na místě použití.
Jen taková poznámka na okraj: dávám přednost tomu slíznout smetanu (tj použít uzávěry v Ruby, při práci s kontejnery), než abych vědomě vymýšlel, kde parametrizovat javovskou metodu metodou.
Já jsem to teď zrovna potřeboval. Pochopitelně jsem mohl mít vedle sebe čtyři metody, každou na dvacet nebo třicet řádek, které by se lišily jedním voláním kdesi uprostřed, ale to jsem radši překousl to rozhraní a anonymní vnitřní třídy. A dal bych přednost tomu, kdybych i v Javě konečně mohl slíznout takovou smetanu. Vývoj Javy dost konzervativní na to, aby to dnešní Javisti, na které ze všech stran útočí RoRýsi, v klidu překousli.