{"id":16857,"date":"2023-10-11T11:24:13","date_gmt":"2023-10-11T09:24:13","guid":{"rendered":"https:\/\/vived.io\/?p=16857"},"modified":"2023-10-11T11:25:12","modified_gmt":"2023-10-11T09:25:12","slug":"pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/","title":{"rendered":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali &#8211; JVM Weekly 151"},"content":{"rendered":"\n<h2 id=\"1-pierwszy-zestaw-nowych-jep-ow-po-premierze-jdk-21\" data-num=1>1. Pierwszy zestaw nowych JEP-\u00f3w po premierze JDK 21.<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/455\">JEP 455: Primitive types in Patterns, instanceof, and switch (Preview)<\/a><\/h3>\n\n\n\n<p>Ten JEP jest&#8230; zaskakuj\u0105co skomplikowany &#8211; ale mog\u0142em si\u0119 tego spodziewa\u0107, przecie\u017c dotyczy to typ\u00f3w prymitywnych, a to zawsze komplikuje. Dlatego pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem.<\/p>\n\n\n\n<p>Aktualnie, u\u017cycie wzorc\u00f3w typ\u00f3w prymitywnych w Javie wi\u0105\u017ce si\u0119 z ograniczeniami. Na przyk\u0142ad, chocia\u017c mo\u017cemy modelowa\u0107 dokumenty JSON przy u\u017cyciu rekord\u00f3w (jak w poni\u017cszym kodzie), mamy ograniczenie w zakresie zagnie\u017cd\u017conych wzorc\u00f3w typ\u00f3w prymitywnych:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(&quot;age&quot;) instanceof JsonNumber(double age))\n{\n    return new Customer(name, (int)age); \n}<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym fragmencie, chocia\u017c oczekujemy, \u017ce warto\u015b\u0107 &#8222;age&#8221; b\u0119dzie zawsze <code>int<\/code>, mo\u017cemy jedynie ekstrahowa\u0107 warto\u015b\u0107 <code>double<\/code> i musimy polega\u0107 na manualnej konwersji (cast) do <code>int<\/code>. Problem wynika z tego, jak JSON reprezentuje liczby oraz jak wiele bibliotek do obs\u0142ugi JSON w Javie je potem interpretuje.<\/p>\n\n\n\n<p>JSON nie rozr\u00f3\u017cnia pomi\u0119dzy r\u00f3\u017cnymi typami liczbowymi. W standardzie JSON wszystkie liczby s\u0105 zapisywane jako liczby zmiennoprzecinkowe. Oznacza to, \u017ce kiedy mamy warto\u015b\u0107 &#8222;age&#8221;: 25 w dokumencie JSON, ta warto\u015b\u0107 jest interpretowana jako liczba zmiennoprzecinkowa, mimo \u017ce mo\u017ce reprezentowa\u0107 wiek jako warto\u015b\u0107 ca\u0142kowita.<\/p>\n\n\n\n<p>Gdy Java odczytuje warto\u015b\u0107 z JSON, wiele bibliotek (na przyk\u0142ad <code>javax.json<\/code>, <code>org.json<\/code> itp.) interpretuje wszystkie liczby jako <code>double<\/code>, poniewa\u017c <code>double<\/code> mo\u017ce reprezentowa\u0107 zar\u00f3wno liczby ca\u0142kowite, jak i zmiennoprzecinkowe.<\/p>\n\n\n\n<p>Dlatego w powy\u017cszym przyk\u0142adzie, kiedy pr\u00f3bujesz dopasowa\u0107 warto\u015b\u0107 &#8222;age&#8221; do wzorca <code>JsonNumber<\/code>, warto\u015b\u0107 jest dost\u0119pna jako <code>double<\/code> &#8211; jest najbardziej og\u00f3lny spos\u00f3b reprezentowania liczb zmiennoprzecinkowych w Javie. Je\u015bli chcesz uzyska\u0107 warto\u015b\u0107 jako <code>int<\/code>, musisz jawnie j\u0105 rzutowa\u0107 (i potencjalnie akceptowa\u0107 ryzyko utraty precyzji w przypadku liczb, kt\u00f3re nie pasuj\u0105 dok\u0142adnie do zakresu <code>int<\/code>).<\/p>\n\n\n\n<p>Propozycj\u0105 rozwi\u0105zania jest umo\u017cliwienie u\u017cycia wzorc\u00f3w typ\u00f3w pierwotnych w spos\u00f3b bardziej uniwersalny, w taki spos\u00f3b, aby by\u0142y one zgodne z <code>instanceof<\/code> oraz by by\u0142y dopuszczalne w szerszej gamie przypadk\u00f3w. Na przyk\u0142ad, chcieliby\u015bmy u\u017cy\u0107 <code>int<\/code> bezpo\u015brednio w wzorcu <code>JsonNumber<\/code>, tak aby wzorzec pasowa\u0142 tylko wtedy, gdy warto\u015b\u0107 <code>double<\/code> w obiekcie <code>JsonNumber<\/code> mo\u017ce by\u0107 konwertowana na <code>int<\/code> bez utraty informacji:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(&quot;name&quot;) instanceof JsonString(String name)\n    &amp;&amp; map.get(&quot;age&quot;) instanceof JsonNumber(int age))\n{\n    return new Customer(name, age);         \/\/ bez konwersji!\n}\n<\/code><\/pre>\n\n\n\n<p>Dzi\u0119ki takiemu podej\u015bciu, mo\u017cna eliminowa\u0107 potrzeb\u0119 obszernych i potencjalnie niebezpiecznych konwersji.<\/p>\n\n\n\n<p>To tylko jeden przyk\u0142ad, w JEP-ie znajdziecie tego znaczenie wi\u0119cej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n\n\n\n<p>Nast\u0119pny JEP to kolejne ju\u017c po u\u0142atwienie tworzenia prostych, bazowych aplikacji. Nie wiem, czy kt\u00f3rykolwiek komercyjny programista jeszcze to pami\u0119ta, ale launcher aplikacji Java (czyli <code>java<\/code>) od JDK umo\u017cliwia odpalanie nie skompilowanych plik\u00f3w <code>.java<\/code>. Dlaczego jest to w zasadzie nieu\u017cywana metoda? Wynika to z faktu, \u017ce do tej pory nale\u017ca\u0142o ograniczy\u0107 si\u0119 przy jej u\u017cyciu do jednego pliku. A przecie\u017c ka\u017cdy dojrza\u0142y programista Javy wie, \u017ce w jednej klasie to w zasadzie co najwy\u017cej da si\u0119 wzorzec strukturalny zainicjowa\u0107, a nie napisa\u0107 co\u015b cokolwiek realnie u\u017cytecznego.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"701\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-2.png\" alt=\"\" class=\"wp-image-16862\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-2.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-2-214x300.png 214w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Troch\u0119 \u015bmieszkuje, ale musz\u0119 przyzna\u0107 \u017ce nawet ja przeprosi\u0142em si\u0119 do skryptowania z Pythonem.<\/figcaption><\/figure><\/div>\n\n\n<p>Teraz zostanie rozbudowany, aby m\u00f3g\u0142 uruchamia\u0107 te\u017c programy dostarczane jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java, automatycznie kompiluj\u0105c zale\u017cno\u015bci, je\u015bli tylko zachowuj\u0105 standardow\u0105 struktur\u0119 pakiet\u00f3w. Je\u015bli klasa w jednym pliku \u017ar\u00f3d\u0142owym odwo\u0142uje si\u0119 do klasy w innym pliku, launcher automatycznie znajduje i kompiluje ten drugi plik. Mo\u017cliwe jest r\u00f3wnie\u017c korzystanie z wcze\u015bniej skompilowanych klas. Przej\u015bcie z pojedynczego pliku <code>.java<\/code> do wielu plik\u00f3w wymaga od programist\u00f3w i ucz\u0105cych si\u0119 Javy bardziej skomplikowanych krok\u00f3w, takich jak korzystanie z <code>javac<\/code>, tak\u017ce mamy kolejny uk\u0142on w stron\u0119 nowicjuszy, jak w przypadku <a href=\"https:\/\/openjdk.org\/jeps\/445\"><strong>JEP 445: Unnamed Classes and Instance Main Methods (Preview)<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n\n\n\n<p>\u017beby wyt\u0142umaczy\u0107, o co chodzi w tym JEP-ie, musz\u0119 najpierw opowiedzie\u0107 o ASM. ASM to biblioteka w Javie przeznaczona do dynamicznej manipulacji i tworzenia bytecodu. Daje mo\u017cliwo\u015b\u0107 niskopoziomowej analizy, tworzenia oraz modyfikacji istniej\u0105cych klas. Wielu tw\u00f3rc\u00f3w wykorzystuje ASM do dodawania funkcjonalno\u015bci do klas, takich jak logowanie czy monitorowanie, jak r\u00f3wnie\u017c do tworzenia nowego kodu opartego na specyfikacji bytecodu. Przyk\u0142ady bibliotek korzystaj\u0105cych z ASM to AspectJ, Kryo, FindBugs czy JaCoCo, stanowi on te\u017c baz\u0119 dla popularnego (w\u015br\u00f3d tw\u00f3rc\u00f3w narz\u0119dzi) ByteBuddy&#8217;ego.<\/p>\n\n\n\n<p>Co ciekawe, JDK (Java Development Kit) r\u00f3wnie\u017c wykorzystuje ASM w swoim wn\u0119trzu. ASM sta\u0142a si\u0119 kluczow\u0105 bibliotek\u0105 przy implementacji pewnych funkcjonalno\u015bci JDK, takich jak generowanie proxy dla lambd. W praktyce bowiem, cho\u0107 JDK posiada w\u0142asne narz\u0119dzia do manipulacji bytecodem, to w\u0142a\u015bnie ASM przez lata by\u0142a jednym z g\u0142\u00f3wnych narz\u0119dzi wykorzystywanych do takich cel\u00f3w ze wzgl\u0119du na swoj\u0105 wydajno\u015b\u0107 i elastyczno\u015b\u0107. JEP 457 d\u0105\u017cy\u0142 do dostarczenia standardowego JDK do odczytywania, zapisywania i modyfikowania plik\u00f3w klasy Java, co umo\u017cliwi\u0107 ma pozbycie si\u0119 wewn\u0119trznego u\u017cycia ASM w JDK. Inicjatywa ta ma te\u017c&nbsp;na celu zast\u0105pienie istniej\u0105cych wykorzysta\u0144 biblioteki ASM w JDK, co mo\u017ce ostatecznie prowadzi\u0107 do usuni\u0119cia ASM z JDK.<\/p>\n\n\n\n<p>Temat sta\u0142 si\u0119 szczeg\u00f3lnie kluczowy w ostatnich latach. Pocz\u0105tkowo JVM oraz format plik\u00f3w klas ewoluowa\u0142y stosunkowo wolno, o tyle w ostatnich latach tempo tego rozwoju znacz\u0105co si\u0119 zwi\u0119kszy\u0142o. Przyk\u0142adowo, taka Valhalla co chwile proponuje nowe (cho\u0107 cz\u0119sto kr\u00f3tko \u017cyj\u0105ce) propozycje nowego bajtkody i deskryptory p\u00f3l. Blokowanie rozwoju JVM na konieczno\u015bci aktualizacji zewn\u0119trznych bibliotek, takich jak ASM, staje si\u0119 po prostu w zwi\u0105zku z tym nieutrzymywalne. Posiadanie dedykowanej biblioteki standardowej do modyfikacji klas w JDK, kt\u00f3ra rozwija si\u0119 w parze z JVM, usprawni elastyczno\u015b\u0107 ca\u0142ego procesu. Dodatkowo, nast\u0105pi\u0107 ma konsolidacja wszystkich customowych rozwi\u0105za\u0144, kt\u00f3re w tej chwili znalaz\u0142y swoje miejsce w JDK.<\/p>\n\n\n\n<p>Wi\u0119cej na temat Class File API znajdziecie w filmiku:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"New Class-File API will make Java Updates easier - Inside Java Newscast #56\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/bQ2Rwpyj_Ks?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Dodatkowo, ukaza\u0142 si\u0119 te\u017c <strong><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables and Patterns<\/a><\/strong>, kt\u00f3ry w praktycznie niezmienionej formie stabilizuje <strong><a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443<\/a><\/strong>, znany z JDK 21.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Bardzo ciekawy jest te\u017c <a href=\"https:\/\/openjdk.org\/jeps\/8316779\">Draft Valhalli<\/a>, dotycz\u0105cy Null-Restricted Value Class Types (!). Ale tu nie b\u0119d\u0119 si\u0119 spieszy\u0142 &#8211; my\u015bl\u0119, \u017ce jak si\u0119 ustabilizuje po\u015bwi\u0119cimy mu ca\u0142\u0105 osobn\u0105 sekcje.<\/p>\n\n\n\n<h2 id=\"2-pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali\" data-num=2>2. Pulumi &#8211; Infrastructure-as-a-Code w Javie, Kotlinie i Scali<\/h2>\n\n\n\n<p>A teraz b\u0119dzie nietypowo bo o&#8230; Pulumi, ale nie martwcie si\u0119, mam nienajgorszy powody. Nie wiecie czym jest Pulumi? Zdaj\u0105c sobie spraw\u0119, \u017ce nie czytacie teraz &#8222;Infrastructure as a Code Weekly&#8221;, zaczniemy wi\u0119c od kr\u00f3tkiego wyja\u015bnienia. A wydaje mi si\u0119, \u017ce naj\u0142atwiej to zrobi\u0107 w kontrze do jego najwi\u0119kszego konkurenta &#8211; Terraforma.<\/p>\n\n\n\n<p>Dla tych, kt\u00f3rzy nie maj\u0105 do\u015bwiadczenia z DevOpsowaniem, infrastruktur\u0105 i reszt\u0105 tego ca\u0142ego chmurowego ta\u0142atajstwa (a moja ma\u0142a rada &#8211; je\u015bli nie macie bardzo precyzyjnie wyznaczonej \u015bcie\u017cki kariery, to powinni\u015bcie mie\u0107) Terraform to narz\u0119dzie do zarz\u0105dzania infrastruktur\u0105 jak ka\u017cdym innym kodem. No mo\u017ce nie ca\u0142kiem ka\u017cdym, bo Terraform u\u017cywa specjalistycznego j\u0119zyka HCL do deklaratywnego opisu zasob\u00f3w w chmurze. Koncepcja jest taka, \u017ce u\u017cytkownicy definiuj\u0105, jak powinna wygl\u0105da\u0107 ich infrastruktura, a Terraform dba o to, by osi\u0105gn\u0105\u0107 ten stan za pomoc\u0105 provider\u00f3w dla r\u00f3\u017cnych platform chmurowych &#8211; wszystko w pe\u0142ni deklaratywnie.<\/p>\n\n\n\n<p>Jednak my jeste\u015bmy tu programistami (prawda?) dlatego pora przygl\u0105dn\u0105\u0107 si\u0119 konkurencji. Pulumi, czyli g\u0142\u00f3wny bohater tej sekcji podobnie jak Terraform, s\u0142u\u017cy do zarz\u0105dzania infrastruktur\u0105 jako kodem, ale z g\u0142\u00f3wn\u0105 r\u00f3\u017cnic\u0105: pozwala na u\u017cywanie standardowych j\u0119zyk\u00f3w programowania (np. Python, TypeScript) zamiast dedykowanego j\u0119zyka. Dzi\u0119ki temu u\u017cytkownicy Pulumi mog\u0105 wykorzystywa\u0107 p\u0119tle, warunki i inne funkcje j\u0119zykowe podczas definiowania infrastruktury, co mo\u017ce wprowadza\u0107 dodatkow\u0105 elastyczno\u015b\u0107 w stosunku do Terraforma. Staje si\u0119 to szalenie przydatne, gdy staramy si\u0119 w naszej infrastrukturze robi\u0107 nieco &#8222;sprytniejsze&#8221; rzeczy, ni\u017c tylko sklejanie paru yamli z internetu.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-1024x576.png\" alt=\"\" class=\"wp-image-16868\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-1024x576.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-300x169.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-768x432.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">The Girl He Told You Not to Worry About<\/figcaption><\/figure><\/div>\n\n\n<p>W zesz\u0142ym tygodniu <a href=\"https:\/\/www.pulumi.com\/blog\/series-c\/\">Pulumi otrzyma\u0142o du\u017c\u0105 rund\u0119 finansowania na rozw\u00f3j swoich narz\u0119dzi<\/a>, i to w czasach, gdy Venture Capital nie s\u0105 ju\u017c tak \u0142askawe, co pokazuje potencja\u0142 narz\u0119dzia. Zbieg\u0142o si\u0119 to te\u017c z problemami licencyjnymi Terraforma, o kt\u00f3rych wi\u0119cej przeczytacie tutaj. Newsy te by\u0142y dla mnie impulsem do podzielenia si\u0119 informacjami o JVM-owych wariantach Pulumi SDK, zw\u0142aszcza, \u017ce zamieszani w nie byli bardzo mocno in\u017cynierowie z mojego statku-matki, VirtusLab. Jako firma jeste\u015bmy g\u0142\u0119boko zakorzenieni w \u015bwiecie Open-Source i toolingu JVM, odpowiedzialni mi\u0119dzy innymi za kompilator Scali. Wierz\u0105c w wizj\u0119 Pulumi, wsp\u00f3\u0142pracowali\u015bmy z nimi nad stworzeniem oficjalnej wersji Javowej oraz wariant\u00f3w w Scali i Kotlinie.<\/p>\n\n\n\n<p>Szczeg\u00f3lnie to ostatnie wydanie jest mi bardzo bliskie. Osobi\u015bcie bardzo wierz\u0119, \u017ce w przysz\u0142o\u015bci spe\u0142ni si\u0119 wizja Kotlina Multiplatform, w kt\u00f3rej b\u0119dzie si\u0119 da\u0142o u\u017cywa\u0107 jednego j\u0119zyka do tworzenia wszystkich &#8222;artefakt\u00f3w&#8221; w projektach &#8211; ale tak ca\u0142ego-ca\u0142ego. \u017be kod aplikacji mo\u017cna pisa\u0107 w Kotlinie to nikogo nie zaskocz\u0119, ale JetBrains mocno inwestuje przecie\u017c te\u017c w Compose &#8211; czyli warstw\u0119 UI, a przecie\u017c i Gradle (o kt\u00f3rym jeszcze dzisiaj b\u0119dzie) te\u017c mocno inwestuje w Kotlin DSL. Zosta\u0142a infra, a Terraform ze swoim HCL mocno w tym w moich oczach bru\u017adzi. Dlatego w\u0142a\u015bnie zadbali\u015bmy o to, \u017ceby powsta\u0142o Pulumi dla Kotlina. A konkretnie pracowa\u0142a min. Julia Plewa, kt\u00f3ra to podzieli\u0142a si\u0119 wizj\u0105 projektu oraz &#8222;pierwszymi krokami&#8221; w artykule <a href=\"https:\/\/medium.com\/virtuslab\/pulumi-kotlin-9c0cb2d53e1c\">Pulumi Kotlin &#8211; The missing piece in Kotlin multi-platform<\/a>, kt\u00f3ry bardzo celnie oddaje wizje ca\u0142ego projektu.<\/p>\n\n\n\n<p>Podobn\u0105 filozofie ma zreszt\u0105 w\u0142a\u015bnie Besom, czyli Scala SDK dla Pulumi. Celem tw\u00f3rc\u00f3w jest, aby pozwoli\u0107 programistom realnie tworzy\u0107 &#8222;pe\u0142nostackowe&#8221; aplikacje w ulubionym j\u0119zyku, bez babrania si\u0119 w yamlach. Projekt znajdzieciecie oczywi\u015bcie na <a href=\"https:\/\/github.com\/VirtusLab\/besom#getting-started\">Githubie<\/a>. Zreszt\u0105 co ja si\u0119 b\u0119d\u0119 rozpisywa\u0142 &#8211; tutaj macie <a href=\"https:\/\/twitter.com\/lukasz_bialy\/status\/1707357634712486231?s=20\">link do tweeta<\/a> zapowiadaj\u0105cego projekt, kt\u00f3ry dobrze rozja\u015bnia stoj\u0105c\u0105 za nim flozofi\u0119.<\/p>\n\n\n\n<p>Kupujecie takie podej\u015bcie? Je\u015bli tak, spr\u00f3bujcie Pulumi &#8211; pisanie &#8222;infry&#8221; mi przynajmniej dawno nie dawa\u0142o takiej frajdy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"513\" height=\"280\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-4.png\" alt=\"\" class=\"wp-image-16866\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-4.png 513w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-4-300x164.png 300w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><figcaption class=\"wp-element-caption\">A, i Pulumi nie zap\u0142aci\u0142o mi ani grosza za reklam\u0119. I just like the tool \ud83d\udc8e\ud83d\ude4c.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"3-release-radar\" data-num=3>3. Release Radar<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">JVector<\/h3>\n\n\n\n<p>Bazy Wektorowe stanowi\u0105 dynamicznie rozwijaj\u0105c\u0105 si\u0119 dziedzin\u0119 w \u015bwiecie baz danych oraz w szeroko rozumianym \u015brodowisku IT, co jest zwi\u0105zane z ich wykorzystaniem w LLM-ach. Wyszukiwanie wektorowe odgrywa bowiem kluczow\u0105 rol\u0119 w nowoczesnych aplikacjach bazuj\u0105cych na generatywnym AI, u\u0142atwiaj\u0105c programistom rozbudowanie bazy wiedzy modeli o dodatkowe dane. Dzi\u0119ki temu zaawansowane modele j\u0119zykowe mog\u0105 dostarcza\u0107 precyzyjne odpowiedzi, unikaj\u0105c b\u0142\u0119d\u00f3w czy &#8222;halucynacji&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Vector databases are so hot right now. WTF are they?\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/klTvEwg3oJ4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><figcaption class=\"wp-element-caption\">W tym miejscu obowi\u0105zkowy film o bazach wektorowych<\/figcaption><\/figure>\n\n\n\n<p>Nie jest wi\u0119c zaskoczeniem, \u017ce podobne technologie s\u0105 opracowywane w Javie. Przypuszczam, \u017ce wielu czytelnik\u00f3w doskonale wie, \u017ce spora cz\u0119\u015b\u0107 nowoczesnych rozwi\u0105za\u0144 bazodanowych opiera si\u0119 na niezawodnym JVM. Nale\u017cy do nich mi\u0119dzy innymi Apache Cassandra, HBase, b\u0119d\u0105ca kolumnowym magazynem dla systemu plik\u00f3w Hadoop, czy Elasticsearch, wyszukiwarka i silnik analizy bazuj\u0105ca na Lucene.<\/p>\n\n\n\n<p>JVector to napisany w czystej Javie embeddowalny silnik do wyszukiwania wektorowego, nap\u0119dzaj\u0105cy DataStax Astra oraz integruj\u0105cy si\u0119 z wcze\u015bniej wspomnian\u0105 Apache Cassandra. Najbli\u017cszym krewnym JVectora jest wyszukiwanie wektorowe Apache Lucene. Lucene co prawda implementuje algorytm wyszukiwania wektorowego HNSW, kt\u00f3ry jest szybki, ale zach\u0142anny je\u015bli chodzi o pami\u0119\u0107. JVector, bazuj\u0105c na bardziej zaawansowanym algorytmie DiskANN, jest ponad 10 razy szybszy ni\u017c Lucene dla du\u017cych zbior\u00f3w danych. JVector jest szybki, wydajny pod wzgl\u0119dem pami\u0119ci, \u015bwiadomy dysku, r\u00f3wnoleg\u0142y, \u0142atwy do osadzenia i przyrostowy. Projekt JVector jest przeznaczony do prostej integracji, jednocze\u015bnie zachowuj\u0105c wysok\u0105 wydajno\u015b\u0107 &#8211; przyk\u0142adwo, wykorzystuje Vector API i instrukcje SIMD z Panamy (dla przypomnienia, pozostaj\u0105ce w inkubacji).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gradle 8.4<\/h3>\n\n\n\n<p>Zesp\u00f3\u0142 Gradle przedstawi\u0142 wersje 8.4. Prawdopodobnie najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest wsparcie kompilacji dla JDK 21, a wbudowany Kotlin zosta\u0142 zaktualizowany do wersji 1.9.10. Co ciekawe, fakt \u017ce sam Kotlin 1.9.10 nie wspiera jeszcze JDK 21 sprawia, \u017ce sam Gradle wymaga do pracy JDK 20.<\/p>\n\n\n\n<p>System Windows otrzyma\u0142 w tym wydaniu r\u00f3wnie\u017c przyspieszenie kompilacji Javy oparte o compiler daemons, kt\u00f3re pozosta\u0142e systemy dosta\u0142y w wersji 8.3. Aktualizacja oferuje r\u00f3wnie\u017c pomniejsze ulepszenia, takie jak zoptymalizowanie ustawie\u0144 pami\u0119ci dla narz\u0119dzi do kontroli jako\u015bci kodu (jak Checkstyle, CodeNarc, czy PMD) w wi\u0119kszych codebase, ulepszony format raportu HTML Checkstyle oraz wsparcie JVM dystrybuowanego przez JetBrains.<\/p>\n\n\n\n<p>Znacz\u0105c\u0105 zmian\u0105 jest te\u017c prostsze tworzenie konfiguracji skoncentrowanych na okre\u015blonych rolach, z planowanym wsparciem podstawowych wtyczek Gradle do korzystania z nich ju\u017c w nadchodz\u0105cej wersji 9.0. Kotlin DSL r\u00f3wnie\u017c zosta\u0142 wzbogacony, z stabilnym wsparciem dla prostego przypisania w\u0142a\u015bciwo\u015bci za pomoc\u0105 operatora <code>=<\/code>.<\/p>\n\n\n\n<h2 id=\"prywata-i-male-zaproszenie\" data-num=4>Prywata i ma\u0142e zaproszenie<\/h2>\n\n\n\n<p>A na koniec, je\u015bli mieszkacie w Pradz\u0119 albo okolicach Stuttgartu chcia\u0142em Was zaprosi\u0107 na zobaczenie si\u0119 face-to-face. M\u00f3j nast\u0119pny tydzie\u0144 jest bowiem troch\u0119 szalony (co mo\u017ce spowodowa\u0107, \u017ce nie b\u0119dzie za tydzie\u0144 edycji, ale b\u0119d\u0119 walczy\u0142!).<\/p>\n\n\n\n<p>Najpierw udaj\u0119 si\u0119 do Ludwigsburga \ud83c\udde9\ud83c\uddea na EclipseCon, gdzie prezentuj\u0119 <a href=\"https:\/\/www.eclipsecon.org\/node\/4436\">GraalVM, CRaC, Leyden and friends &#8211; in search of TRULY cloud-native Java<\/a> 19 pa\u017adziernika.<\/p>\n\n\n<div class=\"wp-block-image is-style-rounded\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"679\" height=\"315\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1.png\" alt=\"\" class=\"wp-image-16860\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1.png 679w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1-300x139.png 300w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/figure><\/div>\n\n\n<p>Nast\u0119pnie szybka teleportacja (bo nie wiem jak to inaczej nazwa\u0107) do Pragi \ud83c\udde8\ud83c\uddff, aby by\u0107 na GeeCON 20 pa\u017adziernika.<\/p>\n\n\n<div class=\"wp-block-image is-style-default\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1024x536.png\" alt=\"\" class=\"wp-image-16858\" style=\"object-fit:cover\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1024x536.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-300x157.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-768x402.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>This is how we roll \ud83d\ude0e<\/p>\n\n\n\n<p>Nawet je\u015bli nie idziecie na same konferencje, to jak kto\u015b chce si\u0119 spotka\u0107 i napi\u0107 kawy, to my\u015bl\u0119, \u017ce uda si\u0119 zorganizowa\u0107. Jakby co to <a href=\"askowronski@virtuslab.com\">macie m\u00f3j e-mail<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u0142ugo na to czeka\u0142em! Dzisiaj bowiem znowu mo\u017cemy zacz\u0105\u0107 od zestawu JEP-\u00f3w, kt\u00f3re pewnie zobaczymy w okolicach JDK 22. Opr\u00f3cz tego Pulumi, oraz ciekawe premiery. A na ko\u0144cu &#8211; zaproszenie!<\/p>\n","protected":false},"author":10,"featured_media":16871,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-16857","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"11","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png","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>Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - 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\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - Vived\" \/>\n<meta property=\"og:description\" content=\"D\u0142ugo na to czeka\u0142em! Dzisiaj bowiem znowu mo\u017cemy zacz\u0105\u0107 od zestawu JEP-\u00f3w, kt\u00f3re pewnie zobaczymy w okolicach JDK 22. Opr\u00f3cz tego Pulumi, oraz ciekawe premiery. A na ko\u0144cu - zaproszenie!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-11T09:24:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-11T09:25:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\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\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali &#8211; JVM Weekly 151\",\"datePublished\":\"2023-10-11T09:24:13+00:00\",\"dateModified\":\"2023-10-11T09:25:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\"},\"wordCount\":2259,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\",\"url\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\",\"name\":\"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png\",\"datePublished\":\"2023-10-11T09:24:13+00:00\",\"dateModified\":\"2023-10-11T09:25:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali &#8211; JVM Weekly 151\"}]},{\"@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":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - 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\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/","og_locale":"pl_PL","og_type":"article","og_title":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - Vived","og_description":"D\u0142ugo na to czeka\u0142em! Dzisiaj bowiem znowu mo\u017cemy zacz\u0105\u0107 od zestawu JEP-\u00f3w, kt\u00f3re pewnie zobaczymy w okolicach JDK 22. Opr\u00f3cz tego Pulumi, oraz ciekawe premiery. A na ko\u0144cu - zaproszenie!","og_url":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/","og_site_name":"Vived","article_published_time":"2023-10-11T09:24:13+00:00","article_modified_time":"2023-10-11T09:25:12+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.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\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali &#8211; JVM Weekly 151","datePublished":"2023-10-11T09:24:13+00:00","dateModified":"2023-10-11T09:25:12+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/"},"wordCount":2259,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/","url":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/","name":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali - JVM Weekly 151 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png","datePublished":"2023-10-11T09:24:13+00:00","dateModified":"2023-10-11T09:25:12+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/JVM-Weekly-1200x628_V2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/pulumi-infrastructure-as-a-code-w-javie-kotlinie-i-scali-jvm-weekly-151\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Pulumi: Infrastructure-as-a-Code w Javie, Kotlinie i Scali &#8211; JVM Weekly 151"}]},{"@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. Pierwszy zestaw nowych JEP-\u00f3w po premierze JDK 21.<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Pierwszy zestaw nowych JEP-\u00f3w po premierze JDK 21.<\/h2>\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\/455\">JEP 455: Primitive types in Patterns, instanceof, and switch (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/455\">JEP 455: Primitive types in Patterns, instanceof, and switch (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ten JEP jest... zaskakuj\u0105co skomplikowany - ale mog\u0142em si\u0119 tego spodziewa\u0107, przecie\u017c dotyczy to typ\u00f3w prymitywnych, a to zawsze komplikuje. Dlatego pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem.<\/p>\n","innerContent":["\n<p>Ten JEP jest... zaskakuj\u0105co skomplikowany - ale mog\u0142em si\u0119 tego spodziewa\u0107, przecie\u017c dotyczy to typ\u00f3w prymitywnych, a to zawsze komplikuje. Dlatego pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Aktualnie, u\u017cycie wzorc\u00f3w typ\u00f3w prymitywnych w Javie wi\u0105\u017ce si\u0119 z ograniczeniami. Na przyk\u0142ad, chocia\u017c mo\u017cemy modelowa\u0107 dokumenty JSON przy u\u017cyciu rekord\u00f3w (jak w poni\u017cszym kodzie), mamy ograniczenie w zakresie zagnie\u017cd\u017conych wzorc\u00f3w typ\u00f3w prymitywnych:<\/p>\n","innerContent":["\n<p>Aktualnie, u\u017cycie wzorc\u00f3w typ\u00f3w prymitywnych w Javie wi\u0105\u017ce si\u0119 z ograniczeniami. Na przyk\u0142ad, chocia\u017c mo\u017cemy modelowa\u0107 dokumenty JSON przy u\u017cyciu rekord\u00f3w (jak w poni\u017cszym kodzie), mamy ograniczenie w zakresie zagnie\u017cd\u017conych wzorc\u00f3w typ\u00f3w prymitywnych:<\/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>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(\"age\") instanceof JsonNumber(double age))\n{\n    return new Customer(name, (int)age); \n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(\"age\") instanceof JsonNumber(double age))\n{\n    return new Customer(name, (int)age); \n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W powy\u017cszym fragmencie, chocia\u017c oczekujemy, \u017ce warto\u015b\u0107 \"age\" b\u0119dzie zawsze <code>int<\/code>, mo\u017cemy jedynie ekstrahowa\u0107 warto\u015b\u0107 <code>double<\/code> i musimy polega\u0107 na manualnej konwersji (cast) do <code>int<\/code>. Problem wynika z tego, jak JSON reprezentuje liczby oraz jak wiele bibliotek do obs\u0142ugi JSON w Javie je potem interpretuje.<\/p>\n","innerContent":["\n<p>W powy\u017cszym fragmencie, chocia\u017c oczekujemy, \u017ce warto\u015b\u0107 \"age\" b\u0119dzie zawsze <code>int<\/code>, mo\u017cemy jedynie ekstrahowa\u0107 warto\u015b\u0107 <code>double<\/code> i musimy polega\u0107 na manualnej konwersji (cast) do <code>int<\/code>. Problem wynika z tego, jak JSON reprezentuje liczby oraz jak wiele bibliotek do obs\u0142ugi JSON w Javie je potem interpretuje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JSON nie rozr\u00f3\u017cnia pomi\u0119dzy r\u00f3\u017cnymi typami liczbowymi. W standardzie JSON wszystkie liczby s\u0105 zapisywane jako liczby zmiennoprzecinkowe. Oznacza to, \u017ce kiedy mamy warto\u015b\u0107 \"age\": 25 w dokumencie JSON, ta warto\u015b\u0107 jest interpretowana jako liczba zmiennoprzecinkowa, mimo \u017ce mo\u017ce reprezentowa\u0107 wiek jako warto\u015b\u0107 ca\u0142kowita.<\/p>\n","innerContent":["\n<p>JSON nie rozr\u00f3\u017cnia pomi\u0119dzy r\u00f3\u017cnymi typami liczbowymi. W standardzie JSON wszystkie liczby s\u0105 zapisywane jako liczby zmiennoprzecinkowe. Oznacza to, \u017ce kiedy mamy warto\u015b\u0107 \"age\": 25 w dokumencie JSON, ta warto\u015b\u0107 jest interpretowana jako liczba zmiennoprzecinkowa, mimo \u017ce mo\u017ce reprezentowa\u0107 wiek jako warto\u015b\u0107 ca\u0142kowita.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Gdy Java odczytuje warto\u015b\u0107 z JSON, wiele bibliotek (na przyk\u0142ad <code>javax.json<\/code>, <code>org.json<\/code> itp.) interpretuje wszystkie liczby jako <code>double<\/code>, poniewa\u017c <code>double<\/code> mo\u017ce reprezentowa\u0107 zar\u00f3wno liczby ca\u0142kowite, jak i zmiennoprzecinkowe.<\/p>\n","innerContent":["\n<p>Gdy Java odczytuje warto\u015b\u0107 z JSON, wiele bibliotek (na przyk\u0142ad <code>javax.json<\/code>, <code>org.json<\/code> itp.) interpretuje wszystkie liczby jako <code>double<\/code>, poniewa\u017c <code>double<\/code> mo\u017ce reprezentowa\u0107 zar\u00f3wno liczby ca\u0142kowite, jak i zmiennoprzecinkowe.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego w powy\u017cszym przyk\u0142adzie, kiedy pr\u00f3bujesz dopasowa\u0107 warto\u015b\u0107 \"age\" do wzorca <code>JsonNumber<\/code>, warto\u015b\u0107 jest dost\u0119pna jako <code>double<\/code> - jest najbardziej og\u00f3lny spos\u00f3b reprezentowania liczb zmiennoprzecinkowych w Javie. Je\u015bli chcesz uzyska\u0107 warto\u015b\u0107 jako <code>int<\/code>, musisz jawnie j\u0105 rzutowa\u0107 (i potencjalnie akceptowa\u0107 ryzyko utraty precyzji w przypadku liczb, kt\u00f3re nie pasuj\u0105 dok\u0142adnie do zakresu <code>int<\/code>).<\/p>\n","innerContent":["\n<p>Dlatego w powy\u017cszym przyk\u0142adzie, kiedy pr\u00f3bujesz dopasowa\u0107 warto\u015b\u0107 \"age\" do wzorca <code>JsonNumber<\/code>, warto\u015b\u0107 jest dost\u0119pna jako <code>double<\/code> - jest najbardziej og\u00f3lny spos\u00f3b reprezentowania liczb zmiennoprzecinkowych w Javie. Je\u015bli chcesz uzyska\u0107 warto\u015b\u0107 jako <code>int<\/code>, musisz jawnie j\u0105 rzutowa\u0107 (i potencjalnie akceptowa\u0107 ryzyko utraty precyzji w przypadku liczb, kt\u00f3re nie pasuj\u0105 dok\u0142adnie do zakresu <code>int<\/code>).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Propozycj\u0105 rozwi\u0105zania jest umo\u017cliwienie u\u017cycia wzorc\u00f3w typ\u00f3w pierwotnych w spos\u00f3b bardziej uniwersalny, w taki spos\u00f3b, aby by\u0142y one zgodne z <code>instanceof<\/code> oraz by by\u0142y dopuszczalne w szerszej gamie przypadk\u00f3w. Na przyk\u0142ad, chcieliby\u015bmy u\u017cy\u0107 <code>int<\/code> bezpo\u015brednio w wzorcu <code>JsonNumber<\/code>, tak aby wzorzec pasowa\u0142 tylko wtedy, gdy warto\u015b\u0107 <code>double<\/code> w obiekcie <code>JsonNumber<\/code> mo\u017ce by\u0107 konwertowana na <code>int<\/code> bez utraty informacji:<\/p>\n","innerContent":["\n<p>Propozycj\u0105 rozwi\u0105zania jest umo\u017cliwienie u\u017cycia wzorc\u00f3w typ\u00f3w pierwotnych w spos\u00f3b bardziej uniwersalny, w taki spos\u00f3b, aby by\u0142y one zgodne z <code>instanceof<\/code> oraz by by\u0142y dopuszczalne w szerszej gamie przypadk\u00f3w. Na przyk\u0142ad, chcieliby\u015bmy u\u017cy\u0107 <code>int<\/code> bezpo\u015brednio w wzorcu <code>JsonNumber<\/code>, tak aby wzorzec pasowa\u0142 tylko wtedy, gdy warto\u015b\u0107 <code>double<\/code> w obiekcie <code>JsonNumber<\/code> mo\u017ce by\u0107 konwertowana na <code>int<\/code> bez utraty informacji:<\/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>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(\"name\") instanceof JsonString(String name)\n    &amp;&amp; map.get(\"age\") instanceof JsonNumber(int age))\n{\n    return new Customer(name, age);         \/\/ bez konwersji!\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>if (json instanceof JsonObject(var map)\n    &amp;&amp; map.get(\"name\") instanceof JsonString(String name)\n    &amp;&amp; map.get(\"age\") instanceof JsonNumber(int age))\n{\n    return new Customer(name, age);         \/\/ bez konwersji!\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dzi\u0119ki takiemu podej\u015bciu, mo\u017cna eliminowa\u0107 potrzeb\u0119 obszernych i potencjalnie niebezpiecznych konwersji.<\/p>\n","innerContent":["\n<p>Dzi\u0119ki takiemu podej\u015bciu, mo\u017cna eliminowa\u0107 potrzeb\u0119 obszernych i potencjalnie niebezpiecznych konwersji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To tylko jeden przyk\u0142ad, w JEP-ie znajdziecie tego znaczenie wi\u0119cej.<\/p>\n","innerContent":["\n<p>To tylko jeden przyk\u0142ad, w JEP-ie znajdziecie tego znaczenie 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:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/458\">JEP 458: Launch Multi-File Source-Code Programs<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nast\u0119pny JEP to kolejne ju\u017c po u\u0142atwienie tworzenia prostych, bazowych aplikacji. Nie wiem, czy kt\u00f3rykolwiek komercyjny programista jeszcze to pami\u0119ta, ale launcher aplikacji Java (czyli <code>java<\/code>) od JDK umo\u017cliwia odpalanie nie skompilowanych plik\u00f3w <code>.java<\/code>. Dlaczego jest to w zasadzie nieu\u017cywana metoda? Wynika to z faktu, \u017ce do tej pory nale\u017ca\u0142o ograniczy\u0107 si\u0119 przy jej u\u017cyciu do jednego pliku. A przecie\u017c ka\u017cdy dojrza\u0142y programista Javy wie, \u017ce w jednej klasie to w zasadzie co najwy\u017cej da si\u0119 wzorzec strukturalny zainicjowa\u0107, a nie napisa\u0107 co\u015b cokolwiek realnie u\u017cytecznego.<\/p>\n","innerContent":["\n<p>Nast\u0119pny JEP to kolejne ju\u017c po u\u0142atwienie tworzenia prostych, bazowych aplikacji. Nie wiem, czy kt\u00f3rykolwiek komercyjny programista jeszcze to pami\u0119ta, ale launcher aplikacji Java (czyli <code>java<\/code>) od JDK umo\u017cliwia odpalanie nie skompilowanych plik\u00f3w <code>.java<\/code>. Dlaczego jest to w zasadzie nieu\u017cywana metoda? Wynika to z faktu, \u017ce do tej pory nale\u017ca\u0142o ograniczy\u0107 si\u0119 przy jej u\u017cyciu do jednego pliku. A przecie\u017c ka\u017cdy dojrza\u0142y programista Javy wie, \u017ce w jednej klasie to w zasadzie co najwy\u017cej da si\u0119 wzorzec strukturalny zainicjowa\u0107, a nie napisa\u0107 co\u015b cokolwiek realnie u\u017cytecznego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16862,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-2.png\" alt=\"\" class=\"wp-image-16862\"\/><figcaption class=\"wp-element-caption\">Troch\u0119 \u015bmieszkuje, ale musz\u0119 przyzna\u0107 \u017ce nawet ja przeprosi\u0142em si\u0119 do skryptowania z Pythonem.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-2.png\" alt=\"\" class=\"wp-image-16862\"\/><figcaption class=\"wp-element-caption\">Troch\u0119 \u015bmieszkuje, ale musz\u0119 przyzna\u0107 \u017ce nawet ja przeprosi\u0142em si\u0119 do skryptowania z Pythonem.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Teraz zostanie rozbudowany, aby m\u00f3g\u0142 uruchamia\u0107 te\u017c programy dostarczane jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java, automatycznie kompiluj\u0105c zale\u017cno\u015bci, je\u015bli tylko zachowuj\u0105 standardow\u0105 struktur\u0119 pakiet\u00f3w. Je\u015bli klasa w jednym pliku \u017ar\u00f3d\u0142owym odwo\u0142uje si\u0119 do klasy w innym pliku, launcher automatycznie znajduje i kompiluje ten drugi plik. Mo\u017cliwe jest r\u00f3wnie\u017c korzystanie z wcze\u015bniej skompilowanych klas. Przej\u015bcie z pojedynczego pliku <code>.java<\/code> do wielu plik\u00f3w wymaga od programist\u00f3w i ucz\u0105cych si\u0119 Javy bardziej skomplikowanych krok\u00f3w, takich jak korzystanie z <code>javac<\/code>, tak\u017ce mamy kolejny uk\u0142on w stron\u0119 nowicjuszy, jak w przypadku <a href=\"https:\/\/openjdk.org\/jeps\/445\"><strong>JEP 445: Unnamed Classes and Instance Main Methods (Preview)<\/strong><\/a><\/p>\n","innerContent":["\n<p>Teraz zostanie rozbudowany, aby m\u00f3g\u0142 uruchamia\u0107 te\u017c programy dostarczane jako wiele plik\u00f3w \u017ar\u00f3d\u0142owych Java, automatycznie kompiluj\u0105c zale\u017cno\u015bci, je\u015bli tylko zachowuj\u0105 standardow\u0105 struktur\u0119 pakiet\u00f3w. Je\u015bli klasa w jednym pliku \u017ar\u00f3d\u0142owym odwo\u0142uje si\u0119 do klasy w innym pliku, launcher automatycznie znajduje i kompiluje ten drugi plik. Mo\u017cliwe jest r\u00f3wnie\u017c korzystanie z wcze\u015bniej skompilowanych klas. Przej\u015bcie z pojedynczego pliku <code>.java<\/code> do wielu plik\u00f3w wymaga od programist\u00f3w i ucz\u0105cych si\u0119 Javy bardziej skomplikowanych krok\u00f3w, takich jak korzystanie z <code>javac<\/code>, tak\u017ce mamy kolejny uk\u0142on w stron\u0119 nowicjuszy, jak w przypadku <a href=\"https:\/\/openjdk.org\/jeps\/445\"><strong>JEP 445: Unnamed Classes and Instance Main Methods (Preview)<\/strong><\/a><\/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\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/457\">JEP 457: Class-File API (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>\u017beby wyt\u0142umaczy\u0107, o co chodzi w tym JEP-ie, musz\u0119 najpierw opowiedzie\u0107 o ASM. ASM to biblioteka w Javie przeznaczona do dynamicznej manipulacji i tworzenia bytecodu. Daje mo\u017cliwo\u015b\u0107 niskopoziomowej analizy, tworzenia oraz modyfikacji istniej\u0105cych klas. Wielu tw\u00f3rc\u00f3w wykorzystuje ASM do dodawania funkcjonalno\u015bci do klas, takich jak logowanie czy monitorowanie, jak r\u00f3wnie\u017c do tworzenia nowego kodu opartego na specyfikacji bytecodu. Przyk\u0142ady bibliotek korzystaj\u0105cych z ASM to AspectJ, Kryo, FindBugs czy JaCoCo, stanowi on te\u017c baz\u0119 dla popularnego (w\u015br\u00f3d tw\u00f3rc\u00f3w narz\u0119dzi) ByteBuddy'ego.<\/p>\n","innerContent":["\n<p>\u017beby wyt\u0142umaczy\u0107, o co chodzi w tym JEP-ie, musz\u0119 najpierw opowiedzie\u0107 o ASM. ASM to biblioteka w Javie przeznaczona do dynamicznej manipulacji i tworzenia bytecodu. Daje mo\u017cliwo\u015b\u0107 niskopoziomowej analizy, tworzenia oraz modyfikacji istniej\u0105cych klas. Wielu tw\u00f3rc\u00f3w wykorzystuje ASM do dodawania funkcjonalno\u015bci do klas, takich jak logowanie czy monitorowanie, jak r\u00f3wnie\u017c do tworzenia nowego kodu opartego na specyfikacji bytecodu. Przyk\u0142ady bibliotek korzystaj\u0105cych z ASM to AspectJ, Kryo, FindBugs czy JaCoCo, stanowi on te\u017c baz\u0119 dla popularnego (w\u015br\u00f3d tw\u00f3rc\u00f3w narz\u0119dzi) ByteBuddy'ego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co ciekawe, JDK (Java Development Kit) r\u00f3wnie\u017c wykorzystuje ASM w swoim wn\u0119trzu. ASM sta\u0142a si\u0119 kluczow\u0105 bibliotek\u0105 przy implementacji pewnych funkcjonalno\u015bci JDK, takich jak generowanie proxy dla lambd. W praktyce bowiem, cho\u0107 JDK posiada w\u0142asne narz\u0119dzia do manipulacji bytecodem, to w\u0142a\u015bnie ASM przez lata by\u0142a jednym z g\u0142\u00f3wnych narz\u0119dzi wykorzystywanych do takich cel\u00f3w ze wzgl\u0119du na swoj\u0105 wydajno\u015b\u0107 i elastyczno\u015b\u0107. JEP 457 d\u0105\u017cy\u0142 do dostarczenia standardowego JDK do odczytywania, zapisywania i modyfikowania plik\u00f3w klasy Java, co umo\u017cliwi\u0107 ma pozbycie si\u0119 wewn\u0119trznego u\u017cycia ASM w JDK. Inicjatywa ta ma te\u017c&nbsp;na celu zast\u0105pienie istniej\u0105cych wykorzysta\u0144 biblioteki ASM w JDK, co mo\u017ce ostatecznie prowadzi\u0107 do usuni\u0119cia ASM z JDK.<\/p>\n","innerContent":["\n<p>Co ciekawe, JDK (Java Development Kit) r\u00f3wnie\u017c wykorzystuje ASM w swoim wn\u0119trzu. ASM sta\u0142a si\u0119 kluczow\u0105 bibliotek\u0105 przy implementacji pewnych funkcjonalno\u015bci JDK, takich jak generowanie proxy dla lambd. W praktyce bowiem, cho\u0107 JDK posiada w\u0142asne narz\u0119dzia do manipulacji bytecodem, to w\u0142a\u015bnie ASM przez lata by\u0142a jednym z g\u0142\u00f3wnych narz\u0119dzi wykorzystywanych do takich cel\u00f3w ze wzgl\u0119du na swoj\u0105 wydajno\u015b\u0107 i elastyczno\u015b\u0107. JEP 457 d\u0105\u017cy\u0142 do dostarczenia standardowego JDK do odczytywania, zapisywania i modyfikowania plik\u00f3w klasy Java, co umo\u017cliwi\u0107 ma pozbycie si\u0119 wewn\u0119trznego u\u017cycia ASM w JDK. Inicjatywa ta ma te\u017c&nbsp;na celu zast\u0105pienie istniej\u0105cych wykorzysta\u0144 biblioteki ASM w JDK, co mo\u017ce ostatecznie prowadzi\u0107 do usuni\u0119cia ASM z JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Temat sta\u0142 si\u0119 szczeg\u00f3lnie kluczowy w ostatnich latach. Pocz\u0105tkowo JVM oraz format plik\u00f3w klas ewoluowa\u0142y stosunkowo wolno, o tyle w ostatnich latach tempo tego rozwoju znacz\u0105co si\u0119 zwi\u0119kszy\u0142o. Przyk\u0142adowo, taka Valhalla co chwile proponuje nowe (cho\u0107 cz\u0119sto kr\u00f3tko \u017cyj\u0105ce) propozycje nowego bajtkody i deskryptory p\u00f3l. Blokowanie rozwoju JVM na konieczno\u015bci aktualizacji zewn\u0119trznych bibliotek, takich jak ASM, staje si\u0119 po prostu w zwi\u0105zku z tym nieutrzymywalne. Posiadanie dedykowanej biblioteki standardowej do modyfikacji klas w JDK, kt\u00f3ra rozwija si\u0119 w parze z JVM, usprawni elastyczno\u015b\u0107 ca\u0142ego procesu. Dodatkowo, nast\u0105pi\u0107 ma konsolidacja wszystkich customowych rozwi\u0105za\u0144, kt\u00f3re w tej chwili znalaz\u0142y swoje miejsce w JDK.<\/p>\n","innerContent":["\n<p>Temat sta\u0142 si\u0119 szczeg\u00f3lnie kluczowy w ostatnich latach. Pocz\u0105tkowo JVM oraz format plik\u00f3w klas ewoluowa\u0142y stosunkowo wolno, o tyle w ostatnich latach tempo tego rozwoju znacz\u0105co si\u0119 zwi\u0119kszy\u0142o. Przyk\u0142adowo, taka Valhalla co chwile proponuje nowe (cho\u0107 cz\u0119sto kr\u00f3tko \u017cyj\u0105ce) propozycje nowego bajtkody i deskryptory p\u00f3l. Blokowanie rozwoju JVM na konieczno\u015bci aktualizacji zewn\u0119trznych bibliotek, takich jak ASM, staje si\u0119 po prostu w zwi\u0105zku z tym nieutrzymywalne. Posiadanie dedykowanej biblioteki standardowej do modyfikacji klas w JDK, kt\u00f3ra rozwija si\u0119 w parze z JVM, usprawni elastyczno\u015b\u0107 ca\u0142ego procesu. Dodatkowo, nast\u0105pi\u0107 ma konsolidacja wszystkich customowych rozwi\u0105za\u0144, kt\u00f3re w tej chwili znalaz\u0142y swoje miejsce w JDK.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wi\u0119cej na temat Class File API znajdziecie w filmiku:<\/p>\n","innerContent":["\n<p>Wi\u0119cej na temat Class File API znajdziecie w filmiku:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=bQ2Rwpyj_Ks","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=bQ2Rwpyj_Ks\n<\/div><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=bQ2Rwpyj_Ks\n<\/div><\/figure>\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>Dodatkowo, ukaza\u0142 si\u0119 te\u017c <strong><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables and Patterns<\/a><\/strong>, kt\u00f3ry w praktycznie niezmienionej formie stabilizuje <strong><a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443<\/a><\/strong>, znany z JDK 21.<\/p>\n","innerContent":["\n<p>Dodatkowo, ukaza\u0142 si\u0119 te\u017c <strong><a href=\"https:\/\/openjdk.org\/jeps\/456\">JEP 456: Unnamed Variables and Patterns<\/a><\/strong>, kt\u00f3ry w praktycznie niezmienionej formie stabilizuje <strong><a href=\"https:\/\/openjdk.org\/jeps\/443\">JEP 443<\/a><\/strong>, znany z JDK 21.<\/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>Bardzo ciekawy jest te\u017c <a href=\"https:\/\/openjdk.org\/jeps\/8316779\">Draft Valhalli<\/a>, dotycz\u0105cy Null-Restricted Value Class Types (!). Ale tu nie b\u0119d\u0119 si\u0119 spieszy\u0142 - my\u015bl\u0119, \u017ce jak si\u0119 ustabilizuje po\u015bwi\u0119cimy mu ca\u0142\u0105 osobn\u0105 sekcje.<\/p>\n","innerContent":["\n<p>Bardzo ciekawy jest te\u017c <a href=\"https:\/\/openjdk.org\/jeps\/8316779\">Draft Valhalli<\/a>, dotycz\u0105cy Null-Restricted Value Class Types (!). Ale tu nie b\u0119d\u0119 si\u0119 spieszy\u0142 - my\u015bl\u0119, \u017ce jak si\u0119 ustabilizuje po\u015bwi\u0119cimy mu ca\u0142\u0105 osobn\u0105 sekcje.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Pulumi - Infrastructure-as-a-Code w Javie, Kotlinie i Scali<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Pulumi - Infrastructure-as-a-Code w Javie, Kotlinie i Scali<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A teraz b\u0119dzie nietypowo bo o... Pulumi, ale nie martwcie si\u0119, mam nienajgorszy powody. Nie wiecie czym jest Pulumi? Zdaj\u0105c sobie spraw\u0119, \u017ce nie czytacie teraz \"Infrastructure as a Code Weekly\", zaczniemy wi\u0119c od kr\u00f3tkiego wyja\u015bnienia. A wydaje mi si\u0119, \u017ce naj\u0142atwiej to zrobi\u0107 w kontrze do jego najwi\u0119kszego konkurenta - Terraforma.<\/p>\n","innerContent":["\n<p>A teraz b\u0119dzie nietypowo bo o... Pulumi, ale nie martwcie si\u0119, mam nienajgorszy powody. Nie wiecie czym jest Pulumi? Zdaj\u0105c sobie spraw\u0119, \u017ce nie czytacie teraz \"Infrastructure as a Code Weekly\", zaczniemy wi\u0119c od kr\u00f3tkiego wyja\u015bnienia. A wydaje mi si\u0119, \u017ce naj\u0142atwiej to zrobi\u0107 w kontrze do jego najwi\u0119kszego konkurenta - Terraforma.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dla tych, kt\u00f3rzy nie maj\u0105 do\u015bwiadczenia z DevOpsowaniem, infrastruktur\u0105 i reszt\u0105 tego ca\u0142ego chmurowego ta\u0142atajstwa (a moja ma\u0142a rada - je\u015bli nie macie bardzo precyzyjnie wyznaczonej \u015bcie\u017cki kariery, to powinni\u015bcie mie\u0107) Terraform to narz\u0119dzie do zarz\u0105dzania infrastruktur\u0105 jak ka\u017cdym innym kodem. No mo\u017ce nie ca\u0142kiem ka\u017cdym, bo Terraform u\u017cywa specjalistycznego j\u0119zyka HCL do deklaratywnego opisu zasob\u00f3w w chmurze. Koncepcja jest taka, \u017ce u\u017cytkownicy definiuj\u0105, jak powinna wygl\u0105da\u0107 ich infrastruktura, a Terraform dba o to, by osi\u0105gn\u0105\u0107 ten stan za pomoc\u0105 provider\u00f3w dla r\u00f3\u017cnych platform chmurowych - wszystko w pe\u0142ni deklaratywnie.<\/p>\n","innerContent":["\n<p>Dla tych, kt\u00f3rzy nie maj\u0105 do\u015bwiadczenia z DevOpsowaniem, infrastruktur\u0105 i reszt\u0105 tego ca\u0142ego chmurowego ta\u0142atajstwa (a moja ma\u0142a rada - je\u015bli nie macie bardzo precyzyjnie wyznaczonej \u015bcie\u017cki kariery, to powinni\u015bcie mie\u0107) Terraform to narz\u0119dzie do zarz\u0105dzania infrastruktur\u0105 jak ka\u017cdym innym kodem. No mo\u017ce nie ca\u0142kiem ka\u017cdym, bo Terraform u\u017cywa specjalistycznego j\u0119zyka HCL do deklaratywnego opisu zasob\u00f3w w chmurze. Koncepcja jest taka, \u017ce u\u017cytkownicy definiuj\u0105, jak powinna wygl\u0105da\u0107 ich infrastruktura, a Terraform dba o to, by osi\u0105gn\u0105\u0107 ten stan za pomoc\u0105 provider\u00f3w dla r\u00f3\u017cnych platform chmurowych - wszystko w pe\u0142ni deklaratywnie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jednak my jeste\u015bmy tu programistami (prawda?) dlatego pora przygl\u0105dn\u0105\u0107 si\u0119 konkurencji. Pulumi, czyli g\u0142\u00f3wny bohater tej sekcji podobnie jak Terraform, s\u0142u\u017cy do zarz\u0105dzania infrastruktur\u0105 jako kodem, ale z g\u0142\u00f3wn\u0105 r\u00f3\u017cnic\u0105: pozwala na u\u017cywanie standardowych j\u0119zyk\u00f3w programowania (np. Python, TypeScript) zamiast dedykowanego j\u0119zyka. Dzi\u0119ki temu u\u017cytkownicy Pulumi mog\u0105 wykorzystywa\u0107 p\u0119tle, warunki i inne funkcje j\u0119zykowe podczas definiowania infrastruktury, co mo\u017ce wprowadza\u0107 dodatkow\u0105 elastyczno\u015b\u0107 w stosunku do Terraforma. Staje si\u0119 to szalenie przydatne, gdy staramy si\u0119 w naszej infrastrukturze robi\u0107 nieco \"sprytniejsze\" rzeczy, ni\u017c tylko sklejanie paru yamli z internetu.<\/p>\n","innerContent":["\n<p>Jednak my jeste\u015bmy tu programistami (prawda?) dlatego pora przygl\u0105dn\u0105\u0107 si\u0119 konkurencji. Pulumi, czyli g\u0142\u00f3wny bohater tej sekcji podobnie jak Terraform, s\u0142u\u017cy do zarz\u0105dzania infrastruktur\u0105 jako kodem, ale z g\u0142\u00f3wn\u0105 r\u00f3\u017cnic\u0105: pozwala na u\u017cywanie standardowych j\u0119zyk\u00f3w programowania (np. Python, TypeScript) zamiast dedykowanego j\u0119zyka. Dzi\u0119ki temu u\u017cytkownicy Pulumi mog\u0105 wykorzystywa\u0107 p\u0119tle, warunki i inne funkcje j\u0119zykowe podczas definiowania infrastruktury, co mo\u017ce wprowadza\u0107 dodatkow\u0105 elastyczno\u015b\u0107 w stosunku do Terraforma. Staje si\u0119 to szalenie przydatne, gdy staramy si\u0119 w naszej infrastrukturze robi\u0107 nieco \"sprytniejsze\" rzeczy, ni\u017c tylko sklejanie paru yamli z internetu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16868,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-1024x576.png\" alt=\"\" class=\"wp-image-16868\"\/><figcaption class=\"wp-element-caption\">The Girl He Told You Not to Worry About<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-5-1024x576.png\" alt=\"\" class=\"wp-image-16868\"\/><figcaption class=\"wp-element-caption\">The Girl He Told You Not to Worry About<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W zesz\u0142ym tygodniu <a href=\"https:\/\/www.pulumi.com\/blog\/series-c\/\">Pulumi otrzyma\u0142o du\u017c\u0105 rund\u0119 finansowania na rozw\u00f3j swoich narz\u0119dzi<\/a>, i to w czasach, gdy Venture Capital nie s\u0105 ju\u017c tak \u0142askawe, co pokazuje potencja\u0142 narz\u0119dzia. Zbieg\u0142o si\u0119 to te\u017c z problemami licencyjnymi Terraforma, o kt\u00f3rych wi\u0119cej przeczytacie tutaj. Newsy te by\u0142y dla mnie impulsem do podzielenia si\u0119 informacjami o JVM-owych wariantach Pulumi SDK, zw\u0142aszcza, \u017ce zamieszani w nie byli bardzo mocno in\u017cynierowie z mojego statku-matki, VirtusLab. Jako firma jeste\u015bmy g\u0142\u0119boko zakorzenieni w \u015bwiecie Open-Source i toolingu JVM, odpowiedzialni mi\u0119dzy innymi za kompilator Scali. Wierz\u0105c w wizj\u0119 Pulumi, wsp\u00f3\u0142pracowali\u015bmy z nimi nad stworzeniem oficjalnej wersji Javowej oraz wariant\u00f3w w Scali i Kotlinie.<\/p>\n","innerContent":["\n<p>W zesz\u0142ym tygodniu <a href=\"https:\/\/www.pulumi.com\/blog\/series-c\/\">Pulumi otrzyma\u0142o du\u017c\u0105 rund\u0119 finansowania na rozw\u00f3j swoich narz\u0119dzi<\/a>, i to w czasach, gdy Venture Capital nie s\u0105 ju\u017c tak \u0142askawe, co pokazuje potencja\u0142 narz\u0119dzia. Zbieg\u0142o si\u0119 to te\u017c z problemami licencyjnymi Terraforma, o kt\u00f3rych wi\u0119cej przeczytacie tutaj. Newsy te by\u0142y dla mnie impulsem do podzielenia si\u0119 informacjami o JVM-owych wariantach Pulumi SDK, zw\u0142aszcza, \u017ce zamieszani w nie byli bardzo mocno in\u017cynierowie z mojego statku-matki, VirtusLab. Jako firma jeste\u015bmy g\u0142\u0119boko zakorzenieni w \u015bwiecie Open-Source i toolingu JVM, odpowiedzialni mi\u0119dzy innymi za kompilator Scali. Wierz\u0105c w wizj\u0119 Pulumi, wsp\u00f3\u0142pracowali\u015bmy z nimi nad stworzeniem oficjalnej wersji Javowej oraz wariant\u00f3w w Scali i Kotlinie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Szczeg\u00f3lnie to ostatnie wydanie jest mi bardzo bliskie. Osobi\u015bcie bardzo wierz\u0119, \u017ce w przysz\u0142o\u015bci spe\u0142ni si\u0119 wizja Kotlina Multiplatform, w kt\u00f3rej b\u0119dzie si\u0119 da\u0142o u\u017cywa\u0107 jednego j\u0119zyka do tworzenia wszystkich \"artefakt\u00f3w\" w projektach - ale tak ca\u0142ego-ca\u0142ego. \u017be kod aplikacji mo\u017cna pisa\u0107 w Kotlinie to nikogo nie zaskocz\u0119, ale JetBrains mocno inwestuje przecie\u017c te\u017c w Compose - czyli warstw\u0119 UI, a przecie\u017c i Gradle (o kt\u00f3rym jeszcze dzisiaj b\u0119dzie) te\u017c mocno inwestuje w Kotlin DSL. Zosta\u0142a infra, a Terraform ze swoim HCL mocno w tym w moich oczach bru\u017adzi. Dlatego w\u0142a\u015bnie zadbali\u015bmy o to, \u017ceby powsta\u0142o Pulumi dla Kotlina. A konkretnie pracowa\u0142a min. Julia Plewa, kt\u00f3ra to podzieli\u0142a si\u0119 wizj\u0105 projektu oraz \"pierwszymi krokami\" w artykule <a href=\"https:\/\/medium.com\/virtuslab\/pulumi-kotlin-9c0cb2d53e1c\">Pulumi Kotlin - The missing piece in Kotlin multi-platform<\/a>, kt\u00f3ry bardzo celnie oddaje wizje ca\u0142ego projektu.<\/p>\n","innerContent":["\n<p>Szczeg\u00f3lnie to ostatnie wydanie jest mi bardzo bliskie. Osobi\u015bcie bardzo wierz\u0119, \u017ce w przysz\u0142o\u015bci spe\u0142ni si\u0119 wizja Kotlina Multiplatform, w kt\u00f3rej b\u0119dzie si\u0119 da\u0142o u\u017cywa\u0107 jednego j\u0119zyka do tworzenia wszystkich \"artefakt\u00f3w\" w projektach - ale tak ca\u0142ego-ca\u0142ego. \u017be kod aplikacji mo\u017cna pisa\u0107 w Kotlinie to nikogo nie zaskocz\u0119, ale JetBrains mocno inwestuje przecie\u017c te\u017c w Compose - czyli warstw\u0119 UI, a przecie\u017c i Gradle (o kt\u00f3rym jeszcze dzisiaj b\u0119dzie) te\u017c mocno inwestuje w Kotlin DSL. Zosta\u0142a infra, a Terraform ze swoim HCL mocno w tym w moich oczach bru\u017adzi. Dlatego w\u0142a\u015bnie zadbali\u015bmy o to, \u017ceby powsta\u0142o Pulumi dla Kotlina. A konkretnie pracowa\u0142a min. Julia Plewa, kt\u00f3ra to podzieli\u0142a si\u0119 wizj\u0105 projektu oraz \"pierwszymi krokami\" w artykule <a href=\"https:\/\/medium.com\/virtuslab\/pulumi-kotlin-9c0cb2d53e1c\">Pulumi Kotlin - The missing piece in Kotlin multi-platform<\/a>, kt\u00f3ry bardzo celnie oddaje wizje ca\u0142ego projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Podobn\u0105 filozofie ma zreszt\u0105 w\u0142a\u015bnie Besom, czyli Scala SDK dla Pulumi. Celem tw\u00f3rc\u00f3w jest, aby pozwoli\u0107 programistom realnie tworzy\u0107 \"pe\u0142nostackowe\" aplikacje w ulubionym j\u0119zyku, bez babrania si\u0119 w yamlach. Projekt znajdzieciecie oczywi\u015bcie na <a href=\"https:\/\/github.com\/VirtusLab\/besom#getting-started\">Githubie<\/a>. Zreszt\u0105 co ja si\u0119 b\u0119d\u0119 rozpisywa\u0142 - tutaj macie <a href=\"https:\/\/twitter.com\/lukasz_bialy\/status\/1707357634712486231?s=20\">link do tweeta<\/a> zapowiadaj\u0105cego projekt, kt\u00f3ry dobrze rozja\u015bnia stoj\u0105c\u0105 za nim flozofi\u0119.<\/p>\n","innerContent":["\n<p>Podobn\u0105 filozofie ma zreszt\u0105 w\u0142a\u015bnie Besom, czyli Scala SDK dla Pulumi. Celem tw\u00f3rc\u00f3w jest, aby pozwoli\u0107 programistom realnie tworzy\u0107 \"pe\u0142nostackowe\" aplikacje w ulubionym j\u0119zyku, bez babrania si\u0119 w yamlach. Projekt znajdzieciecie oczywi\u015bcie na <a href=\"https:\/\/github.com\/VirtusLab\/besom#getting-started\">Githubie<\/a>. Zreszt\u0105 co ja si\u0119 b\u0119d\u0119 rozpisywa\u0142 - tutaj macie <a href=\"https:\/\/twitter.com\/lukasz_bialy\/status\/1707357634712486231?s=20\">link do tweeta<\/a> zapowiadaj\u0105cego projekt, kt\u00f3ry dobrze rozja\u015bnia stoj\u0105c\u0105 za nim flozofi\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kupujecie takie podej\u015bcie? Je\u015bli tak, spr\u00f3bujcie Pulumi - pisanie \"infry\" mi przynajmniej dawno nie dawa\u0142o takiej frajdy.<\/p>\n","innerContent":["\n<p>Kupujecie takie podej\u015bcie? Je\u015bli tak, spr\u00f3bujcie Pulumi - pisanie \"infry\" mi przynajmniej dawno nie dawa\u0142o takiej frajdy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16866,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-4.png\" alt=\"\" class=\"wp-image-16866\"\/><figcaption class=\"wp-element-caption\">A, i Pulumi nie zap\u0142aci\u0142o mi ani grosza za reklam\u0119. I just like the tool \ud83d\udc8e\ud83d\ude4c.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-4.png\" alt=\"\" class=\"wp-image-16866\"\/><figcaption class=\"wp-element-caption\">A, i Pulumi nie zap\u0142aci\u0142o mi ani grosza za reklam\u0119. I just like the tool \ud83d\udc8e\ud83d\ude4c.<\/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\">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\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">JVector<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">JVector<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Bazy Wektorowe stanowi\u0105 dynamicznie rozwijaj\u0105c\u0105 si\u0119 dziedzin\u0119 w \u015bwiecie baz danych oraz w szeroko rozumianym \u015brodowisku IT, co jest zwi\u0105zane z ich wykorzystaniem w LLM-ach. Wyszukiwanie wektorowe odgrywa bowiem kluczow\u0105 rol\u0119 w nowoczesnych aplikacjach bazuj\u0105cych na generatywnym AI, u\u0142atwiaj\u0105c programistom rozbudowanie bazy wiedzy modeli o dodatkowe dane. Dzi\u0119ki temu zaawansowane modele j\u0119zykowe mog\u0105 dostarcza\u0107 precyzyjne odpowiedzi, unikaj\u0105c b\u0142\u0119d\u00f3w czy \"halucynacji\".<\/p>\n","innerContent":["\n<p>Bazy Wektorowe stanowi\u0105 dynamicznie rozwijaj\u0105c\u0105 si\u0119 dziedzin\u0119 w \u015bwiecie baz danych oraz w szeroko rozumianym \u015brodowisku IT, co jest zwi\u0105zane z ich wykorzystaniem w LLM-ach. Wyszukiwanie wektorowe odgrywa bowiem kluczow\u0105 rol\u0119 w nowoczesnych aplikacjach bazuj\u0105cych na generatywnym AI, u\u0142atwiaj\u0105c programistom rozbudowanie bazy wiedzy modeli o dodatkowe dane. Dzi\u0119ki temu zaawansowane modele j\u0119zykowe mog\u0105 dostarcza\u0107 precyzyjne odpowiedzi, unikaj\u0105c b\u0142\u0119d\u00f3w czy \"halucynacji\".<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=klTvEwg3oJ4","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=klTvEwg3oJ4\n<\/div><figcaption class=\"wp-element-caption\">W tym miejscu obowi\u0105zkowy film o bazach wektorowych<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=klTvEwg3oJ4\n<\/div><figcaption class=\"wp-element-caption\">W tym miejscu obowi\u0105zkowy film o bazach wektorowych<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nie jest wi\u0119c zaskoczeniem, \u017ce podobne technologie s\u0105 opracowywane w Javie. Przypuszczam, \u017ce wielu czytelnik\u00f3w doskonale wie, \u017ce spora cz\u0119\u015b\u0107 nowoczesnych rozwi\u0105za\u0144 bazodanowych opiera si\u0119 na niezawodnym JVM. Nale\u017cy do nich mi\u0119dzy innymi Apache Cassandra, HBase, b\u0119d\u0105ca kolumnowym magazynem dla systemu plik\u00f3w Hadoop, czy Elasticsearch, wyszukiwarka i silnik analizy bazuj\u0105ca na Lucene.<\/p>\n","innerContent":["\n<p>Nie jest wi\u0119c zaskoczeniem, \u017ce podobne technologie s\u0105 opracowywane w Javie. Przypuszczam, \u017ce wielu czytelnik\u00f3w doskonale wie, \u017ce spora cz\u0119\u015b\u0107 nowoczesnych rozwi\u0105za\u0144 bazodanowych opiera si\u0119 na niezawodnym JVM. Nale\u017cy do nich mi\u0119dzy innymi Apache Cassandra, HBase, b\u0119d\u0105ca kolumnowym magazynem dla systemu plik\u00f3w Hadoop, czy Elasticsearch, wyszukiwarka i silnik analizy bazuj\u0105ca na Lucene.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JVector to napisany w czystej Javie embeddowalny silnik do wyszukiwania wektorowego, nap\u0119dzaj\u0105cy DataStax Astra oraz integruj\u0105cy si\u0119 z wcze\u015bniej wspomnian\u0105 Apache Cassandra. Najbli\u017cszym krewnym JVectora jest wyszukiwanie wektorowe Apache Lucene. Lucene co prawda implementuje algorytm wyszukiwania wektorowego HNSW, kt\u00f3ry jest szybki, ale zach\u0142anny je\u015bli chodzi o pami\u0119\u0107. JVector, bazuj\u0105c na bardziej zaawansowanym algorytmie DiskANN, jest ponad 10 razy szybszy ni\u017c Lucene dla du\u017cych zbior\u00f3w danych. JVector jest szybki, wydajny pod wzgl\u0119dem pami\u0119ci, \u015bwiadomy dysku, r\u00f3wnoleg\u0142y, \u0142atwy do osadzenia i przyrostowy. Projekt JVector jest przeznaczony do prostej integracji, jednocze\u015bnie zachowuj\u0105c wysok\u0105 wydajno\u015b\u0107 - przyk\u0142adwo, wykorzystuje Vector API i instrukcje SIMD z Panamy (dla przypomnienia, pozostaj\u0105ce w inkubacji).<\/p>\n","innerContent":["\n<p>JVector to napisany w czystej Javie embeddowalny silnik do wyszukiwania wektorowego, nap\u0119dzaj\u0105cy DataStax Astra oraz integruj\u0105cy si\u0119 z wcze\u015bniej wspomnian\u0105 Apache Cassandra. Najbli\u017cszym krewnym JVectora jest wyszukiwanie wektorowe Apache Lucene. Lucene co prawda implementuje algorytm wyszukiwania wektorowego HNSW, kt\u00f3ry jest szybki, ale zach\u0142anny je\u015bli chodzi o pami\u0119\u0107. JVector, bazuj\u0105c na bardziej zaawansowanym algorytmie DiskANN, jest ponad 10 razy szybszy ni\u017c Lucene dla du\u017cych zbior\u00f3w danych. JVector jest szybki, wydajny pod wzgl\u0119dem pami\u0119ci, \u015bwiadomy dysku, r\u00f3wnoleg\u0142y, \u0142atwy do osadzenia i przyrostowy. Projekt JVector jest przeznaczony do prostej integracji, jednocze\u015bnie zachowuj\u0105c wysok\u0105 wydajno\u015b\u0107 - przyk\u0142adwo, wykorzystuje Vector API i instrukcje SIMD z Panamy (dla przypomnienia, pozostaj\u0105ce w inkubacji).<\/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\">Gradle 8.4<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Gradle 8.4<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zesp\u00f3\u0142 Gradle przedstawi\u0142 wersje 8.4. Prawdopodobnie najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest wsparcie kompilacji dla JDK 21, a wbudowany Kotlin zosta\u0142 zaktualizowany do wersji 1.9.10. Co ciekawe, fakt \u017ce sam Kotlin 1.9.10 nie wspiera jeszcze JDK 21 sprawia, \u017ce sam Gradle wymaga do pracy JDK 20.<\/p>\n","innerContent":["\n<p>Zesp\u00f3\u0142 Gradle przedstawi\u0142 wersje 8.4. Prawdopodobnie najwi\u0119ksz\u0105 nowo\u015bci\u0105 jest wsparcie kompilacji dla JDK 21, a wbudowany Kotlin zosta\u0142 zaktualizowany do wersji 1.9.10. Co ciekawe, fakt \u017ce sam Kotlin 1.9.10 nie wspiera jeszcze JDK 21 sprawia, \u017ce sam Gradle wymaga do pracy JDK 20.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>System Windows otrzyma\u0142 w tym wydaniu r\u00f3wnie\u017c przyspieszenie kompilacji Javy oparte o compiler daemons, kt\u00f3re pozosta\u0142e systemy dosta\u0142y w wersji 8.3. Aktualizacja oferuje r\u00f3wnie\u017c pomniejsze ulepszenia, takie jak zoptymalizowanie ustawie\u0144 pami\u0119ci dla narz\u0119dzi do kontroli jako\u015bci kodu (jak Checkstyle, CodeNarc, czy PMD) w wi\u0119kszych codebase, ulepszony format raportu HTML Checkstyle oraz wsparcie JVM dystrybuowanego przez JetBrains.<\/p>\n","innerContent":["\n<p>System Windows otrzyma\u0142 w tym wydaniu r\u00f3wnie\u017c przyspieszenie kompilacji Javy oparte o compiler daemons, kt\u00f3re pozosta\u0142e systemy dosta\u0142y w wersji 8.3. Aktualizacja oferuje r\u00f3wnie\u017c pomniejsze ulepszenia, takie jak zoptymalizowanie ustawie\u0144 pami\u0119ci dla narz\u0119dzi do kontroli jako\u015bci kodu (jak Checkstyle, CodeNarc, czy PMD) w wi\u0119kszych codebase, ulepszony format raportu HTML Checkstyle oraz wsparcie JVM dystrybuowanego przez JetBrains.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Znacz\u0105c\u0105 zmian\u0105 jest te\u017c prostsze tworzenie konfiguracji skoncentrowanych na okre\u015blonych rolach, z planowanym wsparciem podstawowych wtyczek Gradle do korzystania z nich ju\u017c w nadchodz\u0105cej wersji 9.0. Kotlin DSL r\u00f3wnie\u017c zosta\u0142 wzbogacony, z stabilnym wsparciem dla prostego przypisania w\u0142a\u015bciwo\u015bci za pomoc\u0105 operatora <code>=<\/code>.<\/p>\n","innerContent":["\n<p>Znacz\u0105c\u0105 zmian\u0105 jest te\u017c prostsze tworzenie konfiguracji skoncentrowanych na okre\u015blonych rolach, z planowanym wsparciem podstawowych wtyczek Gradle do korzystania z nich ju\u017c w nadchodz\u0105cej wersji 9.0. Kotlin DSL r\u00f3wnie\u017c zosta\u0142 wzbogacony, z stabilnym wsparciem dla prostego przypisania w\u0142a\u015bciwo\u015bci za pomoc\u0105 operatora <code>=<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Prywata i ma\u0142e zaproszenie<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Prywata i ma\u0142e zaproszenie<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na koniec, je\u015bli mieszkacie w Pradz\u0119 albo okolicach Stuttgartu chcia\u0142em Was zaprosi\u0107 na zobaczenie si\u0119 face-to-face. M\u00f3j nast\u0119pny tydzie\u0144 jest bowiem troch\u0119 szalony (co mo\u017ce spowodowa\u0107, \u017ce nie b\u0119dzie za tydzie\u0144 edycji, ale b\u0119d\u0119 walczy\u0142!).<\/p>\n","innerContent":["\n<p>A na koniec, je\u015bli mieszkacie w Pradz\u0119 albo okolicach Stuttgartu chcia\u0142em Was zaprosi\u0107 na zobaczenie si\u0119 face-to-face. M\u00f3j nast\u0119pny tydzie\u0144 jest bowiem troch\u0119 szalony (co mo\u017ce spowodowa\u0107, \u017ce nie b\u0119dzie za tydzie\u0144 edycji, ale b\u0119d\u0119 walczy\u0142!).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najpierw udaj\u0119 si\u0119 do Ludwigsburga \ud83c\udde9\ud83c\uddea na EclipseCon, gdzie prezentuj\u0119 <a href=\"https:\/\/www.eclipsecon.org\/node\/4436\">GraalVM, CRaC, Leyden and friends - in search of TRULY cloud-native Java<\/a> 19 pa\u017adziernika.<\/p>\n","innerContent":["\n<p>Najpierw udaj\u0119 si\u0119 do Ludwigsburga \ud83c\udde9\ud83c\uddea na EclipseCon, gdzie prezentuj\u0119 <a href=\"https:\/\/www.eclipsecon.org\/node\/4436\">GraalVM, CRaC, Leyden and friends - in search of TRULY cloud-native Java<\/a> 19 pa\u017adziernika.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16860,"sizeSlug":"full","linkDestination":"none","className":"is-style-rounded"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-style-rounded\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1.png\" alt=\"\" class=\"wp-image-16860\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-style-rounded\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1.png\" alt=\"\" class=\"wp-image-16860\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nast\u0119pnie szybka teleportacja (bo nie wiem jak to inaczej nazwa\u0107) do Pragi \ud83c\udde8\ud83c\uddff, aby by\u0107 na GeeCON 20 pa\u017adziernika.<\/p>\n","innerContent":["\n<p>Nast\u0119pnie szybka teleportacja (bo nie wiem jak to inaczej nazwa\u0107) do Pragi \ud83c\udde8\ud83c\uddff, aby by\u0107 na GeeCON 20 pa\u017adziernika.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16858,"scale":"cover","sizeSlug":"large","linkDestination":"none","className":"is-style-default"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-style-default\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1024x536.png\" alt=\"\" class=\"wp-image-16858\" style=\"object-fit:cover\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-style-default\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/10\/image-1024x536.png\" alt=\"\" class=\"wp-image-16858\" style=\"object-fit:cover\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>This is how we roll \ud83d\ude0e<\/p>\n","innerContent":["\n<p>This is how we roll \ud83d\ude0e<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nawet je\u015bli nie idziecie na same konferencje, to jak kto\u015b chce si\u0119 spotka\u0107 i napi\u0107 kawy, to my\u015bl\u0119, \u017ce uda si\u0119 zorganizowa\u0107. Jakby co to <a href=\"askowronski@virtuslab.com\">macie m\u00f3j e-mail<\/a><\/p>\n","innerContent":["\n<p>Nawet je\u015bli nie idziecie na same konferencje, to jak kto\u015b chce si\u0119 spotka\u0107 i napi\u0107 kawy, to my\u015bl\u0119, \u017ce uda si\u0119 zorganizowa\u0107. Jakby co to <a href=\"askowronski@virtuslab.com\">macie m\u00f3j e-mail<\/a><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16857","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=16857"}],"version-history":[{"count":4,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16857\/revisions"}],"predecessor-version":[{"id":16877,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16857\/revisions\/16877"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16871"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}