{"id":16963,"date":"2023-11-08T09:55:43","date_gmt":"2023-11-08T08:55:43","guid":{"rendered":"https:\/\/vived.io\/?p=16963"},"modified":"2023-11-09T12:57:59","modified_gmt":"2023-11-09T11:57:59","slug":"play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/","title":{"rendered":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w&#8230; i pozbywa Akki &#8211; JVM Weekly vol. 153"},"content":{"rendered":"\n<h2 id=\"1-bo-dawno-nie-bylo-jep-ow-no-to-nowe-jepy\" data-num=1>1. Bo dawno nie by\u0142o JEP-\u00f3w&#8230; no to nowe JEPy!<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n\n\n\n<p>No i mamy pierwsze odpryski projektu Leyden, pomimo, \u017ce sam JEP nie jest do niego na razie przypi\u0119ty &#8211; cho\u0107 mo\u017ce to po prostu jeszcze kwestia pozostawania w Drafcie. Mimo wszystko, jest na tyle interesuj\u0105cy, \u017ce postanawiam o nim wspomnie\u0107 ju\u017c na tak wczesnym etapie.<\/p>\n\n\n\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwija\u0107 ma JVM o mo\u017cliwo\u015b\u0107 wczytywania aplikacji i bibliotek, kt\u00f3re zosta\u0142y skompilowane do natywnego kodu Ahead of Time. Cel jest jak zawsze ostatnio &#8211; przyspieszenie start aplikacji i startow\u0105 wydajno\u015b\u0107 wykonania. Tw\u00f3rcy chc\u0105 przeciwdzia\u0142a\u0107 problemom z wydajno\u015bci\u0105, wynikaj\u0105cym z obecnego dynamicznego modelu wykonania w trzech etapach: wst\u0119pnego interpretowania (Tier 0), kompilacji C1 (Tier 3), a nast\u0119pnie C2 (Tier 4), gdzie etapy 1 i 2 dotycz\u0105 specjalnych przypadk\u00f3w kompilacji C1. Ca\u0142\u0105 operacje mo\u017cna by robi\u0107 od razu kompilatorem C2, ale realnie powodowa\u0142oby to d\u0142ugi &#8222;rozruch&#8221; optymalizowanej wersji. Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry przed Java 17 by\u0142 dost\u0119pnym zamiennikiem dla C2, ale jego uruchomienie negatywnie wp\u0142ywa\u0142o na aplikacj\u0119, poniewa\u017c on sam musia\u0142 zosta\u0107 skompilowany przed rozpocz\u0119ciem efektywnej pracy. Ponadto proces deoptymalizacji, kt\u00f3ry ma miejsce, gdy skompilowany przez C2 kod trafia na b\u0142\u0119dne za\u0142o\u017cenie optymalizacyjne, jest kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, a nast\u0119pnie odrzucony po ponownej kompilacji przez C2.<\/p>\n\n\n\n<p>Sam draft jest bardzo WIP (nie posiada nawet pe\u0142nego opisu), ale b\u0119d\u0119 monitorowa\u0142 temat i na pewno do niego wr\u00f3cimy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/461\">JEP 461: Stream Gatherers (Preview)<\/a><\/h3>\n\n\n\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n\n\n\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy scan((sum, next) -&gt; sum + next). Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"385\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-2.png\" alt=\"\" class=\"wp-image-16970\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-2.png 648w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-2-300x178.png 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><figcaption class=\"wp-element-caption\">Za ka\u017cdym jednym razem&#8230;<\/figcaption><\/figure><\/div>\n\n\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0107 ma do tworzenia w\u0142asnych operacja po\u015brednich, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe\u2026 ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c oryginalny dokument. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. \u017beby Wam to lepiej zwizualizowa\u0107, przyk\u0142adem gatherera jest np. metoda <code>fold<\/code>.<\/p>\n\n\n\n<p>Najwa\u017cniejsze metody nowego interfejsu to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; initializer();\n    Gatherer.Integrator&lt;A,T,R&gt; integrator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n    (...)\n}<\/code><\/pre>\n\n\n\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego map na wsp\u00f3lnej abstrakcji:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> public static &lt;T, R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n         return Gatherer.of(\n             (unused, element, downstream) -&gt; \/\/ integrator\n                 downstream.push(mapper.apply(element))\n         );\n     }\n<\/code><\/pre>\n\n\n\n<p>Je\u015bli jeste\u015bcie zainteresowani, bardzo dobre wprowadzenie wideo jak zwykle trafi\u0142o na kana\u0142 Inside Java.<\/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=\"Better Java Streams with Gatherers - Inside Java Newscast #57\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/epgJm2dZTSg?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<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n\n\n\n<p>Tutaj mamy powt\u00f3rk\u0119 z rozrywki &#8211; Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 zosta\u0142a zaproponowana w JEP 428 i dostarczona w JDK 19 jako API inkubacyjne. Funkcjonalno\u015b\u0107 przesz\u0142a (z minimalnymi usprawnieniami pochodz\u0105cymi z wprowadzeniem Scope Values) &#8222;drug\u0105 rund\u0119&#8221; w inkubatorze w JDK 20 jako JEP 437. W JDK 21 trafi\u0142a za\u015b do fazy Preview. JDK 22 i JEP 462 nie wprowadzi za\u015b \u017cadnych zmian, samo API pozostanie jednak w Preview &#8211; spo\u0142eczno\u015b\u0107 uczy si\u0119 dopiero u\u017cywania Virtual Threads, potencjalnie wi\u0119c nie warto spieszy\u0107 si\u0119 ze zbyt szybk\u0105 stabilizacj\u0105 dodatkowych struktur kontrolnych dla nich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n\n\n\n<p>JEP 463 wprowadza drug\u0105 wersj\u0119 koncepcji zaproponowanej w JEP 445, kt\u00f3rej celem jest uproszczenie procesu pisania &#8222;hello world&#8221; przez nowych programist\u00f3w Java i ma na pchn\u0105\u0107 Jav\u0119 w kierunku, by pocz\u0105tkuj\u0105cy mogli zaczyna\u0107 od prostych program\u00f3w z pojedyncz\u0105 klas\u0105, bez konieczno\u015bci rozumienia od takiego samego pocz\u0105tku bardziej skomplikowanych funkcji przeznaczonych dla wi\u0119kszych projekt\u00f3w. Mo\u017cliwe ma wi\u0119c zosta\u0107 uproszczone deklarowanie program\u00f3w, co pozwali uczniom na naturalny post\u0119p do bardziej zaawansowanych aspekt\u00f3w Javy w miar\u0119 rozwijania ich umiej\u0119tno\u015bci.<\/p>\n\n\n\n<p>Tym razem jednak zmian jest ca\u0142kiem sporo. Pierwotna idea klas bez nazwy zosta\u0142y zrewidowane. Zamiast dodawa\u0107 wsparcie dla klas bez nazwy, je\u015bli nie zdefiniujemy klasy w spos\u00f3b jawny, ta otrzyma nazw\u0119 wybran\u0105 przez system i b\u0119dzie funkcjonowa\u0107 jako normalna klasa najwy\u017cszego poziomu.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"530\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-3.png\" alt=\"\" class=\"wp-image-16975\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-3.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-3-283x300.png 283w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Co ciekawe, w Polsce tak dzia\u0142a to te\u017c z dzie\u0107mi &#8211; je\u015bli rodzic sp\u00f3\u017ani si\u0119 z formalno\u015bciami, &#8222;system&#8221; mo\u017ce nada\u0107 dowolne imi\u0119. Warto wi\u0119c zadba\u0107 o godne imi\u0119 dla latoro\u015bli.<\/figcaption><\/figure><\/div>\n\n\n<p>Poprzednia wersja wprowadza\u0142a te\u017c bardzo skomplikowany zestaw regu\u0142 wobec metod, kt\u00f3re kwalifikowa\u0142y si\u0119 jako <code>main<\/code> takiej klasy bez nazwy. Teraz wyb\u00f3r metody domy\u015blnie wykonywanej zosta\u0142a uproszczona do dwuetapowego procesu, kt\u00f3ry koncentruje si\u0119 na tym, czy kandyduj\u0105ca metoda <code>main<\/code> ma parametr <code>String[]<\/code>, bez \u017cadnej niejednoznaczno\u015bci wynikaj\u0105cej z ograniczenia, \u017ce klasa nie mo\u017ce deklarowa\u0107 zar\u00f3wno statycznej, jak i instancyjnej metody o tej samej nazwie i parametrach, kt\u00f3re znajdowa\u0142y si\u0119 w oryginalnej propozycji.<\/p>\n\n\n\n<h2 id=\"2-duze-nowosci-w-ekosystemie-kotlina-k2-w-becie-oraz-stabilny-multiplatform\" data-num=2>2. Du\u017ce nowo\u015bci w ekosystemie Kotlina &#8211; K2 w Becie oraz stabilny Multiplatform<\/h2>\n\n\n\n<p>Zawsze twierdzi\u0142em, \u017ce wersje 1.x.20 w Kotlinie bywaj\u0105 ciekawsze od tych stabilnych. Najnowsza aktualizacja, <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-1-9-20-released\/\">Kotlin w wersji 1.9.20<\/a> to potwierdza, wprowadzaj\u0105c znacz\u0105cy post\u0119p w obu najwa\u017cniejszych projektach j\u0119zyka &#8211; kompilator K2 wszed\u0142 do fazy Beta dla wszystkich platform, a Kotlin Multiplatform osi\u0105gn\u0105\u0142 status stabilny. Roz\u0142\u00f3\u017cmy sobie wi\u0119c to wydanie na czynniki pierwsze.<\/p>\n\n\n\n<p>Beta kompilatora K2 obejmuje platformy JVM, Native, JS i Wasm, ukazuj\u0105c gotowo\u015b\u0107 do szerszych test\u00f3w. Patrz\u0105c w przysz\u0142o\u015b\u0107, kolejny znacz\u0105cy kamie\u0144 milowy dla Kotlina to wersja 2.0.0, kt\u00f3ra b\u0119dzie zawiera\u0107 kompilator K2 ju\u017c jako w pe\u0142ni stabilny. JetBrains ju\u017c teraz zapowiedzia\u0142o zwi\u0119kszon\u0105 ilo\u015b\u0107 wyda\u0144 testowych wyda\u0144 prowadz\u0105cych do Kotlin 2.0, w tym kilka wersji Beta i Release Candidates (RC), aby szybko rozwi\u0105zywa\u0107 wszelkie problemy. Na ten moment celem jest zapewnienie kompatybilno\u015bci binarnej i unikni\u0119cie &#8222;zatruwania&#8221; binarnych plik\u00f3w skompilowanych K2 (sytuacji, gdy skompilowany kod z jednej wersji kompilatora wprowadza problemy, gdy jest u\u017cywany z binarkami skompilowanymi przez inn\u0105 wersj\u0119), co umo\u017cliwi u\u017cycie pochodz\u0105cych z niego artefakt\u00f3w r\u00f3wnie\u017c w \u015brodowiskach produkcyjnych. JetBrains deklaruje, \u017ce intensywnie testowa\u0142 kompilator, a u\u017cytkownicy s\u0105 zach\u0119cani do udzia\u0142u w jego dalszej stabilizacji, testuj\u0105c kompilator K2 w swoich projektach.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"300\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-8.png\" alt=\"\" class=\"wp-image-16990\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-8.png 600w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-8-300x150.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><figcaption class=\"wp-element-caption\">Unikalne zdj\u0119cie zrobione temporalnym aparatem fotograficznym, biuro JetBrains, po\u0142owa 2024<\/figcaption><\/figure><\/div>\n\n\n<p>Dodatkowo, w\u015br\u00f3d wa\u017cniejszych punkt\u00f3w tej aktualizacji znajduj\u0105 si\u0119 cho\u0107by znacznie lepsze wsparcie projekt\u00f3w wieloplatformowych, domy\u015blny niestandardowy alokator pami\u0119ci w Kotlin\/Native oraz usprawnienia wydajno\u015bci garbage collector&#8217;a w Kotlin\/Native. Dodatkowo, Kotlin\/Wasm wprowadzi\u0142 nowe cele i wsparcie dla najnowszego Wasm GC oraz wsparcie dla API WASI w swojej standardowej bibliotece. <\/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=\"What&#039;s new in Kotlin 1.9.20\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Ol_96CHKqg8?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\">Klasycznie, wszystkie nowo\u015bci dostaniecie te\u017c w wersji wideo.<\/figcaption><\/figure>\n\n\n\n<p>Ale jak pisa\u0142em, to nie wszystko. Og\u0142oszono bowiem, \u017ce <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-multiplatform-stable\/\">Kotlin Multiplatform jest ju\u017c stabilny<\/a> i gotowy do u\u017cycia produkcyjnego. Dla przypomnienia: cho\u0107 technologia ta umo\u017cliwia deweloperom wsp\u00f3\u0142dzielenie kodu mi\u0119dzy r\u00f3\u017cnymi platformami, to jednak szczeg\u00f3lnie skupia si\u0119 na programistach mobilnych. Kotlin Multiplatform (KMP) zaciera granice mi\u0119dzy rozwojem cross-platformowym a natywnym, umo\u017cliwiaj\u0105c deweloperom swobod\u0119 w zakresie ilo\u015bci wsp\u00f3\u0142dzielonego kodu i integracj\u0119 z ka\u017cdym projektem &#8211; Android, iOS, ale te\u017c serwer (cho\u0107 tu ilo\u015b\u0107 synergii jest mniejsza).<\/p>\n\n\n\n<p>Trakcja jest, co mocno wida\u0107 po tym, jak ekosystem Kotlin Multiplatform ro\u015bnie:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"364\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-1024x364.png\" alt=\"\" class=\"wp-image-16988\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-1024x364.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-300x107.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-768x273.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-1536x546.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-2048x728.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p> Google ostatnimi czasy wspiera u\u017cytkownik\u00f3w KMP coraz to nowymi, eksperymentalnymi wersjami bibliotek Jetpack. Warto tu wspomnie\u0107 o nowej wersji <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/compose-multiplatform-1-5-10-release\/\">Compose Multiplatform 1.5.10<\/a>, kt\u00f3ra zgodna jest teraz stabilnym Kotlinem 1.9.20 daj\u0105c\u0105 mo\u017cliwo\u015b\u0107 pe\u0142nego wsp\u00f3\u0142dzielenia logiki i komponent\u00f3w interfejsu u\u017cytkownika &#8211; w tej chwili jest ju\u017c stabilna dla Androida i desktopu (JVM), z Alfa wsparciem dla iOS i eksperymentalnym dla web (Wasm). Aktualizacja ta wprowadza udoskonalone komponenty Material 3 dla wsp\u00f3lnego kodu, poprawki w polach tekstowych dla iOS, natywn\u0105 fizyk\u0119 przewijania z efektem &#8222;rubber band&#8221;, interoperacyjno\u015b\u0107 z UIKit za pomoc\u0105 animacji crossfade oraz zwi\u0119kszon\u0105 szybko\u015b\u0107 kompilacji dzi\u0119ki wsparciu dla cachowania kompilatora. Dodatkowo, wprowadzono wst\u0119pne wsparcie dla kompilatora K2, a tak\u017ce polepszono wydajno\u015b\u0107 renderowania na iOS.<\/p>\n\n\n\n<h2 id=\"3-play-framework-odradza-sie-jak-fenix-z-popiolow\" data-num=3>3. Play Framework odradza si\u0119 jak Fenix z popio\u0142\u00f3w<\/h2>\n\n\n\n<p>Mieli\u015bmy niedawno Halloween, wi\u0119c tego typu obwieszczenia nie powinny nas dziwi\u0107 &#8211; martwy wraca z grobu. I tak, wiem, \u017ce ju\u017c mieli\u015bmy chwil\u0119 temu dost\u0119p do wersji preview, ale przyznam, \u017ce jest to dla mnie jeden z najbardziej zaskakuj\u0105cych powrot\u00f3w tego roku. Wci\u0105\u017c przecieram oczy. Kiedy wchodzi\u0142em w bran\u017c\u0119, Play by\u0142 jednym z g\u0142\u00f3wnych kontener\u00f3w do tytu\u0142u &#8222;g\u0142\u00f3wny konkurent Springa&#8221;, i sam pisa\u0142em w nim nawet kilka serwis\u00f3w produkcyjnych. Tylko wiecie, jak wtedy rzuca\u0142em si\u0119 na wszystko, \u0142\u0105cznie z rzucaniem si\u0119 na kombinacje <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Groovy<\/a>\/<a href=\"https:\/\/www.youtube.com\/watch?v=I6mbnQeDO9Y\">Clojure<\/a> i <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Java EE<\/a>&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"297\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-1024x297.png\" alt=\"\" class=\"wp-image-16980\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-1024x297.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-300x87.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-768x223.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-1536x445.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5.png 1628w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>M\u0142odo\u015b\u0107 musi si\u0119 wyszale\u0107.<\/p>\n\n\n\n<p>Niestety, w pewnym momencie tw\u00f3rcy rozwi\u0105zania &#8211; wtedy jeszcze Typesafe, dzi\u015b znany jako Lightbend &#8211; powoli przestawali mie\u0107 zainteresowanie tym rozwi\u0105zaniem, najpierw przerzucaj\u0105c je na Lagoma (pami\u0119ta kto\u015b jeszcze to rozwi\u0105zanie?), a potem na Akk\u0119 Serverless. Play <a href=\"https:\/\/www.lightbend.com\/blog\/on-the-future-of-play-framework\">w ko\u0144cu w 2021 roku<\/a> zosta\u0142 oddany spo\u0142eczno\u015bci, a piecz\u0119 nad nim przej\u0119li nad nim Matthias Kurz i Greg Methvin. I teraz, jak feniks z popio\u0142\u00f3w, po prawie 4 latach, pojawi\u0142y si\u0119 r\u00f3wnocze\u015bnie wydanie 2.9 i 3.0. Dlaczego a\u017c dwa? Za tym te\u017c stoi ciekawa historia.<\/p>\n\n\n\n<p>Play 3.0 przynosi kluczow\u0105 aktualizacj\u0119 w rozwoju platformy &#8211; migracji z Akki do Apache Pekko &#8211; fork Akka 2.6.x, kt\u00f3ry zd\u0105\u017cy\u0142 ju\u017c przej\u015b\u0107 pewn\u0105 ewolucj\u0119 i wprowadzi\u0107 kilka w\u0142asnych pomys\u0142\u00f3w. Play 3.0 korzysta z Pekko i jego komponent\u00f3w HTTP, co sygnalizuje dalszy kierunek modernizacji infrastruktury frameworka. Jednak\u017ce dla aplikacji mocno zintegrowanych z Akk\u0105, zmiana ta mo\u017ce wymaga\u0107 pewnych wysi\u0142k\u00f3w migracyjnych. Aby wspom\u00f3c u\u017cytkownik\u00f3w w tym procesie, <a href=\"https:\/\/pekko.apache.org\/docs\/pekko\/current\/project\/migration-guides.html\">zesp\u00f3\u0142 Pekko udost\u0119pni\u0142 szczeg\u00f3\u0142owy przewodnik migracyjny<\/a>, kt\u00f3ry nakre\u015bla potencjalne wyzwania. Wydano te\u017c Play 2.9, kt\u00f3ry kontynuuje wykorzystanie Akka i Akka HTTP (i tu rozwi\u0105zuje si\u0119 zagadka, dlaczego pojawi\u0142y si\u0119 dwa wydania na raz).<\/p>\n\n\n\n<p>Impuls do tego technologicznego zwrotu by\u0142 w du\u017cej mierze nap\u0119dzany nie sam\u0105 technologi\u0105, a kontrowersjami zwi\u0105zanymi z licencj\u0105, kt\u00f3re pojawi\u0142y si\u0119 po decyzji Lightbend o zmianie takowej dla Akki. Pod poprzedni\u0105 licencj\u0105, Apache 2.0, Akka by\u0142a swobodnie modyfikowalna i u\u017cywalna. Natomiast zrewidowana licencja Lightbend wprowadzi\u0142a komercyjn\u0105 licencj\u0119 dla niekt\u00f3rych funkcji Akka, przenosz\u0105c kod \u017ar\u00f3d\u0142owy na <a href=\"https:\/\/www.lightbend.com\/akka\/license\">Business Source License (BSL) 1.1<\/a>. Sytuacja jest bli\u017aniacza w stosunku do Terraforma, kt\u00f3ry r\u00f3wnie\u017c zdecydowa\u0142 si\u0119 na BSL.<\/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=\"Hitler Reacts to HashiCorp Transitioning to BSL\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/1J10xyPTE4I?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\">I niekt\u00f3rym si\u0119 to bardzo nie spodoba\u0142o&#8230; Uwaga: NSFW. Dodatkowo, \u017cadne przemy\u015blenia z filmiku nie s\u0105 oficjaln\u0105 lini\u0105 redakcyjn\u0105 \ud83d\ude04<\/figcaption><\/figure>\n\n\n\n<p>Zmiana w licencjonowaniu wywo\u0142a\u0142a siln\u0105 reakcj\u0119, szczeg\u00f3lnie w\u015br\u00f3d tych, kt\u00f3rzy zbudowali swoje aplikacje Play w oparciu o pe\u0142en zestaw funkcji Akki. Ci programi\u015bci stan\u0119li przed wyborem: musieli albo przebudowa\u0107 swoje aplikacje tak, aby pasowa\u0142y do ogranicze\u0144 wersji Akki dost\u0119pnej jako open source, naby\u0107 komercyjn\u0105 licencj\u0119 na pe\u0142en zestaw funkcji lub poszuka\u0107 alternatywnych rozwi\u0105za\u0144.<\/p>\n\n\n\n<p>Je\u015bli jeste\u015bcie ciekawi detali, Play wystosowa\u0142 oficjalne stanowisko dotycz\u0105ce zmiany licencji przez Akk\u0119, kt\u00f3re znajdziecie tutaj <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/General#How-Play-Deals-with-Akkas-License-Change\">How Play Deals with Akka\u2019s License Change<\/a>.<\/p>\n\n\n\n<p>Wr\u00f3\u0107my jednak do samych nowych premier. Wydania Play 2.9.0 i Play 3.0 s\u0105 szczeg\u00f3lnie godne uwagi, poniewa\u017c stanowi\u0105 zwie\u0144czenie niemal czteroletniego rozwoju kierowanego przez spo\u0142eczno\u015b\u0107 od momentu, gdy Lightbend Inc. przekaza\u0142 projekt w r\u0119ce spo\u0142eczno\u015bci. Aktualizacje koncentruj\u0105 si\u0119 na wsparciu dla zaktualizowanych j\u0119zyk\u00f3w programowania. Nowy Play (Play&#8217;e?) wprowadza kompatybilno\u015b\u0107 z Scala 3, ale tylko dla wersji 3.3.1 i nowszych, zwracaj\u0105c uwag\u0119 na potrzeb\u0119 krok\u00f3w migracyjnych przy jednoczesnym utrzymaniu wsparcia dla Scala 2.13. Porzucone zosta\u0142o te\u017c wsparcie dla Javy 8, i do dzia\u0142ania wymagana jest w tej chwili minimum Java 11.<\/p>\n\n\n\n<p>Ponadto, Play ko\u0144czy wsparcie dla przestarza\u0142ych wersji, takich jak Scala 2.12, sbt 0.13 i Java 8, dostosowuj\u0105c si\u0119 do swoich zale\u017cno\u015bci, kt\u00f3re ju\u017c nie obs\u0142uguj\u0105 tych edycji. W\u015br\u00f3d znacz\u0105cych aktualizacji bibliotek znalaz\u0142y si\u0119 Akka HTTP 10.2, aktualizacja do <code>Guice 6.0.0<\/code> i <code>Jackson 2.14<\/code>. Play udoskonali\u0142 swoje modu\u0142owe komponenty, takie jak <code>sbt-web<\/code> i <code>sbt-js-engine<\/code>, i przeszed\u0142 na <code>Jakarta Persistence API<\/code>, aby dostosowa\u0107 si\u0119 do zaktualizowanych wersji Hibernate i EclipseLink. Wprowadzono tak\u017ce troch\u0119 nowe funkcjonalno\u015bci zwi\u0105zanych z dzia\u0142aniem samego framework\u00f3w. Pe\u0142ne release notes <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/Highlights29\">znajdziecie tutaj<\/a>.<\/p>\n\n\n\n<p>Czy moim zdaniem w jest jeszcze na rynku miejsce dla Play Framework? S\u0105 we mnie dwa wilki. Z jednej strony, istnieje masa projekt\u00f3w, kt\u00f3re w dalszym ci\u0105gu go u\u017cywaj\u0105 (co udowodni\u0107 mo\u017ce cho\u0107by aktywna spo\u0142eczno\u015b\u0107 na OpenCollective). W \u015brodowisku Scalowym te\u017c nie pojawi\u0142a si\u0119 chyba jaka\u015b znacz\u0105ca konkurencja (Lagom te\u017c zd\u0105\u017cy\u0142 w mi\u0119dzyczasie umrze\u0107), a nawet je\u015bli, to pami\u0119\u0107 o Play wydaje si\u0119 by\u0107 tam bardzo silna. Cztery lata to jednak d\u0142ugo &#8211; w \u015bwiecie Javy pojawi\u0142a si\u0119 ca\u0142a generacja rozwi\u0105za\u0144, takich jak Micronaut czy Quarkus, kt\u00f3re skutecznie zagarn\u0119\u0142y rynek os\u00f3b zainteresowanych alternatyw\u0105 dla Springa. Podejrzewam wi\u0119c, \u017ce je\u017celi b\u0119dzie dalej aktywnie rozwijany, to Play raczej okopie si\u0119 w \u015bwiecie Scalowym. Trzymam jednak za niego kciuki &#8211; mam z nim wiele dobrych wspomnie\u0144.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"400\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6.png\" alt=\"\" class=\"wp-image-16986\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6.png 400w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6-300x300.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6-150x150.png 150w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><figcaption class=\"wp-element-caption\">Dalej mo\u017cemy by\u0107 przyjaci\u00f3\u0142mi, Play<\/figcaption><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>I mia\u0142o by\u0107 ju\u017c regularnie &#8211; ale zapomnia\u0142em sobie o Wszystkich \u015awi\u0119tych, a poprzedni\u0105 edycje &#8222;zakopa\u0142&#8221; brak ciekawszych informacji. Na szcz\u0119\u015bcie dzisiaj znowu mam dla Was sporo ciekawego.<\/p>\n","protected":false},"author":10,"featured_media":16996,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-16963","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"12","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.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>Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - 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\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - Vived\" \/>\n<meta property=\"og:description\" content=\"I mia\u0142o by\u0107 ju\u017c regularnie - ale zapomnia\u0142em sobie o Wszystkich \u015awi\u0119tych, a poprzedni\u0105 edycje &quot;zakopa\u0142&quot; brak ciekawszych informacji. Na szcz\u0119\u015bcie dzisiaj znowu mam dla Was sporo ciekawego.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-08T08:55:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-09T11:57:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.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\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w&#8230; i pozbywa Akki &#8211; JVM Weekly vol. 153\",\"datePublished\":\"2023-11-08T08:55:43+00:00\",\"dateModified\":\"2023-11-09T11:57:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\"},\"wordCount\":2402,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\",\"url\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\",\"name\":\"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png\",\"datePublished\":\"2023-11-08T08:55:43+00:00\",\"dateModified\":\"2023-11-09T11:57:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w&#8230; i pozbywa Akki &#8211; JVM Weekly vol. 153\"}]},{\"@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":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - 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\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/","og_locale":"pl_PL","og_type":"article","og_title":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - Vived","og_description":"I mia\u0142o by\u0107 ju\u017c regularnie - ale zapomnia\u0142em sobie o Wszystkich \u015awi\u0119tych, a poprzedni\u0105 edycje \"zakopa\u0142\" brak ciekawszych informacji. Na szcz\u0119\u015bcie dzisiaj znowu mam dla Was sporo ciekawego.","og_url":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/","og_site_name":"Vived","article_published_time":"2023-11-08T08:55:43+00:00","article_modified_time":"2023-11-09T11:57:59+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.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\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w&#8230; i pozbywa Akki &#8211; JVM Weekly vol. 153","datePublished":"2023-11-08T08:55:43+00:00","dateModified":"2023-11-09T11:57:59+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/"},"wordCount":2402,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/","url":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/","name":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w... i pozbywa Akki - JVM Weekly vol. 153 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png","datePublished":"2023-11-08T08:55:43+00:00","dateModified":"2023-11-09T11:57:59+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2-2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/play-framework-odradza-sie-jak-feniks-z-popiolow-i-pozbywa-akki-jvm-weekly-vol-153\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Play Framework odradza si\u0119 jak feniks z popio\u0142\u00f3w&#8230; i pozbywa Akki &#8211; JVM Weekly vol. 153"}]},{"@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. Bo dawno nie by\u0142o JEP-\u00f3w... no to nowe JEPy!<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. Bo dawno nie by\u0142o JEP-\u00f3w... no to nowe JEPy!<\/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\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No i mamy pierwsze odpryski projektu Leyden, pomimo, \u017ce sam JEP nie jest do niego na razie przypi\u0119ty - cho\u0107 mo\u017ce to po prostu jeszcze kwestia pozostawania w Drafcie. Mimo wszystko, jest na tyle interesuj\u0105cy, \u017ce postanawiam o nim wspomnie\u0107 ju\u017c na tak wczesnym etapie.<\/p>\n","innerContent":["\n<p>No i mamy pierwsze odpryski projektu Leyden, pomimo, \u017ce sam JEP nie jest do niego na razie przypi\u0119ty - cho\u0107 mo\u017ce to po prostu jeszcze kwestia pozostawania w Drafcie. Mimo wszystko, jest na tyle interesuj\u0105cy, \u017ce postanawiam o nim wspomnie\u0107 ju\u017c na tak wczesnym etapie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwija\u0107 ma JVM o mo\u017cliwo\u015b\u0107 wczytywania aplikacji i bibliotek, kt\u00f3re zosta\u0142y skompilowane do natywnego kodu Ahead of Time. Cel jest jak zawsze ostatnio - przyspieszenie start aplikacji i startow\u0105 wydajno\u015b\u0107 wykonania. Tw\u00f3rcy chc\u0105 przeciwdzia\u0142a\u0107 problemom z wydajno\u015bci\u0105, wynikaj\u0105cym z obecnego dynamicznego modelu wykonania w trzech etapach: wst\u0119pnego interpretowania (Tier 0), kompilacji C1 (Tier 3), a nast\u0119pnie C2 (Tier 4), gdzie etapy 1 i 2 dotycz\u0105 specjalnych przypadk\u00f3w kompilacji C1. Ca\u0142\u0105 operacje mo\u017cna by robi\u0107 od razu kompilatorem C2, ale realnie powodowa\u0142oby to d\u0142ugi \"rozruch\" optymalizowanej wersji. Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry przed Java 17 by\u0142 dost\u0119pnym zamiennikiem dla C2, ale jego uruchomienie negatywnie wp\u0142ywa\u0142o na aplikacj\u0119, poniewa\u017c on sam musia\u0142 zosta\u0107 skompilowany przed rozpocz\u0119ciem efektywnej pracy. Ponadto proces deoptymalizacji, kt\u00f3ry ma miejsce, gdy skompilowany przez C2 kod trafia na b\u0142\u0119dne za\u0142o\u017cenie optymalizacyjne, jest kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, a nast\u0119pnie odrzucony po ponownej kompilacji przez C2.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/openjdk.org\/jeps\/8313278\">JEP draft: Ahead of Time Compilation for the Java Virtual Machine<\/a> rozwija\u0107 ma JVM o mo\u017cliwo\u015b\u0107 wczytywania aplikacji i bibliotek, kt\u00f3re zosta\u0142y skompilowane do natywnego kodu Ahead of Time. Cel jest jak zawsze ostatnio - przyspieszenie start aplikacji i startow\u0105 wydajno\u015b\u0107 wykonania. Tw\u00f3rcy chc\u0105 przeciwdzia\u0142a\u0107 problemom z wydajno\u015bci\u0105, wynikaj\u0105cym z obecnego dynamicznego modelu wykonania w trzech etapach: wst\u0119pnego interpretowania (Tier 0), kompilacji C1 (Tier 3), a nast\u0119pnie C2 (Tier 4), gdzie etapy 1 i 2 dotycz\u0105 specjalnych przypadk\u00f3w kompilacji C1. Ca\u0142\u0105 operacje mo\u017cna by robi\u0107 od razu kompilatorem C2, ale realnie powodowa\u0142oby to d\u0142ugi \"rozruch\" optymalizowanej wersji. Dobrym przyk\u0142adem jest kompilator Graal, kt\u00f3ry przed Java 17 by\u0142 dost\u0119pnym zamiennikiem dla C2, ale jego uruchomienie negatywnie wp\u0142ywa\u0142o na aplikacj\u0119, poniewa\u017c on sam musia\u0142 zosta\u0107 skompilowany przed rozpocz\u0119ciem efektywnej pracy. Ponadto proces deoptymalizacji, kt\u00f3ry ma miejsce, gdy skompilowany przez C2 kod trafia na b\u0142\u0119dne za\u0142o\u017cenie optymalizacyjne, jest kosztowny, poniewa\u017c wariant profiluj\u0105cy C1 musi zosta\u0107 ponownie skompilowany, a nast\u0119pnie odrzucony po ponownej kompilacji przez C2.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sam draft jest bardzo WIP (nie posiada nawet pe\u0142nego opisu), ale b\u0119d\u0119 monitorowa\u0142 temat i na pewno do niego wr\u00f3cimy.<\/p>\n","innerContent":["\n<p>Sam draft jest bardzo WIP (nie posiada nawet pe\u0142nego opisu), ale b\u0119d\u0119 monitorowa\u0142 temat i na pewno do niego wr\u00f3cimy.<\/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\/461\">JEP 461: Stream Gatherers (Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/461\">JEP 461: Stream Gatherers (Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n","innerContent":["\n<p>Co si\u0119 stanie kiedy by\u0142y Tech Lead Akki, Viktor Klang, zaproponuje zmiany w Stream API? Wygl\u0105da na to, \u017ce dostajemy bardzo przemy\u015blan\u0105 propozycje kierunku, w kt\u00f3rym chyba najlepiej zaadoptowana w ostatniej dekadzie nowo\u015b\u0107 w j\u0119zyku mo\u017ce by\u0107 rozwijana.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy scan((sum, next) -&gt; sum + next). Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.<\/p>\n","innerContent":["\n<p>Chocia\u017c istniej\u0105cy interfejs Stream API oferuje ju\u017c bogaty zestaw operacji procesuj\u0105cych (jak <code>.map<\/code>, <code>.filter<\/code> ), istnia\u0142a potrzeba rozszerzenia go i takie jak <code>fixedWindow(2)<\/code> czy scan((sum, next) -&gt; sum + next). Propozycja Viktora wynika z powtarzaj\u0105cych si\u0119 pr\u00f3\u015bb o dodanie takich dodatkowych operacji do Stream API w Javie 8, kt\u00f3rych nie mo\u017cna by\u0142o spe\u0142ni\u0107, poniewa\u017c ich u\u017cycie by\u0142o zbyt w\u0105skie, aby umie\u015bci\u0107 je w podstawowym Stream API. Na ten moment nie istnieje jednak opcja, \u017ceby kto\u015b samodzielnie stworzy\u0142 sobie w\u0142asn\u0105 operacje procesuj\u0105c\u0105, jak to ma miejsce w przypadku interfejsu <code>Stream::collect<\/code>, w zwi\u0105zku z czym czasem okazuje si\u0119, \u017ce osi\u0105gni\u0119cie niekt\u00f3rych efekt\u00f3w jest zaskakuj\u0105co trudne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16970,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-2.png\" alt=\"\" class=\"wp-image-16970\"\/><figcaption class=\"wp-element-caption\">Za ka\u017cdym jednym razem...<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-2.png\" alt=\"\" class=\"wp-image-16970\"\/><figcaption class=\"wp-element-caption\">Za ka\u017cdym jednym razem...<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0107 ma do tworzenia w\u0142asnych operacja po\u015brednich, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe\u2026 ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c oryginalny dokument. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. \u017beby Wam to lepiej zwizualizowa\u0107, przyk\u0142adem gatherera jest np. metoda <code>fold<\/code>.<\/p>\n","innerContent":["\n<p>Nowy interfejs <code>Stream::gather<\/code> s\u0142u\u017cy\u0107 ma do tworzenia w\u0142asnych operacja po\u015brednich, zdolna do obs\u0142ugi wielu ich rodzaju. Viktor przeprowadzi\u0142 bowiem w swoim dokumencie <a href=\"https:\/\/cr.openjdk.org\/~vklang\/Gatherers.html\">Gathering the streams<\/a> wnikliw\u0105 klasyfikacje r\u00f3\u017cnego rodzaju przypadk\u00f3w u\u017cycia nowego API, opisuj\u0105cych r\u00f3\u017cne rodzaje operacji strumieniowych, takich jak operacje po\u015brednie, operacje przyrostowe, operacje stanowe, bezstanowe\u2026 ca\u0142o\u015b\u0107 naprawd\u0119 dobrze opisuje wspomniany ju\u017c oryginalny dokument. Gatherer, bo tak nazwany zosta\u0142 nowy interfejs, w swojej budowie bardzo przypomina dobrze znanego Collectora, na kt\u00f3rym zreszt\u0105 zosta\u0142 oparty. \u017beby Wam to lepiej zwizualizowa\u0107, przyk\u0142adem gatherera jest np. metoda <code>fold<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najwa\u017cniejsze metody nowego interfejsu to:<\/p>\n","innerContent":["\n<p>Najwa\u017cniejsze metody nowego interfejsu to:<\/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>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; initializer();\n    Gatherer.Integrator&lt;A,T,R&gt; integrator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n    (...)\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>\/** @param &lt;T&gt; the element type\n *  @param &lt;A&gt; the (mutable) intermediate accumulation type\n *  @param &lt;R&gt; the (probably immutable) final accumulation type\n *\/\ninterface Gatherer&lt;T,A,R&gt; {\n    Supplier&lt;A&gt; initializer();\n    Gatherer.Integrator&lt;A,T,R&gt; integrator();\n    BinaryOperator&lt;A&gt; combiner();\n    Function&lt;A, R&gt; finisher();\n    (...)\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego map na wsp\u00f3lnej abstrakcji:<\/p>\n","innerContent":["\n<p>Gatherer zosta\u0142 zaprojektowany, aby zapewni\u0107 mo\u017cliwo\u015b\u0107 kompozycji i reu\u017cywalno\u015bci poszczeg\u00f3lnych stworzonych z jego pomoc\u0105 komponent\u00f3w. Jako przyk\u0142ad mo\u017ce pos\u0142u\u017cy\u0107 implementacja znanego map na wsp\u00f3lnej abstrakcji:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code> public static &lt;T, R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n         return Gatherer.of(\n             (unused, element, downstream) -&gt; \/\/ integrator\n                 downstream.push(mapper.apply(element))\n         );\n     }\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code> public static &lt;T, R&gt; Gatherer&lt;T, ?, R&gt; map(Function&lt;? super T, ? extends R&gt; mapper) {\n         return Gatherer.of(\n             (unused, element, downstream) -&gt; \/\/ integrator\n                 downstream.push(mapper.apply(element))\n         );\n     }\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli jeste\u015bcie zainteresowani, bardzo dobre wprowadzenie wideo jak zwykle trafi\u0142o na kana\u0142 Inside Java.<\/p>\n","innerContent":["\n<p>Je\u015bli jeste\u015bcie zainteresowani, bardzo dobre wprowadzenie wideo jak zwykle trafi\u0142o na kana\u0142 Inside Java.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=epgJm2dZTSg","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=epgJm2dZTSg\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=epgJm2dZTSg\n<\/div><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/462\">JEP 462: Structured Concurrency (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tutaj mamy powt\u00f3rk\u0119 z rozrywki - Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 zosta\u0142a zaproponowana w JEP 428 i dostarczona w JDK 19 jako API inkubacyjne. Funkcjonalno\u015b\u0107 przesz\u0142a (z minimalnymi usprawnieniami pochodz\u0105cymi z wprowadzeniem Scope Values) \"drug\u0105 rund\u0119\" w inkubatorze w JDK 20 jako JEP 437. W JDK 21 trafi\u0142a za\u015b do fazy Preview. JDK 22 i JEP 462 nie wprowadzi za\u015b \u017cadnych zmian, samo API pozostanie jednak w Preview - spo\u0142eczno\u015b\u0107 uczy si\u0119 dopiero u\u017cywania Virtual Threads, potencjalnie wi\u0119c nie warto spieszy\u0107 si\u0119 ze zbyt szybk\u0105 stabilizacj\u0105 dodatkowych struktur kontrolnych dla nich.<\/p>\n","innerContent":["\n<p>Tutaj mamy powt\u00f3rk\u0119 z rozrywki - Strukturalna wsp\u00f3\u0142bie\u017cno\u015b\u0107 zosta\u0142a zaproponowana w JEP 428 i dostarczona w JDK 19 jako API inkubacyjne. Funkcjonalno\u015b\u0107 przesz\u0142a (z minimalnymi usprawnieniami pochodz\u0105cymi z wprowadzeniem Scope Values) \"drug\u0105 rund\u0119\" w inkubatorze w JDK 20 jako JEP 437. W JDK 21 trafi\u0142a za\u015b do fazy Preview. JDK 22 i JEP 462 nie wprowadzi za\u015b \u017cadnych zmian, samo API pozostanie jednak w Preview - spo\u0142eczno\u015b\u0107 uczy si\u0119 dopiero u\u017cywania Virtual Threads, potencjalnie wi\u0119c nie warto spieszy\u0107 si\u0119 ze zbyt szybk\u0105 stabilizacj\u0105 dodatkowych struktur kontrolnych dla nich.<\/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\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/openjdk.org\/jeps\/463\">JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JEP 463 wprowadza drug\u0105 wersj\u0119 koncepcji zaproponowanej w JEP 445, kt\u00f3rej celem jest uproszczenie procesu pisania \"hello world\" przez nowych programist\u00f3w Java i ma na pchn\u0105\u0107 Jav\u0119 w kierunku, by pocz\u0105tkuj\u0105cy mogli zaczyna\u0107 od prostych program\u00f3w z pojedyncz\u0105 klas\u0105, bez konieczno\u015bci rozumienia od takiego samego pocz\u0105tku bardziej skomplikowanych funkcji przeznaczonych dla wi\u0119kszych projekt\u00f3w. Mo\u017cliwe ma wi\u0119c zosta\u0107 uproszczone deklarowanie program\u00f3w, co pozwali uczniom na naturalny post\u0119p do bardziej zaawansowanych aspekt\u00f3w Javy w miar\u0119 rozwijania ich umiej\u0119tno\u015bci.<\/p>\n","innerContent":["\n<p>JEP 463 wprowadza drug\u0105 wersj\u0119 koncepcji zaproponowanej w JEP 445, kt\u00f3rej celem jest uproszczenie procesu pisania \"hello world\" przez nowych programist\u00f3w Java i ma na pchn\u0105\u0107 Jav\u0119 w kierunku, by pocz\u0105tkuj\u0105cy mogli zaczyna\u0107 od prostych program\u00f3w z pojedyncz\u0105 klas\u0105, bez konieczno\u015bci rozumienia od takiego samego pocz\u0105tku bardziej skomplikowanych funkcji przeznaczonych dla wi\u0119kszych projekt\u00f3w. Mo\u017cliwe ma wi\u0119c zosta\u0107 uproszczone deklarowanie program\u00f3w, co pozwali uczniom na naturalny post\u0119p do bardziej zaawansowanych aspekt\u00f3w Javy w miar\u0119 rozwijania ich umiej\u0119tno\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tym razem jednak zmian jest ca\u0142kiem sporo. Pierwotna idea klas bez nazwy zosta\u0142y zrewidowane. Zamiast dodawa\u0107 wsparcie dla klas bez nazwy, je\u015bli nie zdefiniujemy klasy w spos\u00f3b jawny, ta otrzyma nazw\u0119 wybran\u0105 przez system i b\u0119dzie funkcjonowa\u0107 jako normalna klasa najwy\u017cszego poziomu.<\/p>\n","innerContent":["\n<p>Tym razem jednak zmian jest ca\u0142kiem sporo. Pierwotna idea klas bez nazwy zosta\u0142y zrewidowane. Zamiast dodawa\u0107 wsparcie dla klas bez nazwy, je\u015bli nie zdefiniujemy klasy w spos\u00f3b jawny, ta otrzyma nazw\u0119 wybran\u0105 przez system i b\u0119dzie funkcjonowa\u0107 jako normalna klasa najwy\u017cszego poziomu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16975,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-3.png\" alt=\"\" class=\"wp-image-16975\"\/><figcaption class=\"wp-element-caption\">Co ciekawe, w Polsce tak dzia\u0142a to te\u017c z dzie\u0107mi - je\u015bli rodzic sp\u00f3\u017ani si\u0119 z formalno\u015bciami, \"system\" mo\u017ce nada\u0107 dowolne imi\u0119. Warto wi\u0119c zadba\u0107 o godne imi\u0119 dla latoro\u015bli.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-3.png\" alt=\"\" class=\"wp-image-16975\"\/><figcaption class=\"wp-element-caption\">Co ciekawe, w Polsce tak dzia\u0142a to te\u017c z dzie\u0107mi - je\u015bli rodzic sp\u00f3\u017ani si\u0119 z formalno\u015bciami, \"system\" mo\u017ce nada\u0107 dowolne imi\u0119. Warto wi\u0119c zadba\u0107 o godne imi\u0119 dla latoro\u015bli.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poprzednia wersja wprowadza\u0142a te\u017c bardzo skomplikowany zestaw regu\u0142 wobec metod, kt\u00f3re kwalifikowa\u0142y si\u0119 jako <code>main<\/code> takiej klasy bez nazwy. Teraz wyb\u00f3r metody domy\u015blnie wykonywanej zosta\u0142a uproszczona do dwuetapowego procesu, kt\u00f3ry koncentruje si\u0119 na tym, czy kandyduj\u0105ca metoda <code>main<\/code> ma parametr <code>String[]<\/code>, bez \u017cadnej niejednoznaczno\u015bci wynikaj\u0105cej z ograniczenia, \u017ce klasa nie mo\u017ce deklarowa\u0107 zar\u00f3wno statycznej, jak i instancyjnej metody o tej samej nazwie i parametrach, kt\u00f3re znajdowa\u0142y si\u0119 w oryginalnej propozycji.<\/p>\n","innerContent":["\n<p>Poprzednia wersja wprowadza\u0142a te\u017c bardzo skomplikowany zestaw regu\u0142 wobec metod, kt\u00f3re kwalifikowa\u0142y si\u0119 jako <code>main<\/code> takiej klasy bez nazwy. Teraz wyb\u00f3r metody domy\u015blnie wykonywanej zosta\u0142a uproszczona do dwuetapowego procesu, kt\u00f3ry koncentruje si\u0119 na tym, czy kandyduj\u0105ca metoda <code>main<\/code> ma parametr <code>String[]<\/code>, bez \u017cadnej niejednoznaczno\u015bci wynikaj\u0105cej z ograniczenia, \u017ce klasa nie mo\u017ce deklarowa\u0107 zar\u00f3wno statycznej, jak i instancyjnej metody o tej samej nazwie i parametrach, kt\u00f3re znajdowa\u0142y si\u0119 w oryginalnej propozycji.<\/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. Du\u017ce nowo\u015bci w ekosystemie Kotlina - K2 w Becie oraz stabilny Multiplatform<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Du\u017ce nowo\u015bci w ekosystemie Kotlina - K2 w Becie oraz stabilny Multiplatform<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zawsze twierdzi\u0142em, \u017ce wersje 1.x.20 w Kotlinie bywaj\u0105 ciekawsze od tych stabilnych. Najnowsza aktualizacja, <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-1-9-20-released\/\">Kotlin w wersji 1.9.20<\/a> to potwierdza, wprowadzaj\u0105c znacz\u0105cy post\u0119p w obu najwa\u017cniejszych projektach j\u0119zyka - kompilator K2 wszed\u0142 do fazy Beta dla wszystkich platform, a Kotlin Multiplatform osi\u0105gn\u0105\u0142 status stabilny. Roz\u0142\u00f3\u017cmy sobie wi\u0119c to wydanie na czynniki pierwsze.<\/p>\n","innerContent":["\n<p>Zawsze twierdzi\u0142em, \u017ce wersje 1.x.20 w Kotlinie bywaj\u0105 ciekawsze od tych stabilnych. Najnowsza aktualizacja, <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-1-9-20-released\/\">Kotlin w wersji 1.9.20<\/a> to potwierdza, wprowadzaj\u0105c znacz\u0105cy post\u0119p w obu najwa\u017cniejszych projektach j\u0119zyka - kompilator K2 wszed\u0142 do fazy Beta dla wszystkich platform, a Kotlin Multiplatform osi\u0105gn\u0105\u0142 status stabilny. Roz\u0142\u00f3\u017cmy sobie wi\u0119c to wydanie na czynniki pierwsze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Beta kompilatora K2 obejmuje platformy JVM, Native, JS i Wasm, ukazuj\u0105c gotowo\u015b\u0107 do szerszych test\u00f3w. Patrz\u0105c w przysz\u0142o\u015b\u0107, kolejny znacz\u0105cy kamie\u0144 milowy dla Kotlina to wersja 2.0.0, kt\u00f3ra b\u0119dzie zawiera\u0107 kompilator K2 ju\u017c jako w pe\u0142ni stabilny. JetBrains ju\u017c teraz zapowiedzia\u0142o zwi\u0119kszon\u0105 ilo\u015b\u0107 wyda\u0144 testowych wyda\u0144 prowadz\u0105cych do Kotlin 2.0, w tym kilka wersji Beta i Release Candidates (RC), aby szybko rozwi\u0105zywa\u0107 wszelkie problemy. Na ten moment celem jest zapewnienie kompatybilno\u015bci binarnej i unikni\u0119cie \"zatruwania\" binarnych plik\u00f3w skompilowanych K2 (sytuacji, gdy skompilowany kod z jednej wersji kompilatora wprowadza problemy, gdy jest u\u017cywany z binarkami skompilowanymi przez inn\u0105 wersj\u0119), co umo\u017cliwi u\u017cycie pochodz\u0105cych z niego artefakt\u00f3w r\u00f3wnie\u017c w \u015brodowiskach produkcyjnych. JetBrains deklaruje, \u017ce intensywnie testowa\u0142 kompilator, a u\u017cytkownicy s\u0105 zach\u0119cani do udzia\u0142u w jego dalszej stabilizacji, testuj\u0105c kompilator K2 w swoich projektach.<\/p>\n","innerContent":["\n<p>Beta kompilatora K2 obejmuje platformy JVM, Native, JS i Wasm, ukazuj\u0105c gotowo\u015b\u0107 do szerszych test\u00f3w. Patrz\u0105c w przysz\u0142o\u015b\u0107, kolejny znacz\u0105cy kamie\u0144 milowy dla Kotlina to wersja 2.0.0, kt\u00f3ra b\u0119dzie zawiera\u0107 kompilator K2 ju\u017c jako w pe\u0142ni stabilny. JetBrains ju\u017c teraz zapowiedzia\u0142o zwi\u0119kszon\u0105 ilo\u015b\u0107 wyda\u0144 testowych wyda\u0144 prowadz\u0105cych do Kotlin 2.0, w tym kilka wersji Beta i Release Candidates (RC), aby szybko rozwi\u0105zywa\u0107 wszelkie problemy. Na ten moment celem jest zapewnienie kompatybilno\u015bci binarnej i unikni\u0119cie \"zatruwania\" binarnych plik\u00f3w skompilowanych K2 (sytuacji, gdy skompilowany kod z jednej wersji kompilatora wprowadza problemy, gdy jest u\u017cywany z binarkami skompilowanymi przez inn\u0105 wersj\u0119), co umo\u017cliwi u\u017cycie pochodz\u0105cych z niego artefakt\u00f3w r\u00f3wnie\u017c w \u015brodowiskach produkcyjnych. JetBrains deklaruje, \u017ce intensywnie testowa\u0142 kompilator, a u\u017cytkownicy s\u0105 zach\u0119cani do udzia\u0142u w jego dalszej stabilizacji, testuj\u0105c kompilator K2 w swoich projektach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16990,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-8.png\" alt=\"\" class=\"wp-image-16990\"\/><figcaption class=\"wp-element-caption\">Unikalne zdj\u0119cie zrobione temporalnym aparatem fotograficznym, biuro JetBrains, po\u0142owa 2024<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-8.png\" alt=\"\" class=\"wp-image-16990\"\/><figcaption class=\"wp-element-caption\">Unikalne zdj\u0119cie zrobione temporalnym aparatem fotograficznym, biuro JetBrains, po\u0142owa 2024<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dodatkowo, w\u015br\u00f3d wa\u017cniejszych punkt\u00f3w tej aktualizacji znajduj\u0105 si\u0119 cho\u0107by znacznie lepsze wsparcie projekt\u00f3w wieloplatformowych, domy\u015blny niestandardowy alokator pami\u0119ci w Kotlin\/Native oraz usprawnienia wydajno\u015bci garbage collector'a w Kotlin\/Native. Dodatkowo, Kotlin\/Wasm wprowadzi\u0142 nowe cele i wsparcie dla najnowszego Wasm GC oraz wsparcie dla API WASI w swojej standardowej bibliotece. <\/p>\n","innerContent":["\n<p>Dodatkowo, w\u015br\u00f3d wa\u017cniejszych punkt\u00f3w tej aktualizacji znajduj\u0105 si\u0119 cho\u0107by znacznie lepsze wsparcie projekt\u00f3w wieloplatformowych, domy\u015blny niestandardowy alokator pami\u0119ci w Kotlin\/Native oraz usprawnienia wydajno\u015bci garbage collector'a w Kotlin\/Native. Dodatkowo, Kotlin\/Wasm wprowadzi\u0142 nowe cele i wsparcie dla najnowszego Wasm GC oraz wsparcie dla API WASI w swojej standardowej bibliotece. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=Ol_96CHKqg8","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=Ol_96CHKqg8\n<\/div><figcaption class=\"wp-element-caption\">Klasycznie, wszystkie nowo\u015bci dostaniecie te\u017c w wersji wideo.<\/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=Ol_96CHKqg8\n<\/div><figcaption class=\"wp-element-caption\">Klasycznie, wszystkie nowo\u015bci dostaniecie te\u017c w wersji wideo.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ale jak pisa\u0142em, to nie wszystko. Og\u0142oszono bowiem, \u017ce <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-multiplatform-stable\/\">Kotlin Multiplatform jest ju\u017c stabilny<\/a> i gotowy do u\u017cycia produkcyjnego. Dla przypomnienia: cho\u0107 technologia ta umo\u017cliwia deweloperom wsp\u00f3\u0142dzielenie kodu mi\u0119dzy r\u00f3\u017cnymi platformami, to jednak szczeg\u00f3lnie skupia si\u0119 na programistach mobilnych. Kotlin Multiplatform (KMP) zaciera granice mi\u0119dzy rozwojem cross-platformowym a natywnym, umo\u017cliwiaj\u0105c deweloperom swobod\u0119 w zakresie ilo\u015bci wsp\u00f3\u0142dzielonego kodu i integracj\u0119 z ka\u017cdym projektem - Android, iOS, ale te\u017c serwer (cho\u0107 tu ilo\u015b\u0107 synergii jest mniejsza).<\/p>\n","innerContent":["\n<p>Ale jak pisa\u0142em, to nie wszystko. Og\u0142oszono bowiem, \u017ce <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-multiplatform-stable\/\">Kotlin Multiplatform jest ju\u017c stabilny<\/a> i gotowy do u\u017cycia produkcyjnego. Dla przypomnienia: cho\u0107 technologia ta umo\u017cliwia deweloperom wsp\u00f3\u0142dzielenie kodu mi\u0119dzy r\u00f3\u017cnymi platformami, to jednak szczeg\u00f3lnie skupia si\u0119 na programistach mobilnych. Kotlin Multiplatform (KMP) zaciera granice mi\u0119dzy rozwojem cross-platformowym a natywnym, umo\u017cliwiaj\u0105c deweloperom swobod\u0119 w zakresie ilo\u015bci wsp\u00f3\u0142dzielonego kodu i integracj\u0119 z ka\u017cdym projektem - Android, iOS, ale te\u017c serwer (cho\u0107 tu ilo\u015b\u0107 synergii jest mniejsza).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Trakcja jest, co mocno wida\u0107 po tym, jak ekosystem Kotlin Multiplatform ro\u015bnie:<\/p>\n","innerContent":["\n<p>Trakcja jest, co mocno wida\u0107 po tym, jak ekosystem Kotlin Multiplatform ro\u015bnie:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":16988,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-1024x364.png\" alt=\"\" class=\"wp-image-16988\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-7-1024x364.png\" alt=\"\" class=\"wp-image-16988\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p> Google ostatnimi czasy wspiera u\u017cytkownik\u00f3w KMP coraz to nowymi, eksperymentalnymi wersjami bibliotek Jetpack. Warto tu wspomnie\u0107 o nowej wersji <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/compose-multiplatform-1-5-10-release\/\">Compose Multiplatform 1.5.10<\/a>, kt\u00f3ra zgodna jest teraz stabilnym Kotlinem 1.9.20 daj\u0105c\u0105 mo\u017cliwo\u015b\u0107 pe\u0142nego wsp\u00f3\u0142dzielenia logiki i komponent\u00f3w interfejsu u\u017cytkownika - w tej chwili jest ju\u017c stabilna dla Androida i desktopu (JVM), z Alfa wsparciem dla iOS i eksperymentalnym dla web (Wasm). Aktualizacja ta wprowadza udoskonalone komponenty Material 3 dla wsp\u00f3lnego kodu, poprawki w polach tekstowych dla iOS, natywn\u0105 fizyk\u0119 przewijania z efektem \"rubber band\", interoperacyjno\u015b\u0107 z UIKit za pomoc\u0105 animacji crossfade oraz zwi\u0119kszon\u0105 szybko\u015b\u0107 kompilacji dzi\u0119ki wsparciu dla cachowania kompilatora. Dodatkowo, wprowadzono wst\u0119pne wsparcie dla kompilatora K2, a tak\u017ce polepszono wydajno\u015b\u0107 renderowania na iOS.<\/p>\n","innerContent":["\n<p> Google ostatnimi czasy wspiera u\u017cytkownik\u00f3w KMP coraz to nowymi, eksperymentalnymi wersjami bibliotek Jetpack. Warto tu wspomnie\u0107 o nowej wersji <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/compose-multiplatform-1-5-10-release\/\">Compose Multiplatform 1.5.10<\/a>, kt\u00f3ra zgodna jest teraz stabilnym Kotlinem 1.9.20 daj\u0105c\u0105 mo\u017cliwo\u015b\u0107 pe\u0142nego wsp\u00f3\u0142dzielenia logiki i komponent\u00f3w interfejsu u\u017cytkownika - w tej chwili jest ju\u017c stabilna dla Androida i desktopu (JVM), z Alfa wsparciem dla iOS i eksperymentalnym dla web (Wasm). Aktualizacja ta wprowadza udoskonalone komponenty Material 3 dla wsp\u00f3lnego kodu, poprawki w polach tekstowych dla iOS, natywn\u0105 fizyk\u0119 przewijania z efektem \"rubber band\", interoperacyjno\u015b\u0107 z UIKit za pomoc\u0105 animacji crossfade oraz zwi\u0119kszon\u0105 szybko\u015b\u0107 kompilacji dzi\u0119ki wsparciu dla cachowania kompilatora. Dodatkowo, wprowadzono wst\u0119pne wsparcie dla kompilatora K2, a tak\u017ce polepszono wydajno\u015b\u0107 renderowania na iOS.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">3. Play Framework odradza si\u0119 jak Fenix z popio\u0142\u00f3w<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">3. Play Framework odradza si\u0119 jak Fenix z popio\u0142\u00f3w<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mieli\u015bmy niedawno Halloween, wi\u0119c tego typu obwieszczenia nie powinny nas dziwi\u0107 - martwy wraca z grobu. I tak, wiem, \u017ce ju\u017c mieli\u015bmy chwil\u0119 temu dost\u0119p do wersji preview, ale przyznam, \u017ce jest to dla mnie jeden z najbardziej zaskakuj\u0105cych powrot\u00f3w tego roku. Wci\u0105\u017c przecieram oczy. Kiedy wchodzi\u0142em w bran\u017c\u0119, Play by\u0142 jednym z g\u0142\u00f3wnych kontener\u00f3w do tytu\u0142u \"g\u0142\u00f3wny konkurent Springa\", i sam pisa\u0142em w nim nawet kilka serwis\u00f3w produkcyjnych. Tylko wiecie, jak wtedy rzuca\u0142em si\u0119 na wszystko, \u0142\u0105cznie z rzucaniem si\u0119 na kombinacje <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Groovy<\/a>\/<a href=\"https:\/\/www.youtube.com\/watch?v=I6mbnQeDO9Y\">Clojure<\/a> i <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Java EE<\/a>...<\/p>\n","innerContent":["\n<p>Mieli\u015bmy niedawno Halloween, wi\u0119c tego typu obwieszczenia nie powinny nas dziwi\u0107 - martwy wraca z grobu. I tak, wiem, \u017ce ju\u017c mieli\u015bmy chwil\u0119 temu dost\u0119p do wersji preview, ale przyznam, \u017ce jest to dla mnie jeden z najbardziej zaskakuj\u0105cych powrot\u00f3w tego roku. Wci\u0105\u017c przecieram oczy. Kiedy wchodzi\u0142em w bran\u017c\u0119, Play by\u0142 jednym z g\u0142\u00f3wnych kontener\u00f3w do tytu\u0142u \"g\u0142\u00f3wny konkurent Springa\", i sam pisa\u0142em w nim nawet kilka serwis\u00f3w produkcyjnych. Tylko wiecie, jak wtedy rzuca\u0142em si\u0119 na wszystko, \u0142\u0105cznie z rzucaniem si\u0119 na kombinacje <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Groovy<\/a>\/<a href=\"https:\/\/www.youtube.com\/watch?v=I6mbnQeDO9Y\">Clojure<\/a> i <a href=\"https:\/\/medium.com\/smart-up\/we-tried-groovy-ee-and-what-we-learned-from-it-5b78c8f963de\">Java EE<\/a>...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"id":16980,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-1024x297.png\" alt=\"\" class=\"wp-image-16980\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-5-1024x297.png\" alt=\"\" class=\"wp-image-16980\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>M\u0142odo\u015b\u0107 musi si\u0119 wyszale\u0107.<\/p>\n","innerContent":["\n<p>M\u0142odo\u015b\u0107 musi si\u0119 wyszale\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Niestety, w pewnym momencie tw\u00f3rcy rozwi\u0105zania - wtedy jeszcze Typesafe, dzi\u015b znany jako Lightbend - powoli przestawali mie\u0107 zainteresowanie tym rozwi\u0105zaniem, najpierw przerzucaj\u0105c je na Lagoma (pami\u0119ta kto\u015b jeszcze to rozwi\u0105zanie?), a potem na Akk\u0119 Serverless. Play <a href=\"https:\/\/www.lightbend.com\/blog\/on-the-future-of-play-framework\">w ko\u0144cu w 2021 roku<\/a> zosta\u0142 oddany spo\u0142eczno\u015bci, a piecz\u0119 nad nim przej\u0119li nad nim Matthias Kurz i Greg Methvin. I teraz, jak feniks z popio\u0142\u00f3w, po prawie 4 latach, pojawi\u0142y si\u0119 r\u00f3wnocze\u015bnie wydanie 2.9 i 3.0. Dlaczego a\u017c dwa? Za tym te\u017c stoi ciekawa historia.<\/p>\n","innerContent":["\n<p>Niestety, w pewnym momencie tw\u00f3rcy rozwi\u0105zania - wtedy jeszcze Typesafe, dzi\u015b znany jako Lightbend - powoli przestawali mie\u0107 zainteresowanie tym rozwi\u0105zaniem, najpierw przerzucaj\u0105c je na Lagoma (pami\u0119ta kto\u015b jeszcze to rozwi\u0105zanie?), a potem na Akk\u0119 Serverless. Play <a href=\"https:\/\/www.lightbend.com\/blog\/on-the-future-of-play-framework\">w ko\u0144cu w 2021 roku<\/a> zosta\u0142 oddany spo\u0142eczno\u015bci, a piecz\u0119 nad nim przej\u0119li nad nim Matthias Kurz i Greg Methvin. I teraz, jak feniks z popio\u0142\u00f3w, po prawie 4 latach, pojawi\u0142y si\u0119 r\u00f3wnocze\u015bnie wydanie 2.9 i 3.0. Dlaczego a\u017c dwa? Za tym te\u017c stoi ciekawa historia.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Play 3.0 przynosi kluczow\u0105 aktualizacj\u0119 w rozwoju platformy - migracji z Akki do Apache Pekko - fork Akka 2.6.x, kt\u00f3ry zd\u0105\u017cy\u0142 ju\u017c przej\u015b\u0107 pewn\u0105 ewolucj\u0119 i wprowadzi\u0107 kilka w\u0142asnych pomys\u0142\u00f3w. Play 3.0 korzysta z Pekko i jego komponent\u00f3w HTTP, co sygnalizuje dalszy kierunek modernizacji infrastruktury frameworka. Jednak\u017ce dla aplikacji mocno zintegrowanych z Akk\u0105, zmiana ta mo\u017ce wymaga\u0107 pewnych wysi\u0142k\u00f3w migracyjnych. Aby wspom\u00f3c u\u017cytkownik\u00f3w w tym procesie, <a href=\"https:\/\/pekko.apache.org\/docs\/pekko\/current\/project\/migration-guides.html\">zesp\u00f3\u0142 Pekko udost\u0119pni\u0142 szczeg\u00f3\u0142owy przewodnik migracyjny<\/a>, kt\u00f3ry nakre\u015bla potencjalne wyzwania. Wydano te\u017c Play 2.9, kt\u00f3ry kontynuuje wykorzystanie Akka i Akka HTTP (i tu rozwi\u0105zuje si\u0119 zagadka, dlaczego pojawi\u0142y si\u0119 dwa wydania na raz).<\/p>\n","innerContent":["\n<p>Play 3.0 przynosi kluczow\u0105 aktualizacj\u0119 w rozwoju platformy - migracji z Akki do Apache Pekko - fork Akka 2.6.x, kt\u00f3ry zd\u0105\u017cy\u0142 ju\u017c przej\u015b\u0107 pewn\u0105 ewolucj\u0119 i wprowadzi\u0107 kilka w\u0142asnych pomys\u0142\u00f3w. Play 3.0 korzysta z Pekko i jego komponent\u00f3w HTTP, co sygnalizuje dalszy kierunek modernizacji infrastruktury frameworka. Jednak\u017ce dla aplikacji mocno zintegrowanych z Akk\u0105, zmiana ta mo\u017ce wymaga\u0107 pewnych wysi\u0142k\u00f3w migracyjnych. Aby wspom\u00f3c u\u017cytkownik\u00f3w w tym procesie, <a href=\"https:\/\/pekko.apache.org\/docs\/pekko\/current\/project\/migration-guides.html\">zesp\u00f3\u0142 Pekko udost\u0119pni\u0142 szczeg\u00f3\u0142owy przewodnik migracyjny<\/a>, kt\u00f3ry nakre\u015bla potencjalne wyzwania. Wydano te\u017c Play 2.9, kt\u00f3ry kontynuuje wykorzystanie Akka i Akka HTTP (i tu rozwi\u0105zuje si\u0119 zagadka, dlaczego pojawi\u0142y si\u0119 dwa wydania na raz).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Impuls do tego technologicznego zwrotu by\u0142 w du\u017cej mierze nap\u0119dzany nie sam\u0105 technologi\u0105, a kontrowersjami zwi\u0105zanymi z licencj\u0105, kt\u00f3re pojawi\u0142y si\u0119 po decyzji Lightbend o zmianie takowej dla Akki. Pod poprzedni\u0105 licencj\u0105, Apache 2.0, Akka by\u0142a swobodnie modyfikowalna i u\u017cywalna. Natomiast zrewidowana licencja Lightbend wprowadzi\u0142a komercyjn\u0105 licencj\u0119 dla niekt\u00f3rych funkcji Akka, przenosz\u0105c kod \u017ar\u00f3d\u0142owy na <a href=\"https:\/\/www.lightbend.com\/akka\/license\">Business Source License (BSL) 1.1<\/a>. Sytuacja jest bli\u017aniacza w stosunku do Terraforma, kt\u00f3ry r\u00f3wnie\u017c zdecydowa\u0142 si\u0119 na BSL.<\/p>\n","innerContent":["\n<p>Impuls do tego technologicznego zwrotu by\u0142 w du\u017cej mierze nap\u0119dzany nie sam\u0105 technologi\u0105, a kontrowersjami zwi\u0105zanymi z licencj\u0105, kt\u00f3re pojawi\u0142y si\u0119 po decyzji Lightbend o zmianie takowej dla Akki. Pod poprzedni\u0105 licencj\u0105, Apache 2.0, Akka by\u0142a swobodnie modyfikowalna i u\u017cywalna. Natomiast zrewidowana licencja Lightbend wprowadzi\u0142a komercyjn\u0105 licencj\u0119 dla niekt\u00f3rych funkcji Akka, przenosz\u0105c kod \u017ar\u00f3d\u0142owy na <a href=\"https:\/\/www.lightbend.com\/akka\/license\">Business Source License (BSL) 1.1<\/a>. Sytuacja jest bli\u017aniacza w stosunku do Terraforma, kt\u00f3ry r\u00f3wnie\u017c zdecydowa\u0142 si\u0119 na BSL.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=1J10xyPTE4I","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=1J10xyPTE4I\n<\/div><figcaption class=\"wp-element-caption\">I niekt\u00f3rym si\u0119 to bardzo nie spodoba\u0142o... Uwaga: NSFW. Dodatkowo, \u017cadne przemy\u015blenia z filmiku nie s\u0105 oficjaln\u0105 lini\u0105 redakcyjn\u0105 \ud83d\ude04<\/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=1J10xyPTE4I\n<\/div><figcaption class=\"wp-element-caption\">I niekt\u00f3rym si\u0119 to bardzo nie spodoba\u0142o... Uwaga: NSFW. Dodatkowo, \u017cadne przemy\u015blenia z filmiku nie s\u0105 oficjaln\u0105 lini\u0105 redakcyjn\u0105 \ud83d\ude04<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zmiana w licencjonowaniu wywo\u0142a\u0142a siln\u0105 reakcj\u0119, szczeg\u00f3lnie w\u015br\u00f3d tych, kt\u00f3rzy zbudowali swoje aplikacje Play w oparciu o pe\u0142en zestaw funkcji Akki. Ci programi\u015bci stan\u0119li przed wyborem: musieli albo przebudowa\u0107 swoje aplikacje tak, aby pasowa\u0142y do ogranicze\u0144 wersji Akki dost\u0119pnej jako open source, naby\u0107 komercyjn\u0105 licencj\u0119 na pe\u0142en zestaw funkcji lub poszuka\u0107 alternatywnych rozwi\u0105za\u0144.<\/p>\n","innerContent":["\n<p>Zmiana w licencjonowaniu wywo\u0142a\u0142a siln\u0105 reakcj\u0119, szczeg\u00f3lnie w\u015br\u00f3d tych, kt\u00f3rzy zbudowali swoje aplikacje Play w oparciu o pe\u0142en zestaw funkcji Akki. Ci programi\u015bci stan\u0119li przed wyborem: musieli albo przebudowa\u0107 swoje aplikacje tak, aby pasowa\u0142y do ogranicze\u0144 wersji Akki dost\u0119pnej jako open source, naby\u0107 komercyjn\u0105 licencj\u0119 na pe\u0142en zestaw funkcji lub poszuka\u0107 alternatywnych rozwi\u0105za\u0144.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u015bli jeste\u015bcie ciekawi detali, Play wystosowa\u0142 oficjalne stanowisko dotycz\u0105ce zmiany licencji przez Akk\u0119, kt\u00f3re znajdziecie tutaj <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/General#How-Play-Deals-with-Akkas-License-Change\">How Play Deals with Akka\u2019s License Change<\/a>.<\/p>\n","innerContent":["\n<p>Je\u015bli jeste\u015bcie ciekawi detali, Play wystosowa\u0142 oficjalne stanowisko dotycz\u0105ce zmiany licencji przez Akk\u0119, kt\u00f3re znajdziecie tutaj <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/General#How-Play-Deals-with-Akkas-License-Change\">How Play Deals with Akka\u2019s License Change<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wr\u00f3\u0107my jednak do samych nowych premier. Wydania Play 2.9.0 i Play 3.0 s\u0105 szczeg\u00f3lnie godne uwagi, poniewa\u017c stanowi\u0105 zwie\u0144czenie niemal czteroletniego rozwoju kierowanego przez spo\u0142eczno\u015b\u0107 od momentu, gdy Lightbend Inc. przekaza\u0142 projekt w r\u0119ce spo\u0142eczno\u015bci. Aktualizacje koncentruj\u0105 si\u0119 na wsparciu dla zaktualizowanych j\u0119zyk\u00f3w programowania. Nowy Play (Play'e?) wprowadza kompatybilno\u015b\u0107 z Scala 3, ale tylko dla wersji 3.3.1 i nowszych, zwracaj\u0105c uwag\u0119 na potrzeb\u0119 krok\u00f3w migracyjnych przy jednoczesnym utrzymaniu wsparcia dla Scala 2.13. Porzucone zosta\u0142o te\u017c wsparcie dla Javy 8, i do dzia\u0142ania wymagana jest w tej chwili minimum Java 11.<\/p>\n","innerContent":["\n<p>Wr\u00f3\u0107my jednak do samych nowych premier. Wydania Play 2.9.0 i Play 3.0 s\u0105 szczeg\u00f3lnie godne uwagi, poniewa\u017c stanowi\u0105 zwie\u0144czenie niemal czteroletniego rozwoju kierowanego przez spo\u0142eczno\u015b\u0107 od momentu, gdy Lightbend Inc. przekaza\u0142 projekt w r\u0119ce spo\u0142eczno\u015bci. Aktualizacje koncentruj\u0105 si\u0119 na wsparciu dla zaktualizowanych j\u0119zyk\u00f3w programowania. Nowy Play (Play'e?) wprowadza kompatybilno\u015b\u0107 z Scala 3, ale tylko dla wersji 3.3.1 i nowszych, zwracaj\u0105c uwag\u0119 na potrzeb\u0119 krok\u00f3w migracyjnych przy jednoczesnym utrzymaniu wsparcia dla Scala 2.13. Porzucone zosta\u0142o te\u017c wsparcie dla Javy 8, i do dzia\u0142ania wymagana jest w tej chwili minimum Java 11.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ponadto, Play ko\u0144czy wsparcie dla przestarza\u0142ych wersji, takich jak Scala 2.12, sbt 0.13 i Java 8, dostosowuj\u0105c si\u0119 do swoich zale\u017cno\u015bci, kt\u00f3re ju\u017c nie obs\u0142uguj\u0105 tych edycji. W\u015br\u00f3d znacz\u0105cych aktualizacji bibliotek znalaz\u0142y si\u0119 Akka HTTP 10.2, aktualizacja do <code>Guice 6.0.0<\/code> i <code>Jackson 2.14<\/code>. Play udoskonali\u0142 swoje modu\u0142owe komponenty, takie jak <code>sbt-web<\/code> i <code>sbt-js-engine<\/code>, i przeszed\u0142 na <code>Jakarta Persistence API<\/code>, aby dostosowa\u0107 si\u0119 do zaktualizowanych wersji Hibernate i EclipseLink. Wprowadzono tak\u017ce troch\u0119 nowe funkcjonalno\u015bci zwi\u0105zanych z dzia\u0142aniem samego framework\u00f3w. Pe\u0142ne release notes <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/Highlights29\">znajdziecie tutaj<\/a>.<\/p>\n","innerContent":["\n<p>Ponadto, Play ko\u0144czy wsparcie dla przestarza\u0142ych wersji, takich jak Scala 2.12, sbt 0.13 i Java 8, dostosowuj\u0105c si\u0119 do swoich zale\u017cno\u015bci, kt\u00f3re ju\u017c nie obs\u0142uguj\u0105 tych edycji. W\u015br\u00f3d znacz\u0105cych aktualizacji bibliotek znalaz\u0142y si\u0119 Akka HTTP 10.2, aktualizacja do <code>Guice 6.0.0<\/code> i <code>Jackson 2.14<\/code>. Play udoskonali\u0142 swoje modu\u0142owe komponenty, takie jak <code>sbt-web<\/code> i <code>sbt-js-engine<\/code>, i przeszed\u0142 na <code>Jakarta Persistence API<\/code>, aby dostosowa\u0107 si\u0119 do zaktualizowanych wersji Hibernate i EclipseLink. Wprowadzono tak\u017ce troch\u0119 nowe funkcjonalno\u015bci zwi\u0105zanych z dzia\u0142aniem samego framework\u00f3w. Pe\u0142ne release notes <a href=\"https:\/\/www.playframework.com\/documentation\/3.0.x\/Highlights29\">znajdziecie tutaj<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czy moim zdaniem w jest jeszcze na rynku miejsce dla Play Framework? S\u0105 we mnie dwa wilki. Z jednej strony, istnieje masa projekt\u00f3w, kt\u00f3re w dalszym ci\u0105gu go u\u017cywaj\u0105 (co udowodni\u0107 mo\u017ce cho\u0107by aktywna spo\u0142eczno\u015b\u0107 na OpenCollective). W \u015brodowisku Scalowym te\u017c nie pojawi\u0142a si\u0119 chyba jaka\u015b znacz\u0105ca konkurencja (Lagom te\u017c zd\u0105\u017cy\u0142 w mi\u0119dzyczasie umrze\u0107), a nawet je\u015bli, to pami\u0119\u0107 o Play wydaje si\u0119 by\u0107 tam bardzo silna. Cztery lata to jednak d\u0142ugo - w \u015bwiecie Javy pojawi\u0142a si\u0119 ca\u0142a generacja rozwi\u0105za\u0144, takich jak Micronaut czy Quarkus, kt\u00f3re skutecznie zagarn\u0119\u0142y rynek os\u00f3b zainteresowanych alternatyw\u0105 dla Springa. Podejrzewam wi\u0119c, \u017ce je\u017celi b\u0119dzie dalej aktywnie rozwijany, to Play raczej okopie si\u0119 w \u015bwiecie Scalowym. Trzymam jednak za niego kciuki - mam z nim wiele dobrych wspomnie\u0144.<\/p>\n","innerContent":["\n<p>Czy moim zdaniem w jest jeszcze na rynku miejsce dla Play Framework? S\u0105 we mnie dwa wilki. Z jednej strony, istnieje masa projekt\u00f3w, kt\u00f3re w dalszym ci\u0105gu go u\u017cywaj\u0105 (co udowodni\u0107 mo\u017ce cho\u0107by aktywna spo\u0142eczno\u015b\u0107 na OpenCollective). W \u015brodowisku Scalowym te\u017c nie pojawi\u0142a si\u0119 chyba jaka\u015b znacz\u0105ca konkurencja (Lagom te\u017c zd\u0105\u017cy\u0142 w mi\u0119dzyczasie umrze\u0107), a nawet je\u015bli, to pami\u0119\u0107 o Play wydaje si\u0119 by\u0107 tam bardzo silna. Cztery lata to jednak d\u0142ugo - w \u015bwiecie Javy pojawi\u0142a si\u0119 ca\u0142a generacja rozwi\u0105za\u0144, takich jak Micronaut czy Quarkus, kt\u00f3re skutecznie zagarn\u0119\u0142y rynek os\u00f3b zainteresowanych alternatyw\u0105 dla Springa. Podejrzewam wi\u0119c, \u017ce je\u017celi b\u0119dzie dalej aktywnie rozwijany, to Play raczej okopie si\u0119 w \u015bwiecie Scalowym. Trzymam jednak za niego kciuki - mam z nim wiele dobrych wspomnie\u0144.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":16986,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6.png\" alt=\"\" class=\"wp-image-16986\"\/><figcaption class=\"wp-element-caption\">Dalej mo\u017cemy by\u0107 przyjaci\u00f3\u0142mi, Play<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-6.png\" alt=\"\" class=\"wp-image-16986\"\/><figcaption class=\"wp-element-caption\">Dalej mo\u017cemy by\u0107 przyjaci\u00f3\u0142mi, Play<\/figcaption><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16963","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=16963"}],"version-history":[{"count":14,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16963\/revisions"}],"predecessor-version":[{"id":17005,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/16963\/revisions\/17005"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/16996"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=16963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=16963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=16963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}