{"id":17719,"date":"2024-02-22T12:08:53","date_gmt":"2024-02-22T11:08:53","guid":{"rendered":"https:\/\/vived.io\/?p=17719"},"modified":"2024-02-22T12:15:19","modified_gmt":"2024-02-22T11:15:19","slug":"loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/","title":{"rendered":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 &#8211; JVM Weekly vol. 164"},"content":{"rendered":"\n<h2 id=\"1-co-alan-bateman-opowiedzial-o-przyszlosci-wirtualnych-watkow\" data-num=1>1. Co Alan Bateman opowiedzia\u0142 o przysz\u0142o\u015bci Wirtualnych W\u0105tk\u00f3w?<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17720\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>Je\u015bli my\u015blicie, \u017ce wraz z JDK 21 zako\u0144czy\u0142a si\u0119 historia dynamicznego rozwoju Wirtualnych W\u0105tk\u00f3w, to mam dla Was troch\u0119 niespodzianek. Podczas konferencji FOSDEM Alan Bateman, jeden z architekt\u00f3w JDK, <a href=\"https:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c\">przedstawi\u0142 bowiem post\u0119py w Projekt Loom<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Java&#039;s Virtual Threads - Next Steps\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/KBW4LbCoo6c?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p>Zamiast jednak skupia\u0107 si\u0119 nad bie\u017c\u0105cym stanem, w swoim talku wyszed\u0142 on kilka krok\u00f3w do przodu, prezentuj\u0105c stoj\u0105ce przed projektem wyzwania. G\u0142\u00f3wnym problemem zwi\u0105zanym z obecn\u0105 iteracj\u0105 Projektu Loom, kt\u00f3ry Bateman podkre\u015bli\u0142, by\u0142o zagadnienie przypinania (pinning) w\u0105tk\u00f3w.<\/p>\n\n\n\n<p>Wraz ze stabilizacj\u0105\u00a0w\u0105tk\u00f3w wirtualnych w JDK 21, spo\u0142eczno\u015b\u0107 generalnie z entuzjazmem przyj\u0119\u0142a t\u0119 nowo\u015b\u0107. Konceptualnie ci\u0119\u017cko znale\u017a\u0107 przeciwnik\u00f3w obecnego designu, a wi\u0119kszo\u015b\u0107 sceptyk\u00f3w skupia si\u0119 na problemie &#8222;przypinania&#8221;, zwi\u0105zanym z metodami synchronizowanymi, sekcjami JNI lub instrukcjami <code>Object.wait<\/code>. Przypinanie wyst\u0119puje, gdy wirtualny w\u0105tek, trzymaj\u0105c monitor\/&#8221;lock&#8221;, pr\u00f3buje zwolni\u0107 miejsce innemu wirualnemu w\u0105tkowi, ale nie jest w stanie tego zrobi\u0107. Dzieje si\u0119 tak, poniewa\u017c implementacja monitora w JVM wi\u0105\u017ce &#8222;carrier thread&#8221; (jak Alan opisa\u0142 to na swojej prezentacji &#8211; platformowego giganta nosz\u0105cego wirtualnych braci na plecach) w taki spos\u00f3b, \u017ce nie mo\u017ce on uwolni\u0107 monitora i kontynuowa\u0107 innych zada\u0144. Problem ten, szczeg\u00f3lnie widoczny, gdy w\u0105tek wirtualny albo parkuje podczas metody synchronizowanej w celu wykonania operacji takich jak I\/O socket, lub blokuje si\u0119 pr\u00f3buj\u0105c wej\u015b\u0107 do metody synchronizowanej. Potencjalnie powoduje to degradacj\u0119 wydajno\u015bci, problemy ze skalowalno\u015bci\u0105, zakleszczenie, zniszczenie i g\u0142\u00f3d.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"483\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-10.png\" alt=\"\" class=\"wp-image-17722\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-10.png 700w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-10-300x207.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure><\/div>\n\n\n<p>Ca\u0142o\u015b\u0107 jest problemem trudnym do rozwi\u0105zania, poniewa\u017c wi\u0119kszo\u015b\u0107 wyzwa\u0144 stanowi\u0105 przestarza\u0142e z dzisiejszej perspektywy mechanizmy lockowania, istniej\u0105ce w maszynie wirtualnej od lat. \u017beby obs\u0142u\u017cy\u0107 niekt\u00f3re warunki brzegowe Wirtualnych W\u0105tk\u00f3w, niezb\u0119dna okaza\u0142a si\u0119 modernizacja ca\u0142ego mechanizmu lokowania w Javie, co jest procesem \u017cmudnym i b\u0119dzie trwa\u0142o zapewne nast\u0119pne par\u0119 lat, patrz\u0105c na do\u015bwiadczenia z innych tego typu inicjatyw. W mi\u0119dzyczasie Patricio Chilano Mateo z zespo\u0142u Hotspot zaimplementowa\u0142 plan B. Jest to realizowane poprzez &#8222;podmian\u0119&#8221; identyfikatora w\u0142a\u015bciciela wirtualnego w\u0105tku na klasyczny w\u0105tku Java (pi\u0119kny haczur) w locku, co samo w sobie wprowadza narzut (trzeba si\u0119 do odpowiednich struktur dokopa\u0107 i rzeczon\u0105 warto\u015b\u0107 podmieni\u0107), ale na ten moment wydaje si\u0119 do\u015b\u0107 skutecznie rozwi\u0105zywa\u0107 problem pinningu (przynajmniej w niekt\u00f3rych miejscach). Konwersacje na ten temat mo\u017cecie znale\u017a\u0107 w dw\u00f3ch w\u0105tkach (<a href=\"https:\/\/mail.openjdk.org\/pipermail\/loom-dev\/2024-February\/006433.html\">1<\/a>, 2) listy mailingowej JDK.<\/p>\n\n\n\n<p>Bateman przedstawi\u0142 r\u00f3wnie\u017c nowe podej\u015bcie do zarz\u0105dzania zapytaniami IO. Do tej pory ten implementowany by\u0142 jako platform thread, kt\u00f3ry dopiero przekazywa\u0142 prac\u0119 do wirtualnych w\u0105tk\u00f3w, co w zasadzie ka\u017cdorazowo ko\u0144czy\u0142o si\u0119 context switchem. Nowe rozwi\u0105zanie zak\u0142ada, \u017ce sam Poller ma by\u0107 wirtualnym w\u0105tkiem, dzi\u0119ki czemu (w wi\u0119kszo\u015bci przypadk\u00f3w) zapytania b\u0119d\u0105 mog\u0142y by\u0107 wykonywane w tym samym w\u0105tku, kt\u00f3ry je przyj\u0105\u0142. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"451\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-1024x451.png\" alt=\"\" class=\"wp-image-17741\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-1024x451.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-300x132.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-768x338.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-1536x677.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16.png 1580w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Bateman wspomina, \u017ce ca\u0142o\u015b\u0107 konceptu inspirowana by\u0142a paperem <a href=\"https:\/\/dl.acm.org\/doi\/10.1145\/3393691.3394226\">User-level Threading: Have Your Cake and Eat It Too<\/a>, w kt\u00f3rym naukowcy z Uniwerytetu w Waterloo opisali r\u00f3\u017cne podej\u015bcia do strategii I\/O. Ten nie jest dost\u0119pny publicznie, ale przybli\u017cenie stanowi prezentacja wideo tw\u00f3rc\u00f3w, prawdopodobnie wystarczaj\u0105ce dla 99% ludzi, kt\u00f3rzy akurat nie implementuj\u0105 poolingu w j\u0119zyku w swoim aktualnym sprincie ;).<\/p>\n\n\n\n<p>Poza tymi konkretnymi ulepszeniami, Bateman poruszy\u0142 tak\u017ce szersze zmiany w krajobrazie wsp\u00f3\u0142bie\u017cno\u015bci, takie jak usprawnienia w poolu Fork-join maj\u0105ce na celu lepsze wykorzystanie zasob\u00f3w, zw\u0142aszcza w systemach o mniejszej liczbie rdzeni.<\/p>\n\n\n\n<p>A jak ju\u017c jeste\u015bmy przy wideo, to drugim wartym zapoznania si\u0119 jest z pewno\u015bci\u0105 <a href=\"https:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM\">Java Language Update &#8211; Early 2024 Edition<\/a>. W nim to Viktor Klang, kolejny Software Architect z Oracle pracuj\u0105cy w Java Platform Group, snuje opowie\u015b\u0107 o tym, jak pojedyncze, oderwane od siebie w teorii zmiany w Javie maj\u0105 sens jako ca\u0142o\u015b\u0107 i kieruj\u0105 j\u0119zyk w nowym, bardzo sp\u00f3jnym kierunku. Uwa\u017cam, \u017ce jest to seans obowi\u0105zkowy dla ka\u017cdego, kto chce lepiej zrozumie\u0107 jaki obrazek wy\u0142ania si\u0119 z pojedynczych puzzli.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Java Language Update - Early 2024 Edition\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/U6JQ1CqjgLM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<h2 id=\"2-nowe-jep-y-elastyczne-konstruktory-i-pochodne-rekordy\" data-num=2>2. Nowe JEP-y: Elastyczne konstruktory i pochodne rekordy<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-1024x585.png\" alt=\"\" class=\"wp-image-17724\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8325803\">JEP Draft: Flexible Constructor Bodies (Second Preview)<\/a><\/h3>\n\n\n\n<p>Ten JEP autorstwa Archie Cobbsa i Gavina Biermana to ewolucja <a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(&#8230;)<\/a>, kt\u00f3ry dopiero oka\u017ce si\u0119 w JDK 22, a ju\u017c zd\u0105\u017cy\u0142 zmieni\u0107 nazw\u0119 i przechodzi\u0107 b\u0119dzie pewne zmian&#8230; i to takie zaskakuj\u0105co ciekawe. Na pierwszy rzut oka nie m\u00f3wimy tutaj o jakich\u015b Proponuje dalsze uelastycznienie sk\u0142adni konstruktor\u00f3w Javy &#8211; o ile pozwala ona bowiem na umieszczanie w konstruktorach instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, o ile nie b\u0119d\u0105 one odczytywane przed wyra\u017anym wywo\u0142aniem konstruktora. Ciekawa jest motywacja stoj\u0105ca za t\u0105 zmian\u0105 &#8211; wed\u0142ug tre\u015bci JEPa b\u0119dzie to wymagane przez Value Classes, kt\u00f3re zostan\u0105 zaimplementowane jako cz\u0119\u015b\u0107 Project Valhalla. Na razie nie wiemy za wiele wi\u0119cej, ale po raz kolejny przegl\u0105daj\u0105c aktualizacje JEP-\u00f3w widzimy sugesti\u0119, \u017ce prawdopodobnie ju\u017c ko\u0144c\u00f3wk\u0105 roku b\u0119dziemy mieli okazj\u0119 zapozna\u0107 si\u0119 z jakimi\u015b pierwszymi publicznie dost\u0119pnymi w ramach JDK wersjami projektu.<\/p>\n\n\n\n<p>Poza powy\u017cszym, JEP wspomina r\u00f3wnie\u017c nieokre\u015blone jeszcze zmiany w obs\u0142udze klas lokalnych, ale na detale takowych pewnie musimy zaczeka\u0107 do kolejnej iteracji. Opr\u00f3cz tego wydaje si\u0119, \u017ce pozosta\u0142y design projektu pozostaje bez zmian.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a><\/h3>\n\n\n\n<p>Drugi z dzisiejszych JEP-\u00f3w dotyczy d\u0142ugo oczekiwanego usprawnienia tego, jak dzia\u0142aj\u0105 Javowe rekordy i zbli\u017cenia ich do odpowiednik\u00f3w w innych nowoczesnych j\u0119zykach programowania.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"284\" height=\"204\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/pNVuzZM.gif\" alt=\"\" class=\"wp-image-17728\" style=\"width:708px;height:auto\"\/><figcaption class=\"wp-element-caption\">Oczywi\u015bcie, wersja Javowa, jako ta <em>superior<\/em> jest na powy\u017cszym gifie kotem.<\/figcaption><\/figure><\/div>\n\n\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a> wprowadza bowiem koncepcj\u0119 instancji pochodnych, kt\u00f3re mog\u0105 by\u0107 tworzone na bazie istniej\u0105cych instancji rekord\u00f3w. Rekordy bowiem, b\u0119d\u0105c niezmiennymi z za\u0142o\u017cenia, cz\u0119sto wymagaj\u0105 tworzenia nowych instancji, aby odzwierciedli\u0107 zmiany w danych, co prowadzi do popularnego wzorca tak zwanych <strong>wither method<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) {\n    Point withX(int newX) { \n        return new Point(newX, y, z); \n    }\n    Point withY(int newY) { \n        return new Point(x, newY, z); \n    }\n    Point withZ(int newZ) { \n        return new Point(x, y, newZ); \n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Nowy JEP proponuje sk\u0142adni\u0119, kt\u00f3ra pozwala programistom na zwi\u0119z\u0142e wyra\u017canie tych modyfikacji w desygnowanym temu bloku kodu, zwi\u0119kszaj\u0105c wyrazisto\u015b\u0107 j\u0119zyka i redukuj\u0105c powtarzalny kod zwi\u0105zany z obs\u0142ug\u0105 immutability.<\/p>\n\n\n\n<p>Przyk\u0142ad warty jest tysi\u0105ca s\u0142\u00f3w, wi\u0119c tak prezentowa\u0107 si\u0119 b\u0119dzie u\u017cycie:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) { }\nvar nextLoc = new Point(3,3,3)\n\nPoint finalLoc = nextLoc with { x = 0; };\n\n\/\/\/ finalLoc: Point(0,3,3)\n<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie, nigdy nie jest prosto, i tak samo w tym przypadku tworzenie tego typu pochodnych rekord\u00f3w b\u0119dzie obwarowane pewnymi regu\u0142ami i warunkami brzegowymi, po te jednak odsy\u0142am do <a href=\"https:\/\/openjdk.org\/jeps\/8321133\">oryginalnego JEP-a<\/a>.<\/p>\n\n\n\n<p>Jako, \u017ce ju\u017c wywo\u0142a\u0142em Kotlina, to warto por\u00f3wna\u0107 sobie to podej\u015bcie do jego rozwi\u0105zania podobnego problemu. Kotlin oferuje bowiem tak zwane data classes, kt\u00f3re podobnie jak rekordy Javy, s\u0105 przeznaczone do przechowywania danych. Maj\u0105 one wbudowan\u0105 metod\u0119 <code>copy<\/code>, kt\u00f3ra pozwala na \u0142atwe tworzenie zmodyfikowanych instancji przez podani. Tw\u00f3rcy <strong>Derived Records<\/strong> postawili jednak na wi\u0119ksz\u0105 elastyczno\u015b\u0107 transformat, kt\u00f3r\u0105 zapewnia zaproponowany przez nich blok <code>with<\/code> , jak na przyk\u0142ad mo\u017cliwo\u015b\u0107 operowania na zagnie\u017cd\u017conych rekordach (przyk\u0142ad z JEPa):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Marker scaled = m with { \n    loc = loc with { \n        x *= 2; \n        y *= 2; \n        z *= 2; \n    }\n};<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Opr\u00f3cz powy\u017cszych, opisywane niedawno <a href=\"https:\/\/openjdk.org\/jeps\/465\">JEP 465: String Templates<\/a> oraz <a href=\"https:\/\/openjdk.org\/jeps\/466\">JEP 466: Class-File API (Second Preview)<\/a> otrzyma\u0142y status kandydata.<\/p>\n\n\n\n<h2 id=\"3-release-radar\" data-num=3>3. Release Radar<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"585\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-1024x585.png\" alt=\"\" class=\"wp-image-17730\" style=\"width:991px;height:auto\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Tak wiem, nie tak si\u0119 pracuje na klawiaturze. I tak mi si\u0119 podoba\u0142 ten obrazek \ud83d\ude00<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Docker Desktop 4.27<\/h3>\n\n\n\n<p>Zaskoczeni widz\u0105c tu Docker Desktop? A nie powinni\u015bcie.<\/p>\n\n\n\n<p>Docker Desktop 4.27 wprowadza bowiem natywne wsparcia dla frameworka Testcontainers, kt\u00f3rego tw\u00f3rc\u00f3w, AtomicJar, Docker niedawno kupi\u0142. Opiera si\u0119 ono o Enhanced Container Isolation, komercyjn\u0105 funkcj\u0119 Docker Desktop zwi\u0119kszaj\u0105c\u0105 bezpiecze\u0144stwo kontener\u00f3w poprzez dodatkowe mechanizmy izolacji. Chodzi tu g\u0142\u00f3wnie o jeszcze mocniejsze ograniczenie sposob\u00f3w, w jakim z\u0142o\u015bliwy kod uruchomiony w jednym kontenerze m\u00f3g\u0142by wp\u0142yn\u0105\u0107 na hosta systemowego lub inne kontenery. Ca\u0142o\u015b\u0107 zosta\u0142a do\u015b\u0107 przyst\u0119pnie (pami\u0119tajcie jednak &#8211; dalej m\u00f3wimy o warstwie OS i cho\u0107 lekka znajomo\u015b\u0107 Unixa si\u0119 przyda) opisana w <a href=\"https:\/\/docs.docker.com\/desktop\/hardened-desktop\/enhanced-container-isolation\/how-eci-works\/\">oficjalnej dokumentacji Dockera<\/a>.<\/p>\n\n\n\n<p>Inn\u0105 godn\u0105 uwagi aktualizacj\u0105 dla programist\u00f3w Java w Docker Desktop 4.27 jest stabilizacja nowego polecenia <code>docker init<\/code>. To narz\u0119dzie upraszcza pocz\u0105tkow\u0105 konfiguracj\u0119 projekt\u00f3w Dockerowych, automatycznie generuj\u0105c Dockerfile, pliki Compose i <code>.dockerignore<\/code>, dostosowane do potrzeb projektu. Dopasowuje go do potrzeb projektu, i cho\u0107 w Javie opcje s\u0105 na razie do\u015b\u0107 ograniczone (przyk\u0142adowo, obecna wersja <code>Dockerfile<\/code> u\u017cywa Mavena i Eclipse Temurina i nie da si\u0119 tego skonfigurowa\u0107), to i tak generowane plik robi\u0105 wra\u017cenie, zw\u0142aszcza masa komentarzy i link\u00f3w w <code>Dockerfile<\/code> czy wielko\u015b\u0107 <code>.dockerignore<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"623\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-1024x623.gif\" alt=\"\" class=\"wp-image-17732\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-1024x623.gif 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-300x182.gif 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-768x467.gif 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Warto wi\u0119c u\u017cy\u0107 docker init cho\u0107 raz &#8211; cho\u0107by w celach edukacyjnych.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Micronaut 4.3<\/h3>\n\n\n\n<p>Kluczowe usprawnienia <a href=\"https:\/\/micronaut.io\/2024\/02\/06\/micronaut-framework-4-3-0-released\/\">Micronaut Framework 4.3<\/a> to ulepszona integracj\u0119 z Kotlin Symbol Processing (KSP), zawieraj\u0105ca poprawki z najnowszej wersji Kotlin 1.9.20. Wprowadzono te\u017c&nbsp;nowe modu\u0142y, takie jak Micronaut Chatbots (no bo przecie\u017c jak by inaczej) i Micronaut EclipseStore, zapewniaj\u0105cy integracje z nast\u0119pc\u0105 projektu MicroStream. Ponadto, wydanie usprawnia warunkowe cachowanie i umo\u017cliwia konfiguracje wielodziedziczenia przy u\u017cyciu j\u0119zyka wyra\u017ce\u0144 frameworka.<\/p>\n\n\n\n<p>Oczywi\u015bcie to nie koniec, bo jak to ka\u017cde nowe wydanie Micronauta, tak i 4.3 przynosi aktualizacje w ca\u0142ym swoim ekosystemie, w tym modu\u0142y integracji z chmur\u0105 dla AWS, GCP, Azure i Oracle Cloud, oferuj\u0105c ulepszenia i nowe funkcjonalno\u015bci, takie jak subskrypcje Push Pub\/Sub dla GCP. Zaktualizowano u\u017cywan\u0105 wersj\u0119 GraalVM Native Image Build, poprawiono wsparcie dla Docker i Java 21, a Bill of Materials (BOM) Micronauta umo\u017cliwia teraz \u0142atwiejsze zarz\u0105dzanie zale\u017cno\u015bciami poprzez w\u0142\u0105czenie wersji z r\u00f3\u017cnych modu\u0142\u00f3w. Aktualizacje dosta\u0142y narz\u0119dzi migracji bazy danych wraz z poprawkami r\u00f3\u017cnych modu\u0142\u00f3w, takich jak Micronaut Data, gRPC, Kafka.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14.png\" alt=\"\" class=\"wp-image-17734\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14.png 888w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14-300x169.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14-768x432.png 768w\" sizes=\"auto, (max-width: 888px) 100vw, 888px\" \/><figcaption class=\"wp-element-caption\">Kiedy\u015b zrobi\u0119 dowcip i przekleje akapit o upgradzie zale\u017cno\u015bci z poprzedniej wersji. Mam wra\u017cenie, \u017ce nawet tw\u00f3rcy frameworki by si\u0119 nie skapn\u0119li.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Amper 0.2.0<\/h3>\n\n\n\n<p>To jeszcze na koniec update do projektu Amper, kt\u00f3ry (dla przypomnienia, wi\u0119cej o projekcie <a href=\"https:\/\/vived.substack.com\/p\/amper-by-jetbrains-defining-gradle\">znajdziecie tutaj<\/a>) jest eksperymentalnym narz\u0119dziem do deklaratywnej konfiguracji build\u00f3w projekt\u00f3w stworzonym przez JetBrains. Otrzyma\u0142 on w\u0142a\u015bnie aktualizacj\u0119 <a href=\"https:\/\/blog.jetbrains.com\/amper\/2024\/02\/amper-update-february-2024\/\">do wersji 0.2.0<\/a>. Pewnie bym o niej nie wspomina\u0142 &#8211; jako \u017ce to raczej ma\u0142y upgrade &#8211; ale jest okazj\u0105 aby opowiedzie\u0107 o troch\u0119 mniej znanej funkcjonalno\u015bci Gradle.<\/p>\n\n\n\n<p>Wprowadza ona wsparcie dla Gradle Version Catalogs &#8211; funkcjonalno\u015bci wprowadzona w Gradle 7.0, kt\u00f3ra pozwala na centralne zarz\u0105dzanie wersjami bibliotek oraz wtyczek, co u\u0142atwia zarz\u0105dzanie zale\u017cno\u015bciami w wielomodu\u0142owych projektach. Dzi\u0119ki temu, zamiast powtarza\u0107 wersje bibliotek w r\u00f3\u017cnych modu\u0142ach, mo\u017cna je zdefiniowa\u0107 raz w katalogu wersji i odwo\u0142ywa\u0107 si\u0119 do nich za pomoc\u0105 alias\u00f3w. Ampera umo\u017cliwia teraz dost\u0119p do zale\u017cno\u015bci zadeklarowanych w tych katalogach, u\u017cywaj\u0105c sk\u0142adni <code>$libs.library.name<\/code>.<\/p>\n\n\n\n<p>IDE ze wsparciem Ampera (IntelliJ IDEA, Android Studio i JetBrains Fleet) dosta\u0142y te\u017c auto-podpowiadanie dla zale\u017cno\u015bci dzia\u0142aj\u0105ce na bazie <a href=\"https:\/\/package-search.jetbrains.com\/\">JetBrains Package Search<\/a>. Ponadto od wersji IntelliJ IDEA 2024.1, mo\u017cliwe jest tworzenie nowych projekt\u00f3w Kotlinowych opartych na Amperze bezpo\u015brednio z kreatora nowych projekt\u00f3w.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj znowu wracamy do temat\u00f3w zwi\u0105zanych ze zmianami, kt\u00f3re pojawi\u0105 si\u0119 w Javie jeszcze w tym roku.<\/p>\n","protected":false},"author":10,"featured_media":17737,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-17719","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"9","feature_image_blog":false,"weekly_summary":false,"push_notification_image":false,"feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj znowu wracamy do temat\u00f3w zwi\u0105zanych ze zmianami, kt\u00f3re pojawi\u0105 si\u0119 w Javie jeszcze w tym roku.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-22T11:08:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-22T11:15:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 &#8211; JVM Weekly vol. 164\",\"datePublished\":\"2024-02-22T11:08:53+00:00\",\"dateModified\":\"2024-02-22T11:15:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\"},\"wordCount\":1882,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\",\"url\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\",\"name\":\"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png\",\"datePublished\":\"2024-02-22T11:08:53+00:00\",\"dateModified\":\"2024-02-22T11:15:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 &#8211; JVM Weekly vol. 164\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/","og_locale":"pl_PL","og_type":"article","og_title":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived","og_description":"Dzisiaj znowu wracamy do temat\u00f3w zwi\u0105zanych ze zmianami, kt\u00f3re pojawi\u0105 si\u0119 w Javie jeszcze w tym roku.","og_url":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/","og_site_name":"Vived","article_published_time":"2024-02-22T11:08:53+00:00","article_modified_time":"2024-02-22T11:15:19+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5-1024x576.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 &#8211; JVM Weekly vol. 164","datePublished":"2024-02-22T11:08:53+00:00","dateModified":"2024-02-22T11:15:19+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/"},"wordCount":1882,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/","url":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/","name":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 - JVM Weekly vol. 164 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png","datePublished":"2024-02-22T11:08:53+00:00","dateModified":"2024-02-22T11:15:19+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/Group-780-5.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/loom-strikes-again-jakie-dalsze-usprawnienia-wirtualnych-watkow-zobaczymy-w-2024-jvm-weekly-vol-164\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Loom Strikes Again: Jakie dalsze usprawnienia Wirtualnych W\u0105tk\u00f3w zobaczymy w 2024 &#8211; JVM Weekly vol. 164"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">1. Co Alan Bateman opowiedzia\u0142 o przysz\u0142o\u015bci Wirtualnych W\u0105tk\u00f3w?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Co Alan Bateman opowiedzia\u0142 o przysz\u0142o\u015bci Wirtualnych W\u0105tk\u00f3w?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17720,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17720\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17720\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli my\u015blicie, \u017ce wraz z JDK 21 zako\u0144czy\u0142a si\u0119 historia dynamicznego rozwoju Wirtualnych W\u0105tk\u00f3w, to mam dla Was troch\u0119 niespodzianek. Podczas konferencji FOSDEM Alan Bateman, jeden z architekt\u00f3w JDK, <a href=\"https:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c\">przedstawi\u0142 bowiem post\u0119py w Projekt Loom<\/a>.<\/p>\n","innerContent":["\n<p>Je\u015bli my\u015blicie, \u017ce wraz z JDK 21 zako\u0144czy\u0142a si\u0119 historia dynamicznego rozwoju Wirtualnych W\u0105tk\u00f3w, to mam dla Was troch\u0119 niespodzianek. Podczas konferencji FOSDEM Alan Bateman, jeden z architekt\u00f3w JDK, <a href=\"https:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c\">przedstawi\u0142 bowiem post\u0119py w Projekt Loom<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=KBW4LbCoo6c\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zamiast jednak skupia\u0107 si\u0119 nad bie\u017c\u0105cym stanem, w swoim talku wyszed\u0142 on kilka krok\u00f3w do przodu, prezentuj\u0105c stoj\u0105ce przed projektem wyzwania. G\u0142\u00f3wnym problemem zwi\u0105zanym z obecn\u0105 iteracj\u0105 Projektu Loom, kt\u00f3ry Bateman podkre\u015bli\u0142, by\u0142o zagadnienie przypinania (pinning) w\u0105tk\u00f3w.<\/p>\n","innerContent":["\n<p>Zamiast jednak skupia\u0107 si\u0119 nad bie\u017c\u0105cym stanem, w swoim talku wyszed\u0142 on kilka krok\u00f3w do przodu, prezentuj\u0105c stoj\u0105ce przed projektem wyzwania. G\u0142\u00f3wnym problemem zwi\u0105zanym z obecn\u0105 iteracj\u0105 Projektu Loom, kt\u00f3ry Bateman podkre\u015bli\u0142, by\u0142o zagadnienie przypinania (pinning) w\u0105tk\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wraz ze stabilizacj\u0105\u00a0w\u0105tk\u00f3w wirtualnych w JDK 21, spo\u0142eczno\u015b\u0107 generalnie z entuzjazmem przyj\u0119\u0142a t\u0119 nowo\u015b\u0107. Konceptualnie ci\u0119\u017cko znale\u017a\u0107 przeciwnik\u00f3w obecnego designu, a wi\u0119kszo\u015b\u0107 sceptyk\u00f3w skupia si\u0119 na problemie \"przypinania\", zwi\u0105zanym z metodami synchronizowanymi, sekcjami JNI lub instrukcjami <code>Object.wait<\/code>. Przypinanie wyst\u0119puje, gdy wirtualny w\u0105tek, trzymaj\u0105c monitor\/\"lock\", pr\u00f3buje zwolni\u0107 miejsce innemu wirualnemu w\u0105tkowi, ale nie jest w stanie tego zrobi\u0107. Dzieje si\u0119 tak, poniewa\u017c implementacja monitora w JVM wi\u0105\u017ce \"carrier thread\" (jak Alan opisa\u0142 to na swojej prezentacji - platformowego giganta nosz\u0105cego wirtualnych braci na plecach) w taki spos\u00f3b, \u017ce nie mo\u017ce on uwolni\u0107 monitora i kontynuowa\u0107 innych zada\u0144. Problem ten, szczeg\u00f3lnie widoczny, gdy w\u0105tek wirtualny albo parkuje podczas metody synchronizowanej w celu wykonania operacji takich jak I\/O socket, lub blokuje si\u0119 pr\u00f3buj\u0105c wej\u015b\u0107 do metody synchronizowanej. Potencjalnie powoduje to degradacj\u0119 wydajno\u015bci, problemy ze skalowalno\u015bci\u0105, zakleszczenie, zniszczenie i g\u0142\u00f3d.<\/p>\n","innerContent":["\n<p>Wraz ze stabilizacj\u0105\u00a0w\u0105tk\u00f3w wirtualnych w JDK 21, spo\u0142eczno\u015b\u0107 generalnie z entuzjazmem przyj\u0119\u0142a t\u0119 nowo\u015b\u0107. Konceptualnie ci\u0119\u017cko znale\u017a\u0107 przeciwnik\u00f3w obecnego designu, a wi\u0119kszo\u015b\u0107 sceptyk\u00f3w skupia si\u0119 na problemie \"przypinania\", zwi\u0105zanym z metodami synchronizowanymi, sekcjami JNI lub instrukcjami <code>Object.wait<\/code>. Przypinanie wyst\u0119puje, gdy wirtualny w\u0105tek, trzymaj\u0105c monitor\/\"lock\", pr\u00f3buje zwolni\u0107 miejsce innemu wirualnemu w\u0105tkowi, ale nie jest w stanie tego zrobi\u0107. Dzieje si\u0119 tak, poniewa\u017c implementacja monitora w JVM wi\u0105\u017ce \"carrier thread\" (jak Alan opisa\u0142 to na swojej prezentacji - platformowego giganta nosz\u0105cego wirtualnych braci na plecach) w taki spos\u00f3b, \u017ce nie mo\u017ce on uwolni\u0107 monitora i kontynuowa\u0107 innych zada\u0144. Problem ten, szczeg\u00f3lnie widoczny, gdy w\u0105tek wirtualny albo parkuje podczas metody synchronizowanej w celu wykonania operacji takich jak I\/O socket, lub blokuje si\u0119 pr\u00f3buj\u0105c wej\u015b\u0107 do metody synchronizowanej. Potencjalnie powoduje to degradacj\u0119 wydajno\u015bci, problemy ze skalowalno\u015bci\u0105, zakleszczenie, zniszczenie i g\u0142\u00f3d.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17722,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-10.png\" alt=\"\" class=\"wp-image-17722\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-10.png\" alt=\"\" class=\"wp-image-17722\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ca\u0142o\u015b\u0107 jest problemem trudnym do rozwi\u0105zania, poniewa\u017c wi\u0119kszo\u015b\u0107 wyzwa\u0144 stanowi\u0105 przestarza\u0142e z dzisiejszej perspektywy mechanizmy lockowania, istniej\u0105ce w maszynie wirtualnej od lat. \u017beby obs\u0142u\u017cy\u0107 niekt\u00f3re warunki brzegowe Wirtualnych W\u0105tk\u00f3w, niezb\u0119dna okaza\u0142a si\u0119 modernizacja ca\u0142ego mechanizmu lokowania w Javie, co jest procesem \u017cmudnym i b\u0119dzie trwa\u0142o zapewne nast\u0119pne par\u0119 lat, patrz\u0105c na do\u015bwiadczenia z innych tego typu inicjatyw. W mi\u0119dzyczasie Patricio Chilano Mateo z zespo\u0142u Hotspot zaimplementowa\u0142 plan B. Jest to realizowane poprzez \"podmian\u0119\" identyfikatora w\u0142a\u015bciciela wirtualnego w\u0105tku na klasyczny w\u0105tku Java (pi\u0119kny haczur) w locku, co samo w sobie wprowadza narzut (trzeba si\u0119 do odpowiednich struktur dokopa\u0107 i rzeczon\u0105 warto\u015b\u0107 podmieni\u0107), ale na ten moment wydaje si\u0119 do\u015b\u0107 skutecznie rozwi\u0105zywa\u0107 problem pinningu (przynajmniej w niekt\u00f3rych miejscach). Konwersacje na ten temat mo\u017cecie znale\u017a\u0107 w dw\u00f3ch w\u0105tkach (<a href=\"https:\/\/mail.openjdk.org\/pipermail\/loom-dev\/2024-February\/006433.html\">1<\/a>, 2) listy mailingowej JDK.<\/p>\n","innerContent":["\n<p>Ca\u0142o\u015b\u0107 jest problemem trudnym do rozwi\u0105zania, poniewa\u017c wi\u0119kszo\u015b\u0107 wyzwa\u0144 stanowi\u0105 przestarza\u0142e z dzisiejszej perspektywy mechanizmy lockowania, istniej\u0105ce w maszynie wirtualnej od lat. \u017beby obs\u0142u\u017cy\u0107 niekt\u00f3re warunki brzegowe Wirtualnych W\u0105tk\u00f3w, niezb\u0119dna okaza\u0142a si\u0119 modernizacja ca\u0142ego mechanizmu lokowania w Javie, co jest procesem \u017cmudnym i b\u0119dzie trwa\u0142o zapewne nast\u0119pne par\u0119 lat, patrz\u0105c na do\u015bwiadczenia z innych tego typu inicjatyw. W mi\u0119dzyczasie Patricio Chilano Mateo z zespo\u0142u Hotspot zaimplementowa\u0142 plan B. Jest to realizowane poprzez \"podmian\u0119\" identyfikatora w\u0142a\u015bciciela wirtualnego w\u0105tku na klasyczny w\u0105tku Java (pi\u0119kny haczur) w locku, co samo w sobie wprowadza narzut (trzeba si\u0119 do odpowiednich struktur dokopa\u0107 i rzeczon\u0105 warto\u015b\u0107 podmieni\u0107), ale na ten moment wydaje si\u0119 do\u015b\u0107 skutecznie rozwi\u0105zywa\u0107 problem pinningu (przynajmniej w niekt\u00f3rych miejscach). Konwersacje na ten temat mo\u017cecie znale\u017a\u0107 w dw\u00f3ch w\u0105tkach (<a href=\"https:\/\/mail.openjdk.org\/pipermail\/loom-dev\/2024-February\/006433.html\">1<\/a>, 2) listy mailingowej JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Bateman przedstawi\u0142 r\u00f3wnie\u017c nowe podej\u015bcie do zarz\u0105dzania zapytaniami IO. Do tej pory ten implementowany by\u0142 jako platform thread, kt\u00f3ry dopiero przekazywa\u0142 prac\u0119 do wirtualnych w\u0105tk\u00f3w, co w zasadzie ka\u017cdorazowo ko\u0144czy\u0142o si\u0119 context switchem. Nowe rozwi\u0105zanie zak\u0142ada, \u017ce sam Poller ma by\u0107 wirtualnym w\u0105tkiem, dzi\u0119ki czemu (w wi\u0119kszo\u015bci przypadk\u00f3w) zapytania b\u0119d\u0105 mog\u0142y by\u0107 wykonywane w tym samym w\u0105tku, kt\u00f3ry je przyj\u0105\u0142. <\/p>\n","innerContent":["\n<p>Bateman przedstawi\u0142 r\u00f3wnie\u017c nowe podej\u015bcie do zarz\u0105dzania zapytaniami IO. Do tej pory ten implementowany by\u0142 jako platform thread, kt\u00f3ry dopiero przekazywa\u0142 prac\u0119 do wirtualnych w\u0105tk\u00f3w, co w zasadzie ka\u017cdorazowo ko\u0144czy\u0142o si\u0119 context switchem. Nowe rozwi\u0105zanie zak\u0142ada, \u017ce sam Poller ma by\u0107 wirtualnym w\u0105tkiem, dzi\u0119ki czemu (w wi\u0119kszo\u015bci przypadk\u00f3w) zapytania b\u0119d\u0105 mog\u0142y by\u0107 wykonywane w tym samym w\u0105tku, kt\u00f3ry je przyj\u0105\u0142. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17741,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-1024x451.png\" alt=\"\" class=\"wp-image-17741\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-16-1024x451.png\" alt=\"\" class=\"wp-image-17741\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Bateman wspomina, \u017ce ca\u0142o\u015b\u0107 konceptu inspirowana by\u0142a paperem <a href=\"https:\/\/dl.acm.org\/doi\/10.1145\/3393691.3394226\">User-level Threading: Have Your Cake and Eat It Too<\/a>, w kt\u00f3rym naukowcy z Uniwerytetu w Waterloo opisali r\u00f3\u017cne podej\u015bcia do strategii I\/O. Ten nie jest dost\u0119pny publicznie, ale przybli\u017cenie stanowi prezentacja wideo tw\u00f3rc\u00f3w, prawdopodobnie wystarczaj\u0105ce dla 99% ludzi, kt\u00f3rzy akurat nie implementuj\u0105 poolingu w j\u0119zyku w swoim aktualnym sprincie ;).<\/p>\n","innerContent":["\n<p>Bateman wspomina, \u017ce ca\u0142o\u015b\u0107 konceptu inspirowana by\u0142a paperem <a href=\"https:\/\/dl.acm.org\/doi\/10.1145\/3393691.3394226\">User-level Threading: Have Your Cake and Eat It Too<\/a>, w kt\u00f3rym naukowcy z Uniwerytetu w Waterloo opisali r\u00f3\u017cne podej\u015bcia do strategii I\/O. Ten nie jest dost\u0119pny publicznie, ale przybli\u017cenie stanowi prezentacja wideo tw\u00f3rc\u00f3w, prawdopodobnie wystarczaj\u0105ce dla 99% ludzi, kt\u00f3rzy akurat nie implementuj\u0105 poolingu w j\u0119zyku w swoim aktualnym sprincie ;).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza tymi konkretnymi ulepszeniami, Bateman poruszy\u0142 tak\u017ce szersze zmiany w krajobrazie wsp\u00f3\u0142bie\u017cno\u015bci, takie jak usprawnienia w poolu Fork-join maj\u0105ce na celu lepsze wykorzystanie zasob\u00f3w, zw\u0142aszcza w systemach o mniejszej liczbie rdzeni.<\/p>\n","innerContent":["\n<p>Poza tymi konkretnymi ulepszeniami, Bateman poruszy\u0142 tak\u017ce szersze zmiany w krajobrazie wsp\u00f3\u0142bie\u017cno\u015bci, takie jak usprawnienia w poolu Fork-join maj\u0105ce na celu lepsze wykorzystanie zasob\u00f3w, zw\u0142aszcza w systemach o mniejszej liczbie rdzeni.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A jak ju\u017c jeste\u015bmy przy wideo, to drugim wartym zapoznania si\u0119 jest z pewno\u015bci\u0105 <a href=\"https:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM\">Java Language Update - Early 2024 Edition<\/a>. W nim to Viktor Klang, kolejny Software Architect z Oracle pracuj\u0105cy w Java Platform Group, snuje opowie\u015b\u0107 o tym, jak pojedyncze, oderwane od siebie w teorii zmiany w Javie maj\u0105 sens jako ca\u0142o\u015b\u0107 i kieruj\u0105 j\u0119zyk w nowym, bardzo sp\u00f3jnym kierunku. Uwa\u017cam, \u017ce jest to seans obowi\u0105zkowy dla ka\u017cdego, kto chce lepiej zrozumie\u0107 jaki obrazek wy\u0142ania si\u0119 z pojedynczych puzzli.<\/p>\n","innerContent":["\n<p>A jak ju\u017c jeste\u015bmy przy wideo, to drugim wartym zapoznania si\u0119 jest z pewno\u015bci\u0105 <a href=\"https:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM\">Java Language Update - Early 2024 Edition<\/a>. W nim to Viktor Klang, kolejny Software Architect z Oracle pracuj\u0105cy w Java Platform Group, snuje opowie\u015b\u0107 o tym, jak pojedyncze, oderwane od siebie w teorii zmiany w Javie maj\u0105 sens jako ca\u0142o\u015b\u0107 i kieruj\u0105 j\u0119zyk w nowym, bardzo sp\u00f3jnym kierunku. Uwa\u017cam, \u017ce jest to seans obowi\u0105zkowy dla ka\u017cdego, kto chce lepiej zrozumie\u0107 jaki obrazek wy\u0142ania si\u0119 z pojedynczych puzzli.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=U6JQ1CqjgLM\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Nowe JEP-y: Elastyczne konstruktory i pochodne rekordy<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Nowe JEP-y: Elastyczne konstruktory i pochodne rekordy<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17724,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-1024x585.png\" alt=\"\" class=\"wp-image-17724\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-11-1024x585.png\" alt=\"\" class=\"wp-image-17724\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8325803\">JEP Draft: Flexible Constructor Bodies (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8325803\">JEP Draft: Flexible Constructor Bodies (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ten JEP autorstwa Archie Cobbsa i Gavina Biermana to ewolucja <a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(...)<\/a>, kt\u00f3ry dopiero oka\u017ce si\u0119 w JDK 22, a ju\u017c zd\u0105\u017cy\u0142 zmieni\u0107 nazw\u0119 i przechodzi\u0107 b\u0119dzie pewne zmian... i to takie zaskakuj\u0105co ciekawe. Na pierwszy rzut oka nie m\u00f3wimy tutaj o jakich\u015b Proponuje dalsze uelastycznienie sk\u0142adni konstruktor\u00f3w Javy - o ile pozwala ona bowiem na umieszczanie w konstruktorach instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, o ile nie b\u0119d\u0105 one odczytywane przed wyra\u017anym wywo\u0142aniem konstruktora. Ciekawa jest motywacja stoj\u0105ca za t\u0105 zmian\u0105 - wed\u0142ug tre\u015bci JEPa b\u0119dzie to wymagane przez Value Classes, kt\u00f3re zostan\u0105 zaimplementowane jako cz\u0119\u015b\u0107 Project Valhalla. Na razie nie wiemy za wiele wi\u0119cej, ale po raz kolejny przegl\u0105daj\u0105c aktualizacje JEP-\u00f3w widzimy sugesti\u0119, \u017ce prawdopodobnie ju\u017c ko\u0144c\u00f3wk\u0105 roku b\u0119dziemy mieli okazj\u0119 zapozna\u0107 si\u0119 z jakimi\u015b pierwszymi publicznie dost\u0119pnymi w ramach JDK wersjami projektu.<\/p>\n","innerContent":["\n<p>Ten JEP autorstwa Archie Cobbsa i Gavina Biermana to ewolucja <a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(...)<\/a>, kt\u00f3ry dopiero oka\u017ce si\u0119 w JDK 22, a ju\u017c zd\u0105\u017cy\u0142 zmieni\u0107 nazw\u0119 i przechodzi\u0107 b\u0119dzie pewne zmian... i to takie zaskakuj\u0105co ciekawe. Na pierwszy rzut oka nie m\u00f3wimy tutaj o jakich\u015b Proponuje dalsze uelastycznienie sk\u0142adni konstruktor\u00f3w Javy - o ile pozwala ona bowiem na umieszczanie w konstruktorach instrukcji, kt\u00f3re nie odnosz\u0105 si\u0119 do tworzonej instancji, o ile nie b\u0119d\u0105 one odczytywane przed wyra\u017anym wywo\u0142aniem konstruktora. Ciekawa jest motywacja stoj\u0105ca za t\u0105 zmian\u0105 - wed\u0142ug tre\u015bci JEPa b\u0119dzie to wymagane przez Value Classes, kt\u00f3re zostan\u0105 zaimplementowane jako cz\u0119\u015b\u0107 Project Valhalla. Na razie nie wiemy za wiele wi\u0119cej, ale po raz kolejny przegl\u0105daj\u0105c aktualizacje JEP-\u00f3w widzimy sugesti\u0119, \u017ce prawdopodobnie ju\u017c ko\u0144c\u00f3wk\u0105 roku b\u0119dziemy mieli okazj\u0119 zapozna\u0107 si\u0119 z jakimi\u015b pierwszymi publicznie dost\u0119pnymi w ramach JDK wersjami projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza powy\u017cszym, JEP wspomina r\u00f3wnie\u017c nieokre\u015blone jeszcze zmiany w obs\u0142udze klas lokalnych, ale na detale takowych pewnie musimy zaczeka\u0107 do kolejnej iteracji. Opr\u00f3cz tego wydaje si\u0119, \u017ce pozosta\u0142y design projektu pozostaje bez zmian.<\/p>\n","innerContent":["\n<p>Poza powy\u017cszym, JEP wspomina r\u00f3wnie\u017c nieokre\u015blone jeszcze zmiany w obs\u0142udze klas lokalnych, ale na detale takowych pewnie musimy zaczeka\u0107 do kolejnej iteracji. Opr\u00f3cz tego wydaje si\u0119, \u017ce pozosta\u0142y design projektu pozostaje bez zmian.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Drugi z dzisiejszych JEP-\u00f3w dotyczy d\u0142ugo oczekiwanego usprawnienia tego, jak dzia\u0142aj\u0105 Javowe rekordy i zbli\u017cenia ich do odpowiednik\u00f3w w innych nowoczesnych j\u0119zykach programowania.<\/p>\n","innerContent":["\n<p>Drugi z dzisiejszych JEP-\u00f3w dotyczy d\u0142ugo oczekiwanego usprawnienia tego, jak dzia\u0142aj\u0105 Javowe rekordy i zbli\u017cenia ich do odpowiednik\u00f3w w innych nowoczesnych j\u0119zykach programowania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17728,"width":"708px","height":"auto","sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/pNVuzZM.gif\" alt=\"\" class=\"wp-image-17728\" style=\"width:708px;height:auto\"\/><figcaption class=\"wp-element-caption\">Oczywi\u015bcie, wersja Javowa, jako ta <em>superior<\/em> jest na powy\u017cszym gifie kotem.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/pNVuzZM.gif\" alt=\"\" class=\"wp-image-17728\" style=\"width:708px;height:auto\"\/><figcaption class=\"wp-element-caption\">Oczywi\u015bcie, wersja Javowa, jako ta <em>superior<\/em> jest na powy\u017cszym gifie kotem.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a> wprowadza bowiem koncepcj\u0119 instancji pochodnych, kt\u00f3re mog\u0105 by\u0107 tworzone na bazie istniej\u0105cych instancji rekord\u00f3w. Rekordy bowiem, b\u0119d\u0105c niezmiennymi z za\u0142o\u017cenia, cz\u0119sto wymagaj\u0105 tworzenia nowych instancji, aby odzwierciedli\u0107 zmiany w danych, co prowadzi do popularnego wzorca tak zwanych <strong>wither method<\/strong>:<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8321133\">JEP draft: Derived Record Creation (Preview)<\/a> wprowadza bowiem koncepcj\u0119 instancji pochodnych, kt\u00f3re mog\u0105 by\u0107 tworzone na bazie istniej\u0105cych instancji rekord\u00f3w. Rekordy bowiem, b\u0119d\u0105c niezmiennymi z za\u0142o\u017cenia, cz\u0119sto wymagaj\u0105 tworzenia nowych instancji, aby odzwierciedli\u0107 zmiany w danych, co prowadzi do popularnego wzorca tak zwanych <strong>wither method<\/strong>:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) {\n    Point withX(int newX) { \n        return new Point(newX, y, z); \n    }\n    Point withY(int newY) { \n        return new Point(x, newY, z); \n    }\n    Point withZ(int newZ) { \n        return new Point(x, y, newZ); \n    }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) {\n    Point withX(int newX) { \n        return new Point(newX, y, z); \n    }\n    Point withY(int newY) { \n        return new Point(x, newY, z); \n    }\n    Point withZ(int newZ) { \n        return new Point(x, y, newZ); \n    }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowy JEP proponuje sk\u0142adni\u0119, kt\u00f3ra pozwala programistom na zwi\u0119z\u0142e wyra\u017canie tych modyfikacji w desygnowanym temu bloku kodu, zwi\u0119kszaj\u0105c wyrazisto\u015b\u0107 j\u0119zyka i redukuj\u0105c powtarzalny kod zwi\u0105zany z obs\u0142ug\u0105 immutability.<\/p>\n","innerContent":["\n<p>Nowy JEP proponuje sk\u0142adni\u0119, kt\u00f3ra pozwala programistom na zwi\u0119z\u0142e wyra\u017canie tych modyfikacji w desygnowanym temu bloku kodu, zwi\u0119kszaj\u0105c wyrazisto\u015b\u0107 j\u0119zyka i redukuj\u0105c powtarzalny kod zwi\u0105zany z obs\u0142ug\u0105 immutability.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przyk\u0142ad warty jest tysi\u0105ca s\u0142\u00f3w, wi\u0119c tak prezentowa\u0107 si\u0119 b\u0119dzie u\u017cycie:<\/p>\n","innerContent":["\n<p>Przyk\u0142ad warty jest tysi\u0105ca s\u0142\u00f3w, wi\u0119c tak prezentowa\u0107 si\u0119 b\u0119dzie u\u017cycie:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) { }\nvar nextLoc = new Point(3,3,3)\n\nPoint finalLoc = nextLoc with { x = 0; };\n\n\/\/\/ finalLoc: Point(0,3,3)\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>record Point(int x, int y, int z) { }\nvar nextLoc = new Point(3,3,3)\n\nPoint finalLoc = nextLoc with { x = 0; };\n\n\/\/\/ finalLoc: Point(0,3,3)\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, nigdy nie jest prosto, i tak samo w tym przypadku tworzenie tego typu pochodnych rekord\u00f3w b\u0119dzie obwarowane pewnymi regu\u0142ami i warunkami brzegowymi, po te jednak odsy\u0142am do <a href=\"https:\/\/openjdk.org\/jeps\/8321133\">oryginalnego JEP-a<\/a>.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, nigdy nie jest prosto, i tak samo w tym przypadku tworzenie tego typu pochodnych rekord\u00f3w b\u0119dzie obwarowane pewnymi regu\u0142ami i warunkami brzegowymi, po te jednak odsy\u0142am do <a href=\"https:\/\/openjdk.org\/jeps\/8321133\">oryginalnego JEP-a<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jako, \u017ce ju\u017c wywo\u0142a\u0142em Kotlina, to warto por\u00f3wna\u0107 sobie to podej\u015bcie do jego rozwi\u0105zania podobnego problemu. Kotlin oferuje bowiem tak zwane data classes, kt\u00f3re podobnie jak rekordy Javy, s\u0105 przeznaczone do przechowywania danych. Maj\u0105 one wbudowan\u0105 metod\u0119 <code>copy<\/code>, kt\u00f3ra pozwala na \u0142atwe tworzenie zmodyfikowanych instancji przez podani. Tw\u00f3rcy <strong>Derived Records<\/strong> postawili jednak na wi\u0119ksz\u0105 elastyczno\u015b\u0107 transformat, kt\u00f3r\u0105 zapewnia zaproponowany przez nich blok <code>with<\/code> , jak na przyk\u0142ad mo\u017cliwo\u015b\u0107 operowania na zagnie\u017cd\u017conych rekordach (przyk\u0142ad z JEPa):<\/p>\n","innerContent":["\n<p>Jako, \u017ce ju\u017c wywo\u0142a\u0142em Kotlina, to warto por\u00f3wna\u0107 sobie to podej\u015bcie do jego rozwi\u0105zania podobnego problemu. Kotlin oferuje bowiem tak zwane data classes, kt\u00f3re podobnie jak rekordy Javy, s\u0105 przeznaczone do przechowywania danych. Maj\u0105 one wbudowan\u0105 metod\u0119 <code>copy<\/code>, kt\u00f3ra pozwala na \u0142atwe tworzenie zmodyfikowanych instancji przez podani. Tw\u00f3rcy <strong>Derived Records<\/strong> postawili jednak na wi\u0119ksz\u0105 elastyczno\u015b\u0107 transformat, kt\u00f3r\u0105 zapewnia zaproponowany przez nich blok <code>with<\/code> , jak na przyk\u0142ad mo\u017cliwo\u015b\u0107 operowania na zagnie\u017cd\u017conych rekordach (przyk\u0142ad z JEPa):<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>Marker scaled = m with { \n    loc = loc with { \n        x *= 2; \n        y *= 2; \n        z *= 2; \n    }\n};<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Marker scaled = m with { \n    loc = loc with { \n        x *= 2; \n        y *= 2; \n        z *= 2; \n    }\n};<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz powy\u017cszych, opisywane niedawno <a href=\"https:\/\/openjdk.org\/jeps\/465\">JEP 465: String Templates<\/a> oraz <a href=\"https:\/\/openjdk.org\/jeps\/466\">JEP 466: Class-File API (Second Preview)<\/a> otrzyma\u0142y status kandydata.<\/p>\n","innerContent":["\n<p>Opr\u00f3cz powy\u017cszych, opisywane niedawno <a href=\"https:\/\/openjdk.org\/jeps\/465\">JEP 465: String Templates<\/a> oraz <a href=\"https:\/\/openjdk.org\/jeps\/466\">JEP 466: Class-File API (Second Preview)<\/a> otrzyma\u0142y status kandydata.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Release Radar<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17730,"width":"991px","height":"auto","sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-1024x585.png\" alt=\"\" class=\"wp-image-17730\" style=\"width:991px;height:auto\"\/><figcaption class=\"wp-element-caption\">Tak wiem, nie tak si\u0119 pracuje na klawiaturze. I tak mi si\u0119 podoba\u0142 ten obrazek :D<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-13-1024x585.png\" alt=\"\" class=\"wp-image-17730\" style=\"width:991px;height:auto\"\/><figcaption class=\"wp-element-caption\">Tak wiem, nie tak si\u0119 pracuje na klawiaturze. I tak mi si\u0119 podoba\u0142 ten obrazek :D<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Docker Desktop 4.27<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Docker Desktop 4.27<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zaskoczeni widz\u0105c tu Docker Desktop? A nie powinni\u015bcie.<\/p>\n","innerContent":["\n<p>Zaskoczeni widz\u0105c tu Docker Desktop? A nie powinni\u015bcie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Docker Desktop 4.27 wprowadza bowiem natywne wsparcia dla frameworka Testcontainers, kt\u00f3rego tw\u00f3rc\u00f3w, AtomicJar, Docker niedawno kupi\u0142. Opiera si\u0119 ono o Enhanced Container Isolation, komercyjn\u0105 funkcj\u0119 Docker Desktop zwi\u0119kszaj\u0105c\u0105 bezpiecze\u0144stwo kontener\u00f3w poprzez dodatkowe mechanizmy izolacji. Chodzi tu g\u0142\u00f3wnie o jeszcze mocniejsze ograniczenie sposob\u00f3w, w jakim z\u0142o\u015bliwy kod uruchomiony w jednym kontenerze m\u00f3g\u0142by wp\u0142yn\u0105\u0107 na hosta systemowego lub inne kontenery. Ca\u0142o\u015b\u0107 zosta\u0142a do\u015b\u0107 przyst\u0119pnie (pami\u0119tajcie jednak - dalej m\u00f3wimy o warstwie OS i cho\u0107 lekka znajomo\u015b\u0107 Unixa si\u0119 przyda) opisana w <a href=\"https:\/\/docs.docker.com\/desktop\/hardened-desktop\/enhanced-container-isolation\/how-eci-works\/\">oficjalnej dokumentacji Dockera<\/a>.<\/p>\n","innerContent":["\n<p>Docker Desktop 4.27 wprowadza bowiem natywne wsparcia dla frameworka Testcontainers, kt\u00f3rego tw\u00f3rc\u00f3w, AtomicJar, Docker niedawno kupi\u0142. Opiera si\u0119 ono o Enhanced Container Isolation, komercyjn\u0105 funkcj\u0119 Docker Desktop zwi\u0119kszaj\u0105c\u0105 bezpiecze\u0144stwo kontener\u00f3w poprzez dodatkowe mechanizmy izolacji. Chodzi tu g\u0142\u00f3wnie o jeszcze mocniejsze ograniczenie sposob\u00f3w, w jakim z\u0142o\u015bliwy kod uruchomiony w jednym kontenerze m\u00f3g\u0142by wp\u0142yn\u0105\u0107 na hosta systemowego lub inne kontenery. Ca\u0142o\u015b\u0107 zosta\u0142a do\u015b\u0107 przyst\u0119pnie (pami\u0119tajcie jednak - dalej m\u00f3wimy o warstwie OS i cho\u0107 lekka znajomo\u015b\u0107 Unixa si\u0119 przyda) opisana w <a href=\"https:\/\/docs.docker.com\/desktop\/hardened-desktop\/enhanced-container-isolation\/how-eci-works\/\">oficjalnej dokumentacji Dockera<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Inn\u0105 godn\u0105 uwagi aktualizacj\u0105 dla programist\u00f3w Java w Docker Desktop 4.27 jest stabilizacja nowego polecenia <code>docker init<\/code>. To narz\u0119dzie upraszcza pocz\u0105tkow\u0105 konfiguracj\u0119 projekt\u00f3w Dockerowych, automatycznie generuj\u0105c Dockerfile, pliki Compose i <code>.dockerignore<\/code>, dostosowane do potrzeb projektu. Dopasowuje go do potrzeb projektu, i cho\u0107 w Javie opcje s\u0105 na razie do\u015b\u0107 ograniczone (przyk\u0142adowo, obecna wersja <code>Dockerfile<\/code> u\u017cywa Mavena i Eclipse Temurina i nie da si\u0119 tego skonfigurowa\u0107), to i tak generowane plik robi\u0105 wra\u017cenie, zw\u0142aszcza masa komentarzy i link\u00f3w w <code>Dockerfile<\/code> czy wielko\u015b\u0107 <code>.dockerignore<\/code>.<\/p>\n","innerContent":["\n<p>Inn\u0105 godn\u0105 uwagi aktualizacj\u0105 dla programist\u00f3w Java w Docker Desktop 4.27 jest stabilizacja nowego polecenia <code>docker init<\/code>. To narz\u0119dzie upraszcza pocz\u0105tkow\u0105 konfiguracj\u0119 projekt\u00f3w Dockerowych, automatycznie generuj\u0105c Dockerfile, pliki Compose i <code>.dockerignore<\/code>, dostosowane do potrzeb projektu. Dopasowuje go do potrzeb projektu, i cho\u0107 w Javie opcje s\u0105 na razie do\u015b\u0107 ograniczone (przyk\u0142adowo, obecna wersja <code>Dockerfile<\/code> u\u017cywa Mavena i Eclipse Temurina i nie da si\u0119 tego skonfigurowa\u0107), to i tak generowane plik robi\u0105 wra\u017cenie, zw\u0142aszcza masa komentarzy i link\u00f3w w <code>Dockerfile<\/code> czy wielko\u015b\u0107 <code>.dockerignore<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17732,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-1024x623.gif\" alt=\"\" class=\"wp-image-17732\"\/><figcaption class=\"wp-element-caption\">Warto wi\u0119c u\u017cy\u0107 docker init cho\u0107 raz - cho\u0107by w celach edukacyjnych.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/642218-1024x623.gif\" alt=\"\" class=\"wp-image-17732\"\/><figcaption class=\"wp-element-caption\">Warto wi\u0119c u\u017cy\u0107 docker init cho\u0107 raz - cho\u0107by w celach edukacyjnych.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Micronaut 4.3<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Micronaut 4.3<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kluczowe usprawnienia <a href=\"https:\/\/micronaut.io\/2024\/02\/06\/micronaut-framework-4-3-0-released\/\">Micronaut Framework 4.3<\/a> to ulepszona integracj\u0119 z Kotlin Symbol Processing (KSP), zawieraj\u0105ca poprawki z najnowszej wersji Kotlin 1.9.20. Wprowadzono te\u017c&nbsp;nowe modu\u0142y, takie jak Micronaut Chatbots (no bo przecie\u017c jak by inaczej) i Micronaut EclipseStore, zapewniaj\u0105cy integracje z nast\u0119pc\u0105 projektu MicroStream. Ponadto, wydanie usprawnia warunkowe cachowanie i umo\u017cliwia konfiguracje wielodziedziczenia przy u\u017cyciu j\u0119zyka wyra\u017ce\u0144 frameworka.<\/p>\n","innerContent":["\n<p>Kluczowe usprawnienia <a href=\"https:\/\/micronaut.io\/2024\/02\/06\/micronaut-framework-4-3-0-released\/\">Micronaut Framework 4.3<\/a> to ulepszona integracj\u0119 z Kotlin Symbol Processing (KSP), zawieraj\u0105ca poprawki z najnowszej wersji Kotlin 1.9.20. Wprowadzono te\u017c&nbsp;nowe modu\u0142y, takie jak Micronaut Chatbots (no bo przecie\u017c jak by inaczej) i Micronaut EclipseStore, zapewniaj\u0105cy integracje z nast\u0119pc\u0105 projektu MicroStream. Ponadto, wydanie usprawnia warunkowe cachowanie i umo\u017cliwia konfiguracje wielodziedziczenia przy u\u017cyciu j\u0119zyka wyra\u017ce\u0144 frameworka.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie to nie koniec, bo jak to ka\u017cde nowe wydanie Micronauta, tak i 4.3 przynosi aktualizacje w ca\u0142ym swoim ekosystemie, w tym modu\u0142y integracji z chmur\u0105 dla AWS, GCP, Azure i Oracle Cloud, oferuj\u0105c ulepszenia i nowe funkcjonalno\u015bci, takie jak subskrypcje Push Pub\/Sub dla GCP. Zaktualizowano u\u017cywan\u0105 wersj\u0119 GraalVM Native Image Build, poprawiono wsparcie dla Docker i Java 21, a Bill of Materials (BOM) Micronauta umo\u017cliwia teraz \u0142atwiejsze zarz\u0105dzanie zale\u017cno\u015bciami poprzez w\u0142\u0105czenie wersji z r\u00f3\u017cnych modu\u0142\u00f3w. Aktualizacje dosta\u0142y narz\u0119dzi migracji bazy danych wraz z poprawkami r\u00f3\u017cnych modu\u0142\u00f3w, takich jak Micronaut Data, gRPC, Kafka.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie to nie koniec, bo jak to ka\u017cde nowe wydanie Micronauta, tak i 4.3 przynosi aktualizacje w ca\u0142ym swoim ekosystemie, w tym modu\u0142y integracji z chmur\u0105 dla AWS, GCP, Azure i Oracle Cloud, oferuj\u0105c ulepszenia i nowe funkcjonalno\u015bci, takie jak subskrypcje Push Pub\/Sub dla GCP. Zaktualizowano u\u017cywan\u0105 wersj\u0119 GraalVM Native Image Build, poprawiono wsparcie dla Docker i Java 21, a Bill of Materials (BOM) Micronauta umo\u017cliwia teraz \u0142atwiejsze zarz\u0105dzanie zale\u017cno\u015bciami poprzez w\u0142\u0105czenie wersji z r\u00f3\u017cnych modu\u0142\u00f3w. Aktualizacje dosta\u0142y narz\u0119dzi migracji bazy danych wraz z poprawkami r\u00f3\u017cnych modu\u0142\u00f3w, takich jak Micronaut Data, gRPC, Kafka.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17734,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14.png\" alt=\"\" class=\"wp-image-17734\"\/><figcaption class=\"wp-element-caption\">Kiedy\u015b zrobi\u0119 dowcip i przekleje akapit o upgradzie zale\u017cno\u015bci z poprzedniej wersji. Mam wra\u017cenie, \u017ce nawet tw\u00f3rcy frameworki by si\u0119 nie skapn\u0119li.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/02\/image-14.png\" alt=\"\" class=\"wp-image-17734\"\/><figcaption class=\"wp-element-caption\">Kiedy\u015b zrobi\u0119 dowcip i przekleje akapit o upgradzie zale\u017cno\u015bci z poprzedniej wersji. Mam wra\u017cenie, \u017ce nawet tw\u00f3rcy frameworki by si\u0119 nie skapn\u0119li.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Amper 0.2.0<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Amper 0.2.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jeszcze na koniec update do projektu Amper, kt\u00f3ry (dla przypomnienia, wi\u0119cej o projekcie <a href=\"https:\/\/vived.substack.com\/p\/amper-by-jetbrains-defining-gradle\">znajdziecie tutaj<\/a>) jest eksperymentalnym narz\u0119dziem do deklaratywnej konfiguracji build\u00f3w projekt\u00f3w stworzonym przez JetBrains. Otrzyma\u0142 on w\u0142a\u015bnie aktualizacj\u0119 <a href=\"https:\/\/blog.jetbrains.com\/amper\/2024\/02\/amper-update-february-2024\/\">do wersji 0.2.0<\/a>. Pewnie bym o niej nie wspomina\u0142 - jako \u017ce to raczej ma\u0142y upgrade - ale jest okazj\u0105 aby opowiedzie\u0107 o troch\u0119 mniej znanej funkcjonalno\u015bci Gradle.<\/p>\n","innerContent":["\n<p>To jeszcze na koniec update do projektu Amper, kt\u00f3ry (dla przypomnienia, wi\u0119cej o projekcie <a href=\"https:\/\/vived.substack.com\/p\/amper-by-jetbrains-defining-gradle\">znajdziecie tutaj<\/a>) jest eksperymentalnym narz\u0119dziem do deklaratywnej konfiguracji build\u00f3w projekt\u00f3w stworzonym przez JetBrains. Otrzyma\u0142 on w\u0142a\u015bnie aktualizacj\u0119 <a href=\"https:\/\/blog.jetbrains.com\/amper\/2024\/02\/amper-update-february-2024\/\">do wersji 0.2.0<\/a>. Pewnie bym o niej nie wspomina\u0142 - jako \u017ce to raczej ma\u0142y upgrade - ale jest okazj\u0105 aby opowiedzie\u0107 o troch\u0119 mniej znanej funkcjonalno\u015bci Gradle.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadza ona wsparcie dla Gradle Version Catalogs - funkcjonalno\u015bci wprowadzona w Gradle 7.0, kt\u00f3ra pozwala na centralne zarz\u0105dzanie wersjami bibliotek oraz wtyczek, co u\u0142atwia zarz\u0105dzanie zale\u017cno\u015bciami w wielomodu\u0142owych projektach. Dzi\u0119ki temu, zamiast powtarza\u0107 wersje bibliotek w r\u00f3\u017cnych modu\u0142ach, mo\u017cna je zdefiniowa\u0107 raz w katalogu wersji i odwo\u0142ywa\u0107 si\u0119 do nich za pomoc\u0105 alias\u00f3w. Ampera umo\u017cliwia teraz dost\u0119p do zale\u017cno\u015bci zadeklarowanych w tych katalogach, u\u017cywaj\u0105c sk\u0142adni <code>$libs.library.name<\/code>.<\/p>\n","innerContent":["\n<p>Wprowadza ona wsparcie dla Gradle Version Catalogs - funkcjonalno\u015bci wprowadzona w Gradle 7.0, kt\u00f3ra pozwala na centralne zarz\u0105dzanie wersjami bibliotek oraz wtyczek, co u\u0142atwia zarz\u0105dzanie zale\u017cno\u015bciami w wielomodu\u0142owych projektach. Dzi\u0119ki temu, zamiast powtarza\u0107 wersje bibliotek w r\u00f3\u017cnych modu\u0142ach, mo\u017cna je zdefiniowa\u0107 raz w katalogu wersji i odwo\u0142ywa\u0107 si\u0119 do nich za pomoc\u0105 alias\u00f3w. Ampera umo\u017cliwia teraz dost\u0119p do zale\u017cno\u015bci zadeklarowanych w tych katalogach, u\u017cywaj\u0105c sk\u0142adni <code>$libs.library.name<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>IDE ze wsparciem Ampera (IntelliJ IDEA, Android Studio i JetBrains Fleet) dosta\u0142y te\u017c auto-podpowiadanie dla zale\u017cno\u015bci dzia\u0142aj\u0105ce na bazie <a href=\"https:\/\/package-search.jetbrains.com\/\">JetBrains Package Search<\/a>. Ponadto od wersji IntelliJ IDEA 2024.1, mo\u017cliwe jest tworzenie nowych projekt\u00f3w Kotlinowych opartych na Amperze bezpo\u015brednio z kreatora nowych projekt\u00f3w.<\/p>\n","innerContent":["\n<p>IDE ze wsparciem Ampera (IntelliJ IDEA, Android Studio i JetBrains Fleet) dosta\u0142y te\u017c auto-podpowiadanie dla zale\u017cno\u015bci dzia\u0142aj\u0105ce na bazie <a href=\"https:\/\/package-search.jetbrains.com\/\">JetBrains Package Search<\/a>. Ponadto od wersji IntelliJ IDEA 2024.1, mo\u017cliwe jest tworzenie nowych projekt\u00f3w Kotlinowych opartych na Amperze bezpo\u015brednio z kreatora nowych projekt\u00f3w.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=17719"}],"version-history":[{"count":4,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17719\/revisions"}],"predecessor-version":[{"id":17745,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17719\/revisions\/17745"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17737"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}