{"id":17824,"date":"2024-03-07T11:58:57","date_gmt":"2024-03-07T10:58:57","guid":{"rendered":"https:\/\/vived.io\/?p=17824"},"modified":"2024-03-08T08:03:28","modified_gmt":"2024-03-08T07:03:28","slug":"code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/","title":{"rendered":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie &#8211;  JVM Weekly vol. 166"},"content":{"rendered":"\n<h2 id=\"1-nowe-jepy-usprawnienia-cds-generacyjny-zgc-i-markdown-w-dokumentacji\" data-num=1>1. Nowe JEPy &#8211; usprawnienia CDS, Generacyjny ZGC i Markdown w dokumentacji<\/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\/03\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17854\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9.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\/8320264\">JEP draft: (draft) Unified storage for application cache (aka &#8222;new CDS workflow&#8221;)<\/a><\/h3>\n\n\n\n<p>Rzadko kiedy informuje o JEP-ach na tak wczesnym etapie, ale ten mi si\u0119 szczeg\u00f3lnie spodoba\u0142. &#8222;Unified storage for application cache (aka &#8222;new CDS workflow)&#8221; ma na celu unifikacj\u0119 miejsca przechowywania danych pami\u0119ci podr\u0119cznej aplikacji, b\u0119d\u0105ce now\u0105 iteracj\u0105 mechanizmu Class-Data Sharing. Celem jest rozwini\u0119cie wykorzystania CDS, w tym momencie u\u017cywanego do przechowywania metadanych klas i obiekt\u00f3w sterty, aby mog\u0142o by\u0107 u\u017cywane jako cache dla szerszego zakresu typ\u00f3w danych, takich jak np. metody skompilowane AOT. Planowane jest r\u00f3wnie\u017c uporz\u0105dkowanie sposobu obs\u0142ugi CDS (kt\u00f3ry na przestrzeni lat rozwin\u0105\u0142 si\u0119 w spos\u00f3b ad hoc) poprzez wprowadzenie pojedynczej flag <code>-XX:CacheDataStore<\/code>, kt\u00f3ry okre\u015bla lokalizacj\u0119 magazynu. Pocz\u0105tkowo magazyn b\u0119dzie sk\u0142ada\u0142 si\u0119 z jednego pliku, ale w przysz\u0142o\u015bci mo\u017ce odnosi\u0107 si\u0119 do wielu plik\u00f3w, potencjalnie hierarchicznych.<\/p>\n\n\n\n<p>Na razie to wszystko co wiemy na tym wczesnym etapie, wi\u0119c szczeg\u00f3\u0142y mog\u0105 si\u0119 jeszcze zmieni\u0107. W dalszym ci\u0105gu daje nam podgl\u0105d na to, w jaki spos\u00f3b w przysz\u0142o\u015bci b\u0119d\u0105 \u0142\u0105czy\u0107 si\u0119 r\u00f3\u017cne mechanizmy usprawniaj\u0105ce cold start aplikacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8326667\">JEP draft: Deprecate Non-Generational ZGC<\/a><\/h3>\n\n\n\n<p>Kontynuuj\u0105c temat draft\u00f3w, kolejna z ciekawych nowo\u015bci to &#8222;Deprecate Non-Generational ZGC&#8221;. Dopiero co do ZGC wprowadzono Generacyjny wariant ZGC, a ju\u017c w tej chwili pojawiaj\u0105 si\u0119 plany na deprekacji wersji niegeneracyjnej, z zamiar usuni\u0119cia jej w przysz\u0142ych wydaniach. G\u0142\u00f3wnym celem jest redukcja koszt\u00f3w utrzymania oraz technicznego d\u0142ugu wynikaj\u0105cego z obs\u0142ugi dw\u00f3ch r\u00f3\u017cnych tryb\u00f3w dzia\u0142ania. Non-Generational ZGC, mimo \u017ce nie zostanie usuni\u0119ty w ramach tego JEP-u i pewnie zostanie z nami na d\u0142u\u017cej, to stanie si\u0119 tym mniej preferowanym trybem, gdy\u017c Generational ZGC, wprowadzony w JEP 439, jest postrzegany jako lepsze rozwi\u0105zanie w wi\u0119kszo\u015bci use cas\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/467\">JEP 467: Markdown Documentation Comments<\/a><\/h3>\n\n\n\n<p>JEP 467 to za\u015b&nbsp;wreszcie JEP-kandydat, kt\u00f3rego celem jest umo\u017cliwienie pisania dokumentacji JavaDoc w Markdownie, zamiast wy\u0142\u0105cznie w mieszance HTML i tag\u00f3w JavaDoc. Powiedzmy sobie szczerze, Markdown od lat jest rozwi\u0105zaniem, kt\u00f3re kr\u00f3luje je\u015bli chodzi o tworzenie dokumentacji technicznej i de facto sta\u0142 si\u0119 standardem do tego stopnia, \u017ce w zasadzie ka\u017cde IDE czy Code Editor maj\u0105 do niego \u015bwietne wsparcie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"417\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-1024x417.png\" alt=\"\" class=\"wp-image-17827\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-1024x417.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-300x122.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-768x313.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-1536x626.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1.png 1830w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Behind the scenes: Tak naprawd\u0119, do nawet ten newsletter powstaje w Markdownie, i IA Writer. Dodatkow\u0105 ciekawostk\u0105 jest to, \u017ce pisz\u0119 w macierzystym j\u0119zyku i dopiero potem &#8222;przechodz\u0119&#8221; na angielski &#8211; taki flow mi najlepiej dzia\u0142a od lat.<\/figcaption><\/figure>\n\n\n\n<p>Celem jest oczywi\u015bcie u\u0142atwienie pisania i czytania komentarzy API. Tworzenie dokumentacja to trudny, \u017cmudny proces niezale\u017cnie od wybranego markupu, a konieczno\u015b\u0107 stosowania HTML (ergo j\u0119zyka quasi-XML-owego), kt\u00f3ry jest mniej intuicyjny dla ludzi, nie pomaga. Ostatnimi czasy wida\u0107 trend, \u017ce i cz\u0119\u015bciej generowany z innych j\u0119zyk\u00f3w znacznik\u00f3w bardziej &#8222;przyjaznych&#8221; dla cz\u0142owieka. Markdown nie do\u015b\u0107 \u017ce jest popularnym j\u0119zykiem znacznik\u00f3w dla prostych dokument\u00f3w, \u0142atwym do czytania, tworzenia i przekszta\u0142cania w HTML, co czyni go idealnym wyborem dla komentarzy dokumentacyjnych, kt\u00f3re zazwyczaj nie s\u0105 skomplikowanymi dokumentami strukturalnymi&#8230; i chyba nie chcieliby\u015bmy, \u017ceby si\u0119 takimi sta\u0142y.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"405\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-1024x405.png\" alt=\"\" class=\"wp-image-17870\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-1024x405.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-300x119.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-768x303.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-1536x607.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-2048x809.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Jak to ma dzia\u0142a\u015b w praktyce? Na przyk\u0142adzie komentarza dla metody <code>hashCode<\/code> mo\u017cna zauwa\u017cy\u0107 r\u00f3\u017cnic\u0119 w u\u017cyciu Markdown, gdzie linie zaczynaj\u0105 si\u0119 od <code>\/\/\/<\/code> zamiast tradycyjnego <code>\/** ... *\/<\/code>. HTML nie jest wymagany do wskazania przerwy akapitowej; wystarczy pusta linia. Elementy HTML takie jak <code>&lt;ul&gt;<\/code> i <code>&lt;li&gt;<\/code> s\u0105 zast\u0119powane przez znaczniki listy punktowanej Markdown, u\u017cywaj\u0105c <code>-<\/code> do wskazania pocz\u0105tku ka\u017cdego elementu listy. Zamiast <code>&lt;em&gt;<\/code>, u\u017cywa si\u0119 podkre\u015ble\u0144 (<code>_<\/code>) do wskazania zmiany czcionki, a instancje tagu <code>{@code ...}<\/code> s\u0105 zast\u0119powane przez znaki odwrotnego apostrofu (`) do wskazania czcionki o sta\u0142ej szeroko\u015bci.<\/p>\n\n\n\n<p>Dawno chyba te\u017c \u017caden z JEP-\u00f3w nie by\u0142 tak mocno dyskutowany na <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1b1num5\/candidate_jep_467_markdown_documentation_comments\/\">redditcie<\/a>. Opinia spo\u0142eczno\u015bci poza og\u00f3lnym entuzjazmem (bo taki na pewno towarzyszy rozwi\u0105zaniu) ujawnia kilka g\u0142\u00f3wnych obaw. Po pierwsze, wielu uwa\u017ca wym\u00f3g stosowania trzech uko\u015bnik\u00f3w dla komentarzy dokumentacyjnych za niewygodny, sugeruj\u0105c pr\u00f3b\u0119 wypracowania jakiej\u015b bardziej zwi\u0119z\u0142ej notacji &#8211; i tu si\u0119 mocno podpisuje, cho\u0107 fakt, \u017ce wszystkie linie maj\u0105 taki sam prefix z drugiej strony wp\u0142ywa na czytelno\u015b\u0107. Dodatkowo, dyskusja porusza obawy dotycz\u0105ce d\u0142ugoterminowej \u017cywotno\u015bci i elastyczno\u015bci takiego wyboru sk\u0142adni (trzech slashy), zastanawiaj\u0105c si\u0119, co stanie si\u0119, je\u015bli nowy j\u0119zyk znacznik\u00f3w zyska na popularno\u015bci w przysz\u0142o\u015bci (w rozmow\u0119 zaanga\u017cowa\u0142 si\u0119 sam Ron Pressler). Wytykany jest te\u017c brak jakiej\u015b sensownej alternatywy dla tag\u00f3w JavaDoc, kt\u00f3re dalej musz\u0105 by\u0107 mieszane z Markdownem w swojej klasycznej formie. Mimo powy\u017cszego feedbacku, odbi\u00f3r jest pozytywny, a bior\u0105c pod uwag\u0119, \u017ce to ju\u017c kandydacki JEP, a nie np. Preview, to nie spodziewam si\u0119 ju\u017c jakich\u015b daleko id\u0105cych zmian.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"719\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2.png\" alt=\"\" class=\"wp-image-17829\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2.png 720w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2-300x300.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2-150x150.png 150w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><figcaption class=\"wp-element-caption\">Jak ju\u017c wspomnia\u0142em, bardzo lubi\u0119 Markdowna i mam wra\u017cenie, \u017ce mo\u017cliwo\u015b\u0107 u\u017cywania go do pisania dokumentacji sprawi, \u017ce znaczenie mniej wpis\u00f3w b\u0119dzie jako TODO<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"2-triton-kolejne-podejscie-do-programowania-na-gpu-z-project-babylon\" data-num=2>2. Triton &#8211; Kolejne podej\u015bcie do programowania na GPU z Project Babylon<\/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\/03\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-17831\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A teraz po raz kolejny w tym roku przygl\u0105dniemy si\u0119 projektowi Babylon. Niedawno bowiem ukaza\u0142a si\u0119 publikacja Paula Sandoza <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">Exploring Triton GPU programming for neural networks in Java<\/a>, czyli kolejna pr\u00f3ba wykorzystania Code Reflection do rozepchania si\u0119 \u0142okciami w przestrzeni oko\u0142o-AI.<\/p>\n\n\n\n<p>Triton to domenowy model programowania i kompilator, kt\u00f3ry umo\u017cliwia programistom pisz\u0105cym w Pythonie tworzenie kodu dzia\u0142aj\u0105cego na procesorach GPU, nawet tym maj\u0105cy niewielkie do\u015bwiadczenie w pracy z GPU i j\u0119zykami programowania specyficznymi dla GPU, takimi jak CUDA. Ukrywa on bowiem przed programistami bazuj\u0105cy na w\u0105tkach model programowania CUDA, co pozwala kompilatorowi Triton lepiej wykorzysta\u0107 sprz\u0119t GPU, na przyk\u0142ad poprzez optymalizacj\u0119 przypadk\u00f3w, kt\u00f3re mog\u0142yby inaczej wymaga\u0107 jawnej synchronizacji. Dodatkowo, dzi\u0119ki abstrakcji Tritona programi\u015bci operuj\u0105 na tensorach zamiast skalarnych warto\u015bci, co znacz\u0105co upraszcza i przyspiesza proces tworzenia kodu na GPU.<\/p>\n\n\n\n<p>Triton dzia\u0142a jednak z Pythonem, ale i dla Javy okienko transferowe na wykorzystania modelu programowania Triton otwiera si\u0119 dzi\u0119ki Code Reflection, rozwijanej w ramach Project Babylon. Dla przypomnienia Refleksja kodu pozwala na symboliczne reprezentowanie program\u00f3w Java, co umo\u017cliwia ich analiz\u0119 i automatyczn\u0105 transformacj\u0119 na model kodu Triton. Dzi\u0119ki temu programy napisane w Javie mog\u0105 by\u0107 kompilowane do kodu dzia\u0142aj\u0105cego na GPU, podobnie jak to ma miejsce w przypadku Pythona z u\u017cyciem Tritona. Projekt Babylon w tym kontek\u015bcie dzia\u0142a jako most mi\u0119dzy Jav\u0105, a specyficznymi rozwi\u0105zaniami pod GPU, otwieraj\u0105c programistom drzwi do \u015bwiata programowania GPU z wszystkimi jego korzy\u015bciami, takimi jak rozszerzone mo\u017cliwo\u015bci oblicze\u0144 r\u00f3wnoleg\u0142ych w du\u017cej skali.<\/p>\n\n\n\n<p>Na poziomie technicznym, proces ten zaczyna si\u0119 od utworzenia modelu kodu Java za pomoc\u0105 refleksji kodu, kt\u00f3ry nast\u0119pnie jest analizowany i transformowany w model kodu Triton. W tym procesie nast\u0119puje przypisanie odpowiednich typ\u00f3w do element\u00f3w modelu, co umo\u017cliwia dok\u0142adn\u0105 transformacj\u0119 kodu Java na kod odpowiedni dla GPU, aby wyprodukowa\u0107 form\u0119 podobn\u0105 do Triton MLIR.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"753\" height=\"587\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-4.png\" alt=\"\" class=\"wp-image-17833\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-4.png 753w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-4-300x234.png 300w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><figcaption class=\"wp-element-caption\">Nasze karty graficzne nie wiedzia\u0142y, jak mia\u0142y dobrze<\/figcaption><\/figure><\/div>\n\n\n<p>Je\u015bli jeste\u015bcie ciekawi dodatkowych detali, w artykule pojawiaj\u0105 si\u0119 przyk\u0142ady, gdzie na przyk\u0142adzie dodawania wektor\u00f3w pokazano, jak implementacja w Javie mo\u017ce by\u0107 zbli\u017cona do Pythonowej, mimo np. braku przeci\u0105\u017cania operator\u00f3w w Javie. Wi\u0119cej szczeg\u00f3\u0142\u00f3w znajdziecie w <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">oryginalnej publikacji<\/a>.<\/p>\n\n\n\n<h2 id=\"3-release-radar\" data-num=3>3. Release Radar<\/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\/03\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-17835\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-1024x585.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-300x171.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-768x439.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-1536x878.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5.png 1792w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/quarkus.io\/blog\/quarkus-3-8-released\/\">Quarkus 3.8<\/a><\/h3>\n\n\n\n<p>Zacznijmy sobie od Ma\u0142yc-Du\u017cych zmian w Quarkusie. Wersja 3.8 zosta\u0142 og\u0142oszony now\u0105 wersj\u0105 Long-Term Support (LTS). A czemu Ma\u0142o-Du\u017ce? Nowa wersja to bezpo\u015brednio kontynuuje ga\u0142\u0105\u017a 3.7 i tym samym nie zawiera \u017cadnych nowych funkcji wychodz\u0105cych poza 3.7, co najwy\u017cej zawiera kilka dodatkowych poprawek, w\u015br\u00f3d kt\u00f3rych warto wymieni\u0107 zaadresowanie CVE-2024-1597 zwi\u0105zanego z sterownikiem JDBC PostgreSQL. Je\u015bli jednak dalej pozostajecie na ostatnim LTS, kt\u00f3rym by\u0142a jeszcze wersja 3.2, to nowe wydanie b\u0119dzie dla Was sporym przeskokiem &#8211; ulepszenia OpenTelemetry, wsparcie dla Java 21 (plus minimalna wspierana nowa wersja to teraz JDK 17), wsparcie dla OpenIDConnect i sporo innych usprawnie\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Scala 3.4.0<\/a><\/h3>\n\n\n\n<p>Pawe\u0142 Marks z VirtusLab poinformowa\u0142  o wydaniu nowej wersji Scali &#8211; Scala 3.4. W\u015br\u00f3d najwa\u017cniejszych nowo\u015bci w nowym wydaniu z pewno\u015bci\u0105 nale\u017cy wymieni\u0107 stabilizacje wa\u017cnych SIP-\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SIP-54 &#8211; upraszczaj\u0105cy importowanie Extension Methods z r\u00f3\u017cnych \u017ar\u00f3de\u0142<\/li>\n\n\n\n<li>SIP-53 &#8211; zwi\u0119kszaj\u0105cy ekspresyjno\u015b\u0107 wzorc\u00f3w typ\u00f3w.<\/li>\n\n\n\n<li>SIP-56 &#8211; usprawniaj\u0105cy inferencje typ\u00f3w, szczeg\u00f3lnie dla funkcji takich jak <code>fold<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Co wi\u0119cej, Scala 3.4.0 wprowadza ulepszenia w backendzie, optymalizuj\u0105c polimorficzne lambdy przez wykorzystanie lambd pochodz\u0105cych z JVM, co uniezale\u017cnia Scal\u0119 od anonimowych klas. Nowa wersja ulepsza te\u017c raportowanie b\u0142\u0119d\u00f3w, w tym bardziej informacyjne komunikaty dla niekompatybilnych wersji TASTy. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"456\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-1024x456.png\" alt=\"\" class=\"wp-image-17841\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-1024x456.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-300x134.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-768x342.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-1536x685.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7.png 1712w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ciekawostka: Oficjalne repozytorium Dotty&#8217;ego, czyli nowej wersji kompilatora Scali te\u017c zosta\u0142o przemianowane na Scala3<\/figcaption><\/figure>\n\n\n\n<p>Scala 3.4.0 wprowadza te\u017c eksperymentaln\u0105 adnotacj\u0119 <code>@publicInBinary<\/code>, kt\u00f3ra umo\u017cliwia oznaczanie niekt\u00f3rych definicji jako cz\u0119\u015bci API binarnego. Wersja deprecjonuje te\u017c nieaktualne konstrukty, takie jak wildcardy typ\u00f3w <code>_<\/code> i <code>private[this]<\/code> (oraz kilka innych), na rzecz nowocze\u015bniejszych i bardziej zwi\u0119z\u0142ych alternatyw. Og\u00f3lnie zach\u0119cam zajrze\u0107 do oryginalnych <a href=\"https:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Release Notes<\/a>, gdy\u017c ciekawych detali dla u\u017cytkownik\u00f3w Scali jest tam wi\u0119cej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/jstach.io\/doc\/rainbowgum\/current\/apidocs\/\">Rainbow Gum<\/a><\/h3>\n\n\n\n<p>A teraz mam prawdziw\u0105 ciekawostk\u0119 od tw\u00f3rc\u00f3w <a href=\"https:\/\/github.com\/jstachio\/jstachio\">jstachio<\/a>, frameworku b\u0119d\u0105cego opisywanym ju\u017c tu kiedy\u015b systemem templatingu w Javie opartym o <a href=\"https:\/\/github.com\/mustache\">mustache<\/a>. Rainbow Gum bierze sobie bowiem za cel poradzi\u0107 sobie z\u0142o\u017cono\u015b\u0107 i nieefektywno\u015b\u0107 obecnych framework\u00f3w logowania w Javie, zw\u0142aszcza w kontek\u015bcie aplikacji z bardzo szybkim startem. Tradycyjne frameworki logowania takie jak Log4J 2 i Logback s\u0105 nie tylko obci\u0105\u017cone funkcjami, kt\u00f3re mog\u0105 nie by\u0107 niezb\u0119dne dla wszystkich aplikacji, ale tak\u017ce polegaj\u0105 na zewn\u0119trznych plikach konfiguracyjnych, kt\u00f3re mog\u0105 spowalnia\u0107 inicjalizacj\u0119 aplikacji i zwi\u0119ksza\u0107 ryzyko bezpiecze\u0144stwa, jak pokaza\u0142a podatno\u015b\u0107 Log4Shell.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"718\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-6.png\" alt=\"\" class=\"wp-image-17837\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-6.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-6-300x280.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">Log4Shell &#8211; pami\u0119tamy!<\/figcaption><\/figure><\/div>\n\n\n<p>Tworzy to potrzeb\u0119 bardziej uproszczonego, prekonfigurowanego rozwi\u0105zania do logowania, kt\u00f3re nie maj\u0105c na karku wielu lat rozwoju mo\u017ce szybko dostosowa\u0107 si\u0119 do nowych funkcji Javy i mnogo\u015bci \u015brodowisk uruchomieniowych.<\/p>\n\n\n\n<p>Rainbow Gum to w\u0142a\u015bnie taka lekka implementacja SLF4J dla JDK 21+, kt\u00f3ra ma na celu by\u0107 \u0142atwiejsz\u0105 w u\u017cyciu, wykorzystuj\u0105c przy tym nowsze technologie JDK. Rainbow Gum nie oferuje tyle elastyczno\u015bci co Logbacka czy Log4J, ale upraszcza konfiguracj\u0119 i inicjalizacj\u0119. Rainbow Gum jest zaprojektowany tak, by by\u0107 przyjaznym dla kompilacji natywnych Graal VM. Umo\u017cliwiaj\u0105c konfigurowanie ca\u0142o\u015bci za pomoc\u0105 kodu aplikacji, Rainbow Gum pozwala programistom wykorzystywa\u0107 unika\u0107 pu\u0142apek zwi\u0105zanych z zewn\u0119trznymi plikami konfiguracyjnymi, prowadz\u0105c do szybszego startu aplikacji i zmniejszenia przestrzeni na podatno\u015bci. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class GettingStartedExample implements RainbowGumProvider {\n\n    @Override\n    public Optional&lt;RainbowGum&gt; provide(LogConfig config) {\n\treturn RainbowGum.builder(config)\n\t    .route(r -&gt; {\n\t\tr.level(Level.DEBUG, &quot;com.myapp&quot;);\n\t        r.appender(&quot;console&quot;, a -&gt; {\n\t            a.encoder(new PatternEncoderBuilder(&quot;console&quot;)\n\t\t     .pattern(&quot;&#091;%thread] %-5level %logger{15} - %msg%n&quot;)\n\t\t     .fromProperties(config.properties())\n\t\t     .build());\n\t\t});\n\t    }) \n\t    .optional();\n   }\n}<\/code><\/pre>\n\n\n\n<p>Jego projekt jest celowo modularny i minimalistyczny, r\u00f3wnocze\u015bnie wspieraj\u0105 do\u015b\u0107 zaawansowane funkcje jak kolorowane log\u00f3w i czy wsparcie dla JSON.<\/p>\n\n\n\n<p>Ciekawe, czy Rainbow Gum to zapowied\u017a jakiego\u015b nowego trendu bibliotek opytmlizowanych pod specyfik\u0119 u\u017cycia z GraalVM.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/poiu-de.github.io\/coat\/\">Coat<\/a><\/h3>\n\n\n\n<p>A na koniec Coat, kt\u00f3ry jest kolejnym z przedstawicielem mojej ulubionej kategorii ma\u0142ych bibliotek, odpowiadaj\u0105cych na konkretny problem. Ten kt\u00f3ry rozwi\u0105zuje Coat polega na potrzebie efektywnego i &#8222;typesafe&#8221; zarz\u0105dzania danymi konfiguracyjnymi. Tradycyjnie, odczytywanie i integrowanie takowych za aplikacj\u0105 wi\u0105\u017ce si\u0119 z r\u0119cznym parsowaniem, walidacj\u0105 i konwersj\u0105 na potrzebne struktury, co jest podatne na b\u0142\u0119dy i uci\u0105\u017cliwe. Manualno\u015b\u0107 procesu zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w i niesp\u00f3jno\u015bci, szczeg\u00f3lnie w z\u0142o\u017conych aplikacjach, gdzie konfiguracja cz\u0119sto si\u0119 zmienia lub wymagana jest jej walidacja wed\u0142ug konkretnych kryteri\u00f3w. Dodatkowo, programi\u015bci cz\u0119sto musz\u0105 pisa\u0107 specjalne mappery, aby zapewni\u0107, \u017ce warto\u015bci konfiguracyjne odpowiadaj\u0105 oczekiwanym typom.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Coat.Confg(converters = {\n  UuidConverter.class,\n  CurrencyConverter.class,\n})\npublic interface AppConfig {\n  public UUID uuid();\n  public Currency currency();\n}\n\nfinal AppConfig config = new ImmutableMyConfig(new File(&quot;\/path\/to\/config.properties&quot;));\n\ntry {\n  config.validate();\n} catch (final ConfigValidationException ex) {\n  System.err.println(&quot;Error in config file:\\n&quot; + ex.getValidationResult().toString());\n  System.exit(1);\n}\n\nfinal UUID appName= config.uuid();\nfinal Currency currency= config.currency();<\/code><\/pre>\n\n\n\n<p>Coat oferuje rozwi\u0105zanie powy\u017cszych problem\u00f3w poprzez sw\u00f3j procesor adnotacji, kt\u00f3ry generuje klasy do odczytywania warto\u015bci konfiguracyjnych do typowanych obiekt\u00f3w. Poprzez zdefiniowanie interfejsu z oczekiwan\u0105 struktur\u0105 danych konfiguracji i u\u017cyciu odpowiedniej adnotacji, Coat automatycznie tworzy konkretne implementacje.<\/p>\n\n\n\n<p>Obs\u0142uguj\u0105 parsowanie, walidacj\u0119 i konwersj\u0119 typ\u00f3w warto\u015bci konfiguracyjnych. Coat, nie wymaga runtime&#8217;owych zale\u017cno\u015bci i obs\u0142uguje Java 11 lub wy\u017csz\u0105.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>A na ko\u0144cu podziel\u0119 si\u0119 nowym hobby!<\/p>\n\n\n\n<p>Bo kiedy \u015bwiat gra w Final Fantasy VII Rebirth, a ty nie grasz, bo zajmujesz si\u0119 trzyletni\u0105 c\u00f3rk\u0105 chora na zapalenie p\u0142uc i ona m\u00f3wi: &#8222;Tato, zr\u00f3bmy co\u015b z gliny.&#8221;&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"540\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-8.png\" alt=\"\" class=\"wp-image-17846\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-8.png 720w, https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-8-300x225.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure><\/div>\n\n\n<p>&#8230;w\u0142\u0105cza si\u0119 wtedy kreatywno\u015b\u0107.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj powracamy do formy tekstowej, z nowymi Jepami, proposalami i mega ciekawym Release Radarem.<\/p>\n","protected":false},"author":10,"featured_media":17848,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-17824","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"11","feature_image_blog":{"ID":17849,"id":17849,"title":"Group 780","filename":"Group-780.png","filesize":2626289,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","link":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/group-780-7-2\/","alt":"","author":"10","description":"","caption":"","name":"group-780-7-2","status":"inherit","uploaded_to":17824,"date":"2024-03-07 10:48:00","modified":"2024-03-08 06:59:34","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1976,"height":1080,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-300x164.png","medium-width":300,"medium-height":164,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-768x420.png","medium_large-width":768,"medium_large-height":420,"large":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-1024x560.png","large-width":1024,"large-height":560,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-1536x840.png","1536x1536-width":1536,"1536x1536-height":840,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","2048x2048-width":1976,"2048x2048-height":1080,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":164,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":219,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":328}},"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>Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - 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\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj powracamy do formy tekstowej, z nowymi Jepami, proposalami i mega ciekawym Release Radarem.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-07T10:58:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-08T07:03:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-1024x560.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"560\" \/>\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\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie &#8211; JVM Weekly vol. 166\",\"datePublished\":\"2024-03-07T10:58:57+00:00\",\"dateModified\":\"2024-03-08T07:03:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\"},\"wordCount\":2115,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\",\"url\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\",\"name\":\"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png\",\"datePublished\":\"2024-03-07T10:58:57+00:00\",\"dateModified\":\"2024-03-08T07:03:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png\",\"width\":1976,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie &#8211; JVM Weekly vol. 166\"}]},{\"@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":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - 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\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/","og_locale":"pl_PL","og_type":"article","og_title":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - Vived","og_description":"Dzisiaj powracamy do formy tekstowej, z nowymi Jepami, proposalami i mega ciekawym Release Radarem.","og_url":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/","og_site_name":"Vived","article_published_time":"2024-03-07T10:58:57+00:00","article_modified_time":"2024-03-08T07:03:28+00:00","og_image":[{"width":1024,"height":560,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780-1024x560.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\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie &#8211; JVM Weekly vol. 166","datePublished":"2024-03-07T10:58:57+00:00","dateModified":"2024-03-08T07:03:28+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/"},"wordCount":2115,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/","url":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/","name":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie - JVM Weekly vol. 166 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","datePublished":"2024-03-07T10:58:57+00:00","dateModified":"2024-03-08T07:03:28+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/Group-780.png","width":1976,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/code-reflection-triton-dalsze-ulepszenia-programowania-dla-gpu-w-javie-jvm-weekly-vol-166\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Code Reflection Triton: Dalsze ulepszenia programowania dla GPU w Javie &#8211; JVM Weekly vol. 166"}]},{"@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. Nowe JEPy - usprawnienia CDS, Generacyjny ZGC i Markdown w dokumentacji<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Nowe JEPy - usprawnienia CDS, Generacyjny ZGC i Markdown w dokumentacji<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17854,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17854\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-9-1024x585.png\" alt=\"\" class=\"wp-image-17854\"\/><\/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\/8320264\">JEP draft: (draft) Unified storage for application cache (aka \"new CDS workflow\")<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8320264\">JEP draft: (draft) Unified storage for application cache (aka \"new CDS workflow\")<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Rzadko kiedy informuje o JEP-ach na tak wczesnym etapie, ale ten mi si\u0119 szczeg\u00f3lnie spodoba\u0142. \"Unified storage for application cache (aka \"new CDS workflow)\" ma na celu unifikacj\u0119 miejsca przechowywania danych pami\u0119ci podr\u0119cznej aplikacji, b\u0119d\u0105ce now\u0105 iteracj\u0105 mechanizmu Class-Data Sharing. Celem jest rozwini\u0119cie wykorzystania CDS, w tym momencie u\u017cywanego do przechowywania metadanych klas i obiekt\u00f3w sterty, aby mog\u0142o by\u0107 u\u017cywane jako cache dla szerszego zakresu typ\u00f3w danych, takich jak np. metody skompilowane AOT. Planowane jest r\u00f3wnie\u017c uporz\u0105dkowanie sposobu obs\u0142ugi CDS (kt\u00f3ry na przestrzeni lat rozwin\u0105\u0142 si\u0119 w spos\u00f3b ad hoc) poprzez wprowadzenie pojedynczej flag <code>-XX:CacheDataStore<\/code>, kt\u00f3ry okre\u015bla lokalizacj\u0119 magazynu. Pocz\u0105tkowo magazyn b\u0119dzie sk\u0142ada\u0142 si\u0119 z jednego pliku, ale w przysz\u0142o\u015bci mo\u017ce odnosi\u0107 si\u0119 do wielu plik\u00f3w, potencjalnie hierarchicznych.<\/p>\n","innerContent":["\n<p>Rzadko kiedy informuje o JEP-ach na tak wczesnym etapie, ale ten mi si\u0119 szczeg\u00f3lnie spodoba\u0142. \"Unified storage for application cache (aka \"new CDS workflow)\" ma na celu unifikacj\u0119 miejsca przechowywania danych pami\u0119ci podr\u0119cznej aplikacji, b\u0119d\u0105ce now\u0105 iteracj\u0105 mechanizmu Class-Data Sharing. Celem jest rozwini\u0119cie wykorzystania CDS, w tym momencie u\u017cywanego do przechowywania metadanych klas i obiekt\u00f3w sterty, aby mog\u0142o by\u0107 u\u017cywane jako cache dla szerszego zakresu typ\u00f3w danych, takich jak np. metody skompilowane AOT. Planowane jest r\u00f3wnie\u017c uporz\u0105dkowanie sposobu obs\u0142ugi CDS (kt\u00f3ry na przestrzeni lat rozwin\u0105\u0142 si\u0119 w spos\u00f3b ad hoc) poprzez wprowadzenie pojedynczej flag <code>-XX:CacheDataStore<\/code>, kt\u00f3ry okre\u015bla lokalizacj\u0119 magazynu. Pocz\u0105tkowo magazyn b\u0119dzie sk\u0142ada\u0142 si\u0119 z jednego pliku, ale w przysz\u0142o\u015bci mo\u017ce odnosi\u0107 si\u0119 do wielu plik\u00f3w, potencjalnie hierarchicznych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na razie to wszystko co wiemy na tym wczesnym etapie, wi\u0119c szczeg\u00f3\u0142y mog\u0105 si\u0119 jeszcze zmieni\u0107. W dalszym ci\u0105gu daje nam podgl\u0105d na to, w jaki spos\u00f3b w przysz\u0142o\u015bci b\u0119d\u0105 \u0142\u0105czy\u0107 si\u0119 r\u00f3\u017cne mechanizmy usprawniaj\u0105ce cold start aplikacji.<\/p>\n","innerContent":["\n<p>Na razie to wszystko co wiemy na tym wczesnym etapie, wi\u0119c szczeg\u00f3\u0142y mog\u0105 si\u0119 jeszcze zmieni\u0107. W dalszym ci\u0105gu daje nam podgl\u0105d na to, w jaki spos\u00f3b w przysz\u0142o\u015bci b\u0119d\u0105 \u0142\u0105czy\u0107 si\u0119 r\u00f3\u017cne mechanizmy usprawniaj\u0105ce cold start aplikacji.<\/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\/8326667\">JEP draft: Deprecate Non-Generational ZGC<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8326667\">JEP draft: Deprecate Non-Generational ZGC<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kontynuuj\u0105c temat draft\u00f3w, kolejna z ciekawych nowo\u015bci to \"Deprecate Non-Generational ZGC\". Dopiero co do ZGC wprowadzono Generacyjny wariant ZGC, a ju\u017c w tej chwili pojawiaj\u0105 si\u0119 plany na deprekacji wersji niegeneracyjnej, z zamiar usuni\u0119cia jej w przysz\u0142ych wydaniach. G\u0142\u00f3wnym celem jest redukcja koszt\u00f3w utrzymania oraz technicznego d\u0142ugu wynikaj\u0105cego z obs\u0142ugi dw\u00f3ch r\u00f3\u017cnych tryb\u00f3w dzia\u0142ania. Non-Generational ZGC, mimo \u017ce nie zostanie usuni\u0119ty w ramach tego JEP-u i pewnie zostanie z nami na d\u0142u\u017cej, to stanie si\u0119 tym mniej preferowanym trybem, gdy\u017c Generational ZGC, wprowadzony w JEP 439, jest postrzegany jako lepsze rozwi\u0105zanie w wi\u0119kszo\u015bci use cas\u00f3w.<\/p>\n","innerContent":["\n<p>Kontynuuj\u0105c temat draft\u00f3w, kolejna z ciekawych nowo\u015bci to \"Deprecate Non-Generational ZGC\". Dopiero co do ZGC wprowadzono Generacyjny wariant ZGC, a ju\u017c w tej chwili pojawiaj\u0105 si\u0119 plany na deprekacji wersji niegeneracyjnej, z zamiar usuni\u0119cia jej w przysz\u0142ych wydaniach. G\u0142\u00f3wnym celem jest redukcja koszt\u00f3w utrzymania oraz technicznego d\u0142ugu wynikaj\u0105cego z obs\u0142ugi dw\u00f3ch r\u00f3\u017cnych tryb\u00f3w dzia\u0142ania. Non-Generational ZGC, mimo \u017ce nie zostanie usuni\u0119ty w ramach tego JEP-u i pewnie zostanie z nami na d\u0142u\u017cej, to stanie si\u0119 tym mniej preferowanym trybem, gdy\u017c Generational ZGC, wprowadzony w JEP 439, jest postrzegany jako lepsze rozwi\u0105zanie w wi\u0119kszo\u015bci use cas\u00f3w.<\/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\/467\">JEP 467: Markdown Documentation Comments<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/467\">JEP 467: Markdown Documentation Comments<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 467 to za\u015b&nbsp;wreszcie JEP-kandydat, kt\u00f3rego celem jest umo\u017cliwienie pisania dokumentacji JavaDoc w Markdownie, zamiast wy\u0142\u0105cznie w mieszance HTML i tag\u00f3w JavaDoc. Powiedzmy sobie szczerze, Markdown od lat jest rozwi\u0105zaniem, kt\u00f3re kr\u00f3luje je\u015bli chodzi o tworzenie dokumentacji technicznej i de facto sta\u0142 si\u0119 standardem do tego stopnia, \u017ce w zasadzie ka\u017cde IDE czy Code Editor maj\u0105 do niego \u015bwietne wsparcie.<\/p>\n","innerContent":["\n<p>JEP 467 to za\u015b&nbsp;wreszcie JEP-kandydat, kt\u00f3rego celem jest umo\u017cliwienie pisania dokumentacji JavaDoc w Markdownie, zamiast wy\u0142\u0105cznie w mieszance HTML i tag\u00f3w JavaDoc. Powiedzmy sobie szczerze, Markdown od lat jest rozwi\u0105zaniem, kt\u00f3re kr\u00f3luje je\u015bli chodzi o tworzenie dokumentacji technicznej i de facto sta\u0142 si\u0119 standardem do tego stopnia, \u017ce w zasadzie ka\u017cde IDE czy Code Editor maj\u0105 do niego \u015bwietne wsparcie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17827,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-1024x417.png\" alt=\"\" class=\"wp-image-17827\"\/><figcaption class=\"wp-element-caption\">Behind the scenes: Tak naprawd\u0119, do nawet ten newsletter powstaje w Markdownie, i IA Writer. Dodatkow\u0105 ciekawostk\u0105 jest to, \u017ce pisz\u0119 w macierzystym j\u0119zyku i dopiero potem \"przechodz\u0119\" na angielski - taki flow mi najlepiej dzia\u0142a od lat.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-1-1024x417.png\" alt=\"\" class=\"wp-image-17827\"\/><figcaption class=\"wp-element-caption\">Behind the scenes: Tak naprawd\u0119, do nawet ten newsletter powstaje w Markdownie, i IA Writer. Dodatkow\u0105 ciekawostk\u0105 jest to, \u017ce pisz\u0119 w macierzystym j\u0119zyku i dopiero potem \"przechodz\u0119\" na angielski - taki flow mi najlepiej dzia\u0142a od lat.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Celem jest oczywi\u015bcie u\u0142atwienie pisania i czytania komentarzy API. Tworzenie dokumentacja to trudny, \u017cmudny proces niezale\u017cnie od wybranego markupu, a konieczno\u015b\u0107 stosowania HTML (ergo j\u0119zyka quasi-XML-owego), kt\u00f3ry jest mniej intuicyjny dla ludzi, nie pomaga. Ostatnimi czasy wida\u0107 trend, \u017ce i cz\u0119\u015bciej generowany z innych j\u0119zyk\u00f3w znacznik\u00f3w bardziej \"przyjaznych\" dla cz\u0142owieka. Markdown nie do\u015b\u0107 \u017ce jest popularnym j\u0119zykiem znacznik\u00f3w dla prostych dokument\u00f3w, \u0142atwym do czytania, tworzenia i przekszta\u0142cania w HTML, co czyni go idealnym wyborem dla komentarzy dokumentacyjnych, kt\u00f3re zazwyczaj nie s\u0105 skomplikowanymi dokumentami strukturalnymi... i chyba nie chcieliby\u015bmy, \u017ceby si\u0119 takimi sta\u0142y.<\/p>\n","innerContent":["\n<p>Celem jest oczywi\u015bcie u\u0142atwienie pisania i czytania komentarzy API. Tworzenie dokumentacja to trudny, \u017cmudny proces niezale\u017cnie od wybranego markupu, a konieczno\u015b\u0107 stosowania HTML (ergo j\u0119zyka quasi-XML-owego), kt\u00f3ry jest mniej intuicyjny dla ludzi, nie pomaga. Ostatnimi czasy wida\u0107 trend, \u017ce i cz\u0119\u015bciej generowany z innych j\u0119zyk\u00f3w znacznik\u00f3w bardziej \"przyjaznych\" dla cz\u0142owieka. Markdown nie do\u015b\u0107 \u017ce jest popularnym j\u0119zykiem znacznik\u00f3w dla prostych dokument\u00f3w, \u0142atwym do czytania, tworzenia i przekszta\u0142cania w HTML, co czyni go idealnym wyborem dla komentarzy dokumentacyjnych, kt\u00f3re zazwyczaj nie s\u0105 skomplikowanymi dokumentami strukturalnymi... i chyba nie chcieliby\u015bmy, \u017ceby si\u0119 takimi sta\u0142y.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17870,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-1024x405.png\" alt=\"\" class=\"wp-image-17870\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-10-1024x405.png\" alt=\"\" class=\"wp-image-17870\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak to ma dzia\u0142a\u015b w praktyce? Na przyk\u0142adzie komentarza dla metody <code>hashCode<\/code> mo\u017cna zauwa\u017cy\u0107 r\u00f3\u017cnic\u0119 w u\u017cyciu Markdown, gdzie linie zaczynaj\u0105 si\u0119 od <code>\/\/\/<\/code> zamiast tradycyjnego <code>\/** ... *\/<\/code>. HTML nie jest wymagany do wskazania przerwy akapitowej; wystarczy pusta linia. Elementy HTML takie jak <code>&lt;ul&gt;<\/code> i <code>&lt;li&gt;<\/code> s\u0105 zast\u0119powane przez znaczniki listy punktowanej Markdown, u\u017cywaj\u0105c <code>-<\/code> do wskazania pocz\u0105tku ka\u017cdego elementu listy. Zamiast <code>&lt;em&gt;<\/code>, u\u017cywa si\u0119 podkre\u015ble\u0144 (<code>_<\/code>) do wskazania zmiany czcionki, a instancje tagu <code>{@code ...}<\/code> s\u0105 zast\u0119powane przez znaki odwrotnego apostrofu (`) do wskazania czcionki o sta\u0142ej szeroko\u015bci.<\/p>\n","innerContent":["\n<p>Jak to ma dzia\u0142a\u015b w praktyce? Na przyk\u0142adzie komentarza dla metody <code>hashCode<\/code> mo\u017cna zauwa\u017cy\u0107 r\u00f3\u017cnic\u0119 w u\u017cyciu Markdown, gdzie linie zaczynaj\u0105 si\u0119 od <code>\/\/\/<\/code> zamiast tradycyjnego <code>\/** ... *\/<\/code>. HTML nie jest wymagany do wskazania przerwy akapitowej; wystarczy pusta linia. Elementy HTML takie jak <code>&lt;ul&gt;<\/code> i <code>&lt;li&gt;<\/code> s\u0105 zast\u0119powane przez znaczniki listy punktowanej Markdown, u\u017cywaj\u0105c <code>-<\/code> do wskazania pocz\u0105tku ka\u017cdego elementu listy. Zamiast <code>&lt;em&gt;<\/code>, u\u017cywa si\u0119 podkre\u015ble\u0144 (<code>_<\/code>) do wskazania zmiany czcionki, a instancje tagu <code>{@code ...}<\/code> s\u0105 zast\u0119powane przez znaki odwrotnego apostrofu (`) do wskazania czcionki o sta\u0142ej szeroko\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dawno chyba te\u017c \u017caden z JEP-\u00f3w nie by\u0142 tak mocno dyskutowany na <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1b1num5\/candidate_jep_467_markdown_documentation_comments\/\">redditcie<\/a>. Opinia spo\u0142eczno\u015bci poza og\u00f3lnym entuzjazmem (bo taki na pewno towarzyszy rozwi\u0105zaniu) ujawnia kilka g\u0142\u00f3wnych obaw. Po pierwsze, wielu uwa\u017ca wym\u00f3g stosowania trzech uko\u015bnik\u00f3w dla komentarzy dokumentacyjnych za niewygodny, sugeruj\u0105c pr\u00f3b\u0119 wypracowania jakiej\u015b bardziej zwi\u0119z\u0142ej notacji - i tu si\u0119 mocno podpisuje, cho\u0107 fakt, \u017ce wszystkie linie maj\u0105 taki sam prefix z drugiej strony wp\u0142ywa na czytelno\u015b\u0107. Dodatkowo, dyskusja porusza obawy dotycz\u0105ce d\u0142ugoterminowej \u017cywotno\u015bci i elastyczno\u015bci takiego wyboru sk\u0142adni (trzech slashy), zastanawiaj\u0105c si\u0119, co stanie si\u0119, je\u015bli nowy j\u0119zyk znacznik\u00f3w zyska na popularno\u015bci w przysz\u0142o\u015bci (w rozmow\u0119 zaanga\u017cowa\u0142 si\u0119 sam Ron Pressler). Wytykany jest te\u017c brak jakiej\u015b sensownej alternatywy dla tag\u00f3w JavaDoc, kt\u00f3re dalej musz\u0105 by\u0107 mieszane z Markdownem w swojej klasycznej formie. Mimo powy\u017cszego feedbacku, odbi\u00f3r jest pozytywny, a bior\u0105c pod uwag\u0119, \u017ce to ju\u017c kandydacki JEP, a nie np. Preview, to nie spodziewam si\u0119 ju\u017c jakich\u015b daleko id\u0105cych zmian.<\/p>\n","innerContent":["\n<p>Dawno chyba te\u017c \u017caden z JEP-\u00f3w nie by\u0142 tak mocno dyskutowany na <a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/1b1num5\/candidate_jep_467_markdown_documentation_comments\/\">redditcie<\/a>. Opinia spo\u0142eczno\u015bci poza og\u00f3lnym entuzjazmem (bo taki na pewno towarzyszy rozwi\u0105zaniu) ujawnia kilka g\u0142\u00f3wnych obaw. Po pierwsze, wielu uwa\u017ca wym\u00f3g stosowania trzech uko\u015bnik\u00f3w dla komentarzy dokumentacyjnych za niewygodny, sugeruj\u0105c pr\u00f3b\u0119 wypracowania jakiej\u015b bardziej zwi\u0119z\u0142ej notacji - i tu si\u0119 mocno podpisuje, cho\u0107 fakt, \u017ce wszystkie linie maj\u0105 taki sam prefix z drugiej strony wp\u0142ywa na czytelno\u015b\u0107. Dodatkowo, dyskusja porusza obawy dotycz\u0105ce d\u0142ugoterminowej \u017cywotno\u015bci i elastyczno\u015bci takiego wyboru sk\u0142adni (trzech slashy), zastanawiaj\u0105c si\u0119, co stanie si\u0119, je\u015bli nowy j\u0119zyk znacznik\u00f3w zyska na popularno\u015bci w przysz\u0142o\u015bci (w rozmow\u0119 zaanga\u017cowa\u0142 si\u0119 sam Ron Pressler). Wytykany jest te\u017c brak jakiej\u015b sensownej alternatywy dla tag\u00f3w JavaDoc, kt\u00f3re dalej musz\u0105 by\u0107 mieszane z Markdownem w swojej klasycznej formie. Mimo powy\u017cszego feedbacku, odbi\u00f3r jest pozytywny, a bior\u0105c pod uwag\u0119, \u017ce to ju\u017c kandydacki JEP, a nie np. Preview, to nie spodziewam si\u0119 ju\u017c jakich\u015b daleko id\u0105cych zmian.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17829,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2.png\" alt=\"\" class=\"wp-image-17829\"\/><figcaption class=\"wp-element-caption\">Jak ju\u017c wspomnia\u0142em, bardzo lubi\u0119 Markdowna i mam wra\u017cenie, \u017ce mo\u017cliwo\u015b\u0107 u\u017cywania go do pisania dokumentacji sprawi, \u017ce znaczenie mniej wpis\u00f3w b\u0119dzie jako TODO<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-2.png\" alt=\"\" class=\"wp-image-17829\"\/><figcaption class=\"wp-element-caption\">Jak ju\u017c wspomnia\u0142em, bardzo lubi\u0119 Markdowna i mam wra\u017cenie, \u017ce mo\u017cliwo\u015b\u0107 u\u017cywania go do pisania dokumentacji sprawi, \u017ce znaczenie mniej wpis\u00f3w b\u0119dzie jako TODO<\/figcaption><\/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. Triton - Kolejne podej\u015bcie do programowania na GPU z Project Babylon<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Triton - Kolejne podej\u015bcie do programowania na GPU z Project Babylon<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17831,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-17831\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-3-1024x585.png\" alt=\"\" class=\"wp-image-17831\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A teraz po raz kolejny w tym roku przygl\u0105dniemy si\u0119 projektowi Babylon. Niedawno bowiem ukaza\u0142a si\u0119 publikacja Paula Sandoza <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">Exploring Triton GPU programming for neural networks in Java<\/a>, czyli kolejna pr\u00f3ba wykorzystania Code Reflection do rozepchania si\u0119 \u0142okciami w przestrzeni oko\u0142o-AI.<\/p>\n","innerContent":["\n<p>A teraz po raz kolejny w tym roku przygl\u0105dniemy si\u0119 projektowi Babylon. Niedawno bowiem ukaza\u0142a si\u0119 publikacja Paula Sandoza <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">Exploring Triton GPU programming for neural networks in Java<\/a>, czyli kolejna pr\u00f3ba wykorzystania Code Reflection do rozepchania si\u0119 \u0142okciami w przestrzeni oko\u0142o-AI.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Triton to domenowy model programowania i kompilator, kt\u00f3ry umo\u017cliwia programistom pisz\u0105cym w Pythonie tworzenie kodu dzia\u0142aj\u0105cego na procesorach GPU, nawet tym maj\u0105cy niewielkie do\u015bwiadczenie w pracy z GPU i j\u0119zykami programowania specyficznymi dla GPU, takimi jak CUDA. Ukrywa on bowiem przed programistami bazuj\u0105cy na w\u0105tkach model programowania CUDA, co pozwala kompilatorowi Triton lepiej wykorzysta\u0107 sprz\u0119t GPU, na przyk\u0142ad poprzez optymalizacj\u0119 przypadk\u00f3w, kt\u00f3re mog\u0142yby inaczej wymaga\u0107 jawnej synchronizacji. Dodatkowo, dzi\u0119ki abstrakcji Tritona programi\u015bci operuj\u0105 na tensorach zamiast skalarnych warto\u015bci, co znacz\u0105co upraszcza i przyspiesza proces tworzenia kodu na GPU.<\/p>\n","innerContent":["\n<p>Triton to domenowy model programowania i kompilator, kt\u00f3ry umo\u017cliwia programistom pisz\u0105cym w Pythonie tworzenie kodu dzia\u0142aj\u0105cego na procesorach GPU, nawet tym maj\u0105cy niewielkie do\u015bwiadczenie w pracy z GPU i j\u0119zykami programowania specyficznymi dla GPU, takimi jak CUDA. Ukrywa on bowiem przed programistami bazuj\u0105cy na w\u0105tkach model programowania CUDA, co pozwala kompilatorowi Triton lepiej wykorzysta\u0107 sprz\u0119t GPU, na przyk\u0142ad poprzez optymalizacj\u0119 przypadk\u00f3w, kt\u00f3re mog\u0142yby inaczej wymaga\u0107 jawnej synchronizacji. Dodatkowo, dzi\u0119ki abstrakcji Tritona programi\u015bci operuj\u0105 na tensorach zamiast skalarnych warto\u015bci, co znacz\u0105co upraszcza i przyspiesza proces tworzenia kodu na GPU.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Triton dzia\u0142a jednak z Pythonem, ale i dla Javy okienko transferowe na wykorzystania modelu programowania Triton otwiera si\u0119 dzi\u0119ki Code Reflection, rozwijanej w ramach Project Babylon. Dla przypomnienia Refleksja kodu pozwala na symboliczne reprezentowanie program\u00f3w Java, co umo\u017cliwia ich analiz\u0119 i automatyczn\u0105 transformacj\u0119 na model kodu Triton. Dzi\u0119ki temu programy napisane w Javie mog\u0105 by\u0107 kompilowane do kodu dzia\u0142aj\u0105cego na GPU, podobnie jak to ma miejsce w przypadku Pythona z u\u017cyciem Tritona. Projekt Babylon w tym kontek\u015bcie dzia\u0142a jako most mi\u0119dzy Jav\u0105, a specyficznymi rozwi\u0105zaniami pod GPU, otwieraj\u0105c programistom drzwi do \u015bwiata programowania GPU z wszystkimi jego korzy\u015bciami, takimi jak rozszerzone mo\u017cliwo\u015bci oblicze\u0144 r\u00f3wnoleg\u0142ych w du\u017cej skali.<\/p>\n","innerContent":["\n<p>Triton dzia\u0142a jednak z Pythonem, ale i dla Javy okienko transferowe na wykorzystania modelu programowania Triton otwiera si\u0119 dzi\u0119ki Code Reflection, rozwijanej w ramach Project Babylon. Dla przypomnienia Refleksja kodu pozwala na symboliczne reprezentowanie program\u00f3w Java, co umo\u017cliwia ich analiz\u0119 i automatyczn\u0105 transformacj\u0119 na model kodu Triton. Dzi\u0119ki temu programy napisane w Javie mog\u0105 by\u0107 kompilowane do kodu dzia\u0142aj\u0105cego na GPU, podobnie jak to ma miejsce w przypadku Pythona z u\u017cyciem Tritona. Projekt Babylon w tym kontek\u015bcie dzia\u0142a jako most mi\u0119dzy Jav\u0105, a specyficznymi rozwi\u0105zaniami pod GPU, otwieraj\u0105c programistom drzwi do \u015bwiata programowania GPU z wszystkimi jego korzy\u015bciami, takimi jak rozszerzone mo\u017cliwo\u015bci oblicze\u0144 r\u00f3wnoleg\u0142ych w du\u017cej skali.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na poziomie technicznym, proces ten zaczyna si\u0119 od utworzenia modelu kodu Java za pomoc\u0105 refleksji kodu, kt\u00f3ry nast\u0119pnie jest analizowany i transformowany w model kodu Triton. W tym procesie nast\u0119puje przypisanie odpowiednich typ\u00f3w do element\u00f3w modelu, co umo\u017cliwia dok\u0142adn\u0105 transformacj\u0119 kodu Java na kod odpowiedni dla GPU, aby wyprodukowa\u0107 form\u0119 podobn\u0105 do Triton MLIR.<\/p>\n","innerContent":["\n<p>Na poziomie technicznym, proces ten zaczyna si\u0119 od utworzenia modelu kodu Java za pomoc\u0105 refleksji kodu, kt\u00f3ry nast\u0119pnie jest analizowany i transformowany w model kodu Triton. W tym procesie nast\u0119puje przypisanie odpowiednich typ\u00f3w do element\u00f3w modelu, co umo\u017cliwia dok\u0142adn\u0105 transformacj\u0119 kodu Java na kod odpowiedni dla GPU, aby wyprodukowa\u0107 form\u0119 podobn\u0105 do Triton MLIR.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17833,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-4.png\" alt=\"\" class=\"wp-image-17833\"\/><figcaption class=\"wp-element-caption\">Nasze karty graficzne nie wiedzia\u0142y, jak mia\u0142y dobrze<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-4.png\" alt=\"\" class=\"wp-image-17833\"\/><figcaption class=\"wp-element-caption\">Nasze karty graficzne nie wiedzia\u0142y, jak mia\u0142y dobrze<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli jeste\u015bcie ciekawi dodatkowych detali, w artykule pojawiaj\u0105 si\u0119 przyk\u0142ady, gdzie na przyk\u0142adzie dodawania wektor\u00f3w pokazano, jak implementacja w Javie mo\u017ce by\u0107 zbli\u017cona do Pythonowej, mimo np. braku przeci\u0105\u017cania operator\u00f3w w Javie. Wi\u0119cej szczeg\u00f3\u0142\u00f3w znajdziecie w <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">oryginalnej publikacji<\/a>.<\/p>\n","innerContent":["\n<p>Je\u015bli jeste\u015bcie ciekawi dodatkowych detali, w artykule pojawiaj\u0105 si\u0119 przyk\u0142ady, gdzie na przyk\u0142adzie dodawania wektor\u00f3w pokazano, jak implementacja w Javie mo\u017ce by\u0107 zbli\u017cona do Pythonowej, mimo np. braku przeci\u0105\u017cania operator\u00f3w w Javie. Wi\u0119cej szczeg\u00f3\u0142\u00f3w znajdziecie w <a href=\"https:\/\/openjdk.org\/projects\/babylon\/articles\/triton\">oryginalnej publikacji<\/a>.<\/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":{"id":17835,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-17835\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-5-1024x585.png\" alt=\"\" class=\"wp-image-17835\"\/><\/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:\/\/quarkus.io\/blog\/quarkus-3-8-released\/\">Quarkus 3.8<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/quarkus.io\/blog\/quarkus-3-8-released\/\">Quarkus 3.8<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zacznijmy sobie od Ma\u0142yc-Du\u017cych zmian w Quarkusie. Wersja 3.8 zosta\u0142 og\u0142oszony now\u0105 wersj\u0105 Long-Term Support (LTS). A czemu Ma\u0142o-Du\u017ce? Nowa wersja to bezpo\u015brednio kontynuuje ga\u0142\u0105\u017a 3.7 i tym samym nie zawiera \u017cadnych nowych funkcji wychodz\u0105cych poza 3.7, co najwy\u017cej zawiera kilka dodatkowych poprawek, w\u015br\u00f3d kt\u00f3rych warto wymieni\u0107 zaadresowanie CVE-2024-1597 zwi\u0105zanego z sterownikiem JDBC PostgreSQL. Je\u015bli jednak dalej pozostajecie na ostatnim LTS, kt\u00f3rym by\u0142a jeszcze wersja 3.2, to nowe wydanie b\u0119dzie dla Was sporym przeskokiem - ulepszenia OpenTelemetry, wsparcie dla Java 21 (plus minimalna wspierana nowa wersja to teraz JDK 17), wsparcie dla OpenIDConnect i sporo innych usprawnie\u0144.<\/p>\n","innerContent":["\n<p>Zacznijmy sobie od Ma\u0142yc-Du\u017cych zmian w Quarkusie. Wersja 3.8 zosta\u0142 og\u0142oszony now\u0105 wersj\u0105 Long-Term Support (LTS). A czemu Ma\u0142o-Du\u017ce? Nowa wersja to bezpo\u015brednio kontynuuje ga\u0142\u0105\u017a 3.7 i tym samym nie zawiera \u017cadnych nowych funkcji wychodz\u0105cych poza 3.7, co najwy\u017cej zawiera kilka dodatkowych poprawek, w\u015br\u00f3d kt\u00f3rych warto wymieni\u0107 zaadresowanie CVE-2024-1597 zwi\u0105zanego z sterownikiem JDBC PostgreSQL. Je\u015bli jednak dalej pozostajecie na ostatnim LTS, kt\u00f3rym by\u0142a jeszcze wersja 3.2, to nowe wydanie b\u0119dzie dla Was sporym przeskokiem - ulepszenia OpenTelemetry, wsparcie dla Java 21 (plus minimalna wspierana nowa wersja to teraz JDK 17), wsparcie dla OpenIDConnect i sporo innych usprawnie\u0144.<\/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:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Scala 3.4.0<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Scala 3.4.0<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pawe\u0142 Marks z VirtusLab poinformowa\u0142  o wydaniu nowej wersji Scali - Scala 3.4. W\u015br\u00f3d najwa\u017cniejszych nowo\u015bci w nowym wydaniu z pewno\u015bci\u0105 nale\u017cy wymieni\u0107 stabilizacje wa\u017cnych SIP-\u00f3w:<\/p>\n","innerContent":["\n<p>Pawe\u0142 Marks z VirtusLab poinformowa\u0142  o wydaniu nowej wersji Scali - Scala 3.4. W\u015br\u00f3d najwa\u017cniejszych nowo\u015bci w nowym wydaniu z pewno\u015bci\u0105 nale\u017cy wymieni\u0107 stabilizacje wa\u017cnych SIP-\u00f3w:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>SIP-54 - upraszczaj\u0105cy importowanie Extension Methods z r\u00f3\u017cnych \u017ar\u00f3de\u0142<\/li>\n","innerContent":["\n<li>SIP-54 - upraszczaj\u0105cy importowanie Extension Methods z r\u00f3\u017cnych \u017ar\u00f3de\u0142<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>SIP-53 - zwi\u0119kszaj\u0105cy ekspresyjno\u015b\u0107 wzorc\u00f3w typ\u00f3w.<\/li>\n","innerContent":["\n<li>SIP-53 - zwi\u0119kszaj\u0105cy ekspresyjno\u015b\u0107 wzorc\u00f3w typ\u00f3w.<\/li>\n"]},{"blockName":"core\/list-item","attrs":[],"innerBlocks":[],"innerHTML":"\n<li>SIP-56 - usprawniaj\u0105cy inferencje typ\u00f3w, szczeg\u00f3lnie dla funkcji takich jak <code>fold<\/code>.<\/li>\n","innerContent":["\n<li>SIP-56 - usprawniaj\u0105cy inferencje typ\u00f3w, szczeg\u00f3lnie dla funkcji takich jak <code>fold<\/code>.<\/li>\n"]}],"innerHTML":"\n<ul>\n\n\n\n<\/ul>\n","innerContent":["\n<ul>",null,"\n\n",null,"\n\n",null,"<\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co wi\u0119cej, Scala 3.4.0 wprowadza ulepszenia w backendzie, optymalizuj\u0105c polimorficzne lambdy przez wykorzystanie lambd pochodz\u0105cych z JVM, co uniezale\u017cnia Scal\u0119 od anonimowych klas. Nowa wersja ulepsza te\u017c raportowanie b\u0142\u0119d\u00f3w, w tym bardziej informacyjne komunikaty dla niekompatybilnych wersji TASTy. <\/p>\n","innerContent":["\n<p>Co wi\u0119cej, Scala 3.4.0 wprowadza ulepszenia w backendzie, optymalizuj\u0105c polimorficzne lambdy przez wykorzystanie lambd pochodz\u0105cych z JVM, co uniezale\u017cnia Scal\u0119 od anonimowych klas. Nowa wersja ulepsza te\u017c raportowanie b\u0142\u0119d\u00f3w, w tym bardziej informacyjne komunikaty dla niekompatybilnych wersji TASTy. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":17841,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-1024x456.png\" alt=\"\" class=\"wp-image-17841\"\/><figcaption class=\"wp-element-caption\">Ciekawostka: Oficjalne repozytorium Dotty'ego, czyli nowej wersji kompilatora Scali te\u017c zosta\u0142o przemianowane na Scala3<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-7-1024x456.png\" alt=\"\" class=\"wp-image-17841\"\/><figcaption class=\"wp-element-caption\">Ciekawostka: Oficjalne repozytorium Dotty'ego, czyli nowej wersji kompilatora Scali te\u017c zosta\u0142o przemianowane na Scala3<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Scala 3.4.0 wprowadza te\u017c eksperymentaln\u0105 adnotacj\u0119 <code>@publicInBinary<\/code>, kt\u00f3ra umo\u017cliwia oznaczanie niekt\u00f3rych definicji jako cz\u0119\u015bci API binarnego. Wersja deprecjonuje te\u017c nieaktualne konstrukty, takie jak wildcardy typ\u00f3w <code>_<\/code> i <code>private[this]<\/code> (oraz kilka innych), na rzecz nowocze\u015bniejszych i bardziej zwi\u0119z\u0142ych alternatyw. Og\u00f3lnie zach\u0119cam zajrze\u0107 do oryginalnych <a href=\"https:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Release Notes<\/a>, gdy\u017c ciekawych detali dla u\u017cytkownik\u00f3w Scali jest tam wi\u0119cej.<\/p>\n","innerContent":["\n<p>Scala 3.4.0 wprowadza te\u017c eksperymentaln\u0105 adnotacj\u0119 <code>@publicInBinary<\/code>, kt\u00f3ra umo\u017cliwia oznaczanie niekt\u00f3rych definicji jako cz\u0119\u015bci API binarnego. Wersja deprecjonuje te\u017c nieaktualne konstrukty, takie jak wildcardy typ\u00f3w <code>_<\/code> i <code>private[this]<\/code> (oraz kilka innych), na rzecz nowocze\u015bniejszych i bardziej zwi\u0119z\u0142ych alternatyw. Og\u00f3lnie zach\u0119cam zajrze\u0107 do oryginalnych <a href=\"https:\/\/www.scala-lang.org\/blog\/2024\/02\/29\/scala-3.4.0-and-3.3.3-released.html\">Release Notes<\/a>, gdy\u017c ciekawych detali dla u\u017cytkownik\u00f3w Scali jest tam wi\u0119cej.<\/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:\/\/jstach.io\/doc\/rainbowgum\/current\/apidocs\/\">Rainbow Gum<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/jstach.io\/doc\/rainbowgum\/current\/apidocs\/\">Rainbow Gum<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A teraz mam prawdziw\u0105 ciekawostk\u0119 od tw\u00f3rc\u00f3w <a href=\"https:\/\/github.com\/jstachio\/jstachio\">jstachio<\/a>, frameworku b\u0119d\u0105cego opisywanym ju\u017c tu kiedy\u015b systemem templatingu w Javie opartym o <a href=\"https:\/\/github.com\/mustache\">mustache<\/a>. Rainbow Gum bierze sobie bowiem za cel poradzi\u0107 sobie z\u0142o\u017cono\u015b\u0107 i nieefektywno\u015b\u0107 obecnych framework\u00f3w logowania w Javie, zw\u0142aszcza w kontek\u015bcie aplikacji z bardzo szybkim startem. Tradycyjne frameworki logowania takie jak Log4J 2 i Logback s\u0105 nie tylko obci\u0105\u017cone funkcjami, kt\u00f3re mog\u0105 nie by\u0107 niezb\u0119dne dla wszystkich aplikacji, ale tak\u017ce polegaj\u0105 na zewn\u0119trznych plikach konfiguracyjnych, kt\u00f3re mog\u0105 spowalnia\u0107 inicjalizacj\u0119 aplikacji i zwi\u0119ksza\u0107 ryzyko bezpiecze\u0144stwa, jak pokaza\u0142a podatno\u015b\u0107 Log4Shell.<\/p>\n","innerContent":["\n<p>A teraz mam prawdziw\u0105 ciekawostk\u0119 od tw\u00f3rc\u00f3w <a href=\"https:\/\/github.com\/jstachio\/jstachio\">jstachio<\/a>, frameworku b\u0119d\u0105cego opisywanym ju\u017c tu kiedy\u015b systemem templatingu w Javie opartym o <a href=\"https:\/\/github.com\/mustache\">mustache<\/a>. Rainbow Gum bierze sobie bowiem za cel poradzi\u0107 sobie z\u0142o\u017cono\u015b\u0107 i nieefektywno\u015b\u0107 obecnych framework\u00f3w logowania w Javie, zw\u0142aszcza w kontek\u015bcie aplikacji z bardzo szybkim startem. Tradycyjne frameworki logowania takie jak Log4J 2 i Logback s\u0105 nie tylko obci\u0105\u017cone funkcjami, kt\u00f3re mog\u0105 nie by\u0107 niezb\u0119dne dla wszystkich aplikacji, ale tak\u017ce polegaj\u0105 na zewn\u0119trznych plikach konfiguracyjnych, kt\u00f3re mog\u0105 spowalnia\u0107 inicjalizacj\u0119 aplikacji i zwi\u0119ksza\u0107 ryzyko bezpiecze\u0144stwa, jak pokaza\u0142a podatno\u015b\u0107 Log4Shell.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17837,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-6.png\" alt=\"\" class=\"wp-image-17837\"\/><figcaption class=\"wp-element-caption\">Log4Shell - pami\u0119tamy!<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-6.png\" alt=\"\" class=\"wp-image-17837\"\/><figcaption class=\"wp-element-caption\">Log4Shell - pami\u0119tamy!<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tworzy to potrzeb\u0119 bardziej uproszczonego, prekonfigurowanego rozwi\u0105zania do logowania, kt\u00f3re nie maj\u0105c na karku wielu lat rozwoju mo\u017ce szybko dostosowa\u0107 si\u0119 do nowych funkcji Javy i mnogo\u015bci \u015brodowisk uruchomieniowych.<\/p>\n","innerContent":["\n<p>Tworzy to potrzeb\u0119 bardziej uproszczonego, prekonfigurowanego rozwi\u0105zania do logowania, kt\u00f3re nie maj\u0105c na karku wielu lat rozwoju mo\u017ce szybko dostosowa\u0107 si\u0119 do nowych funkcji Javy i mnogo\u015bci \u015brodowisk uruchomieniowych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Rainbow Gum to w\u0142a\u015bnie taka lekka implementacja SLF4J dla JDK 21+, kt\u00f3ra ma na celu by\u0107 \u0142atwiejsz\u0105 w u\u017cyciu, wykorzystuj\u0105c przy tym nowsze technologie JDK. Rainbow Gum nie oferuje tyle elastyczno\u015bci co Logbacka czy Log4J, ale upraszcza konfiguracj\u0119 i inicjalizacj\u0119. Rainbow Gum jest zaprojektowany tak, by by\u0107 przyjaznym dla kompilacji natywnych Graal VM. Umo\u017cliwiaj\u0105c konfigurowanie ca\u0142o\u015bci za pomoc\u0105 kodu aplikacji, Rainbow Gum pozwala programistom wykorzystywa\u0107 unika\u0107 pu\u0142apek zwi\u0105zanych z zewn\u0119trznymi plikami konfiguracyjnymi, prowadz\u0105c do szybszego startu aplikacji i zmniejszenia przestrzeni na podatno\u015bci. <\/p>\n","innerContent":["\n<p>Rainbow Gum to w\u0142a\u015bnie taka lekka implementacja SLF4J dla JDK 21+, kt\u00f3ra ma na celu by\u0107 \u0142atwiejsz\u0105 w u\u017cyciu, wykorzystuj\u0105c przy tym nowsze technologie JDK. Rainbow Gum nie oferuje tyle elastyczno\u015bci co Logbacka czy Log4J, ale upraszcza konfiguracj\u0119 i inicjalizacj\u0119. Rainbow Gum jest zaprojektowany tak, by by\u0107 przyjaznym dla kompilacji natywnych Graal VM. Umo\u017cliwiaj\u0105c konfigurowanie ca\u0142o\u015bci za pomoc\u0105 kodu aplikacji, Rainbow Gum pozwala programistom wykorzystywa\u0107 unika\u0107 pu\u0142apek zwi\u0105zanych z zewn\u0119trznymi plikami konfiguracyjnymi, prowadz\u0105c do szybszego startu aplikacji i zmniejszenia przestrzeni na podatno\u015bci. <\/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>public class GettingStartedExample implements RainbowGumProvider {\n\n    @Override\n    public Optional&lt;RainbowGum&gt; provide(LogConfig config) {\n\treturn RainbowGum.builder(config)\n\t    .route(r -&gt; {\n\t\tr.level(Level.DEBUG, \"com.myapp\");\n\t        r.appender(\"console\", a -&gt; {\n\t            a.encoder(new PatternEncoderBuilder(\"console\")\n\t\t     .pattern(\"&#91;%thread] %-5level %logger{15} - %msg%n\")\n\t\t     .fromProperties(config.properties())\n\t\t     .build());\n\t\t});\n\t    }) \n\t    .optional();\n   }\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>public class GettingStartedExample implements RainbowGumProvider {\n\n    @Override\n    public Optional&lt;RainbowGum&gt; provide(LogConfig config) {\n\treturn RainbowGum.builder(config)\n\t    .route(r -&gt; {\n\t\tr.level(Level.DEBUG, \"com.myapp\");\n\t        r.appender(\"console\", a -&gt; {\n\t            a.encoder(new PatternEncoderBuilder(\"console\")\n\t\t     .pattern(\"&#91;%thread] %-5level %logger{15} - %msg%n\")\n\t\t     .fromProperties(config.properties())\n\t\t     .build());\n\t\t});\n\t    }) \n\t    .optional();\n   }\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jego projekt jest celowo modularny i minimalistyczny, r\u00f3wnocze\u015bnie wspieraj\u0105 do\u015b\u0107 zaawansowane funkcje jak kolorowane log\u00f3w i czy wsparcie dla JSON.<\/p>\n","innerContent":["\n<p>Jego projekt jest celowo modularny i minimalistyczny, r\u00f3wnocze\u015bnie wspieraj\u0105 do\u015b\u0107 zaawansowane funkcje jak kolorowane log\u00f3w i czy wsparcie dla JSON.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ciekawe, czy Rainbow Gum to zapowied\u017a jakiego\u015b nowego trendu bibliotek opytmlizowanych pod specyfik\u0119 u\u017cycia z GraalVM.<\/p>\n","innerContent":["\n<p>Ciekawe, czy Rainbow Gum to zapowied\u017a jakiego\u015b nowego trendu bibliotek opytmlizowanych pod specyfik\u0119 u\u017cycia z GraalVM.<\/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:\/\/poiu-de.github.io\/coat\/\">Coat<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/poiu-de.github.io\/coat\/\">Coat<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec Coat, kt\u00f3ry jest kolejnym z przedstawicielem mojej ulubionej kategorii ma\u0142ych bibliotek, odpowiadaj\u0105cych na konkretny problem. Ten kt\u00f3ry rozwi\u0105zuje Coat polega na potrzebie efektywnego i \"typesafe\" zarz\u0105dzania danymi konfiguracyjnymi. Tradycyjnie, odczytywanie i integrowanie takowych za aplikacj\u0105 wi\u0105\u017ce si\u0119 z r\u0119cznym parsowaniem, walidacj\u0105 i konwersj\u0105 na potrzebne struktury, co jest podatne na b\u0142\u0119dy i uci\u0105\u017cliwe. Manualno\u015b\u0107 procesu zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w i niesp\u00f3jno\u015bci, szczeg\u00f3lnie w z\u0142o\u017conych aplikacjach, gdzie konfiguracja cz\u0119sto si\u0119 zmienia lub wymagana jest jej walidacja wed\u0142ug konkretnych kryteri\u00f3w. Dodatkowo, programi\u015bci cz\u0119sto musz\u0105 pisa\u0107 specjalne mappery, aby zapewni\u0107, \u017ce warto\u015bci konfiguracyjne odpowiadaj\u0105 oczekiwanym typom.<\/p>\n","innerContent":["\n<p>A na koniec Coat, kt\u00f3ry jest kolejnym z przedstawicielem mojej ulubionej kategorii ma\u0142ych bibliotek, odpowiadaj\u0105cych na konkretny problem. Ten kt\u00f3ry rozwi\u0105zuje Coat polega na potrzebie efektywnego i \"typesafe\" zarz\u0105dzania danymi konfiguracyjnymi. Tradycyjnie, odczytywanie i integrowanie takowych za aplikacj\u0105 wi\u0105\u017ce si\u0119 z r\u0119cznym parsowaniem, walidacj\u0105 i konwersj\u0105 na potrzebne struktury, co jest podatne na b\u0142\u0119dy i uci\u0105\u017cliwe. Manualno\u015b\u0107 procesu zwi\u0119ksza ryzyko b\u0142\u0119d\u00f3w i niesp\u00f3jno\u015bci, szczeg\u00f3lnie w z\u0142o\u017conych aplikacjach, gdzie konfiguracja cz\u0119sto si\u0119 zmienia lub wymagana jest jej walidacja wed\u0142ug konkretnych kryteri\u00f3w. Dodatkowo, programi\u015bci cz\u0119sto musz\u0105 pisa\u0107 specjalne mappery, aby zapewni\u0107, \u017ce warto\u015bci konfiguracyjne odpowiadaj\u0105 oczekiwanym typom.<\/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>@Coat.Confg(converters = {\n  UuidConverter.class,\n  CurrencyConverter.class,\n})\npublic interface AppConfig {\n  public UUID uuid();\n  public Currency currency();\n}\n\nfinal AppConfig config = new ImmutableMyConfig(new File(\"\/path\/to\/config.properties\"));\n\ntry {\n  config.validate();\n} catch (final ConfigValidationException ex) {\n  System.err.println(\"Error in config file:\\n\" + ex.getValidationResult().toString());\n  System.exit(1);\n}\n\nfinal UUID appName= config.uuid();\nfinal Currency currency= config.currency();<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>@Coat.Confg(converters = {\n  UuidConverter.class,\n  CurrencyConverter.class,\n})\npublic interface AppConfig {\n  public UUID uuid();\n  public Currency currency();\n}\n\nfinal AppConfig config = new ImmutableMyConfig(new File(\"\/path\/to\/config.properties\"));\n\ntry {\n  config.validate();\n} catch (final ConfigValidationException ex) {\n  System.err.println(\"Error in config file:\\n\" + ex.getValidationResult().toString());\n  System.exit(1);\n}\n\nfinal UUID appName= config.uuid();\nfinal Currency currency= config.currency();<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Coat oferuje rozwi\u0105zanie powy\u017cszych problem\u00f3w poprzez sw\u00f3j procesor adnotacji, kt\u00f3ry generuje klasy do odczytywania warto\u015bci konfiguracyjnych do typowanych obiekt\u00f3w. Poprzez zdefiniowanie interfejsu z oczekiwan\u0105 struktur\u0105 danych konfiguracji i u\u017cyciu odpowiedniej adnotacji, Coat automatycznie tworzy konkretne implementacje.<\/p>\n","innerContent":["\n<p>Coat oferuje rozwi\u0105zanie powy\u017cszych problem\u00f3w poprzez sw\u00f3j procesor adnotacji, kt\u00f3ry generuje klasy do odczytywania warto\u015bci konfiguracyjnych do typowanych obiekt\u00f3w. Poprzez zdefiniowanie interfejsu z oczekiwan\u0105 struktur\u0105 danych konfiguracji i u\u017cyciu odpowiedniej adnotacji, Coat automatycznie tworzy konkretne implementacje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Obs\u0142uguj\u0105 parsowanie, walidacj\u0119 i konwersj\u0119 typ\u00f3w warto\u015bci konfiguracyjnych. Coat, nie wymaga runtime'owych zale\u017cno\u015bci i obs\u0142uguje Java 11 lub wy\u017csz\u0105.<\/p>\n","innerContent":["\n<p>Obs\u0142uguj\u0105 parsowanie, walidacj\u0119 i konwersj\u0119 typ\u00f3w warto\u015bci konfiguracyjnych. Coat, nie wymaga runtime'owych zale\u017cno\u015bci i obs\u0142uguje Java 11 lub wy\u017csz\u0105.<\/p>\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>A na ko\u0144cu podziel\u0119 si\u0119 nowym hobby!<\/p>\n","innerContent":["\n<p>A na ko\u0144cu podziel\u0119 si\u0119 nowym hobby!<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Bo kiedy \u015bwiat gra w Final Fantasy VII Rebirth, a ty nie grasz, bo zajmujesz si\u0119 trzyletni\u0105 c\u00f3rk\u0105 chora na zapalenie p\u0142uc i ona m\u00f3wi: \"Tato, zr\u00f3bmy co\u015b z gliny.\"...<\/p>\n","innerContent":["\n<p>Bo kiedy \u015bwiat gra w Final Fantasy VII Rebirth, a ty nie grasz, bo zajmujesz si\u0119 trzyletni\u0105 c\u00f3rk\u0105 chora na zapalenie p\u0142uc i ona m\u00f3wi: \"Tato, zr\u00f3bmy co\u015b z gliny.\"...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17846,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-8.png\" alt=\"\" class=\"wp-image-17846\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/03\/image-8.png\" alt=\"\" class=\"wp-image-17846\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>...w\u0142\u0105cza si\u0119 wtedy kreatywno\u015b\u0107.<\/p>\n","innerContent":["\n<p>...w\u0142\u0105cza si\u0119 wtedy kreatywno\u015b\u0107.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17824","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=17824"}],"version-history":[{"count":12,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17824\/revisions"}],"predecessor-version":[{"id":17872,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17824\/revisions\/17872"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17848"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}