{"id":17509,"date":"2024-01-11T12:41:01","date_gmt":"2024-01-11T11:41:01","guid":{"rendered":"https:\/\/vived.io\/?p=17509"},"modified":"2024-01-11T12:41:54","modified_gmt":"2024-01-11T11:41:54","slug":"1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/","title":{"rendered":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? &#8211; JVM Weekly vol. 160"},"content":{"rendered":"\n<h2 id=\"1-1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie\" data-num=1>1. 1BRC &#8211; Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie?<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Pym8geL.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Jak ju\u017c nie raz wspomina\u0142em, grudzie\u0144 zar\u00f3wno mnie, jak i wielu innym cz\u0142onkom naszej programistycznej spo\u0142eczno\u015bci, przebiega pod znakiem Advent of Code &#8211; programistycznego konkursu, w kt\u00f3rym ludzie rozwi\u0105zuj\u0105 ka\u017cdego poranka cz\u0119sto bardzo abstrakcyjne zadania. I o ile wi\u0119kszo\u015b\u0107 ludzi &#8211; tak jak zreszt\u0105 ja &#8211; walczy o to, \u017ceby utrzyma\u0107 tempo i nie odpa\u015b\u0107 przed ko\u0144cem, co wi\u0119kszo\u015bci &#8211; tak jak i zreszt\u0105 mnie \ud83e\udd72 &#8211; si\u0119 nie udaje, o tyle ka\u017cdego rodzaju zbiera si\u0119 te\u017c grono pasjonat\u00f3w. Ci s\u0105 ju\u017c tak znudzeni zajmowaniem szczytu leaderboardu, \u017ce staraj\u0105 si\u0119 ca\u0142\u0105 zabaw\u0119 dodatkowo utrudni\u0107, czy to poprzez optymalizacje ca\u0142o\u015bci, czy poprzez wykr\u0119cone wizualizacje (czemu na pewno sprzyjaj\u0105 wymy\u015blne &#8222;fabu\u0142y&#8221; poszczeg\u00f3lnych zada\u0144).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/IJ3xUFP.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy obrazek to nie \u017cart &#8211; to rzeczywisto\u015b\u0107. Potwierdzam z pierwszej r\u0119ki.<\/figcaption><\/figure><\/div>\n\n\n<p>Przychodzi jednak stycze\u0144, i wydawa\u0142oby si\u0119, \u017ce wszyscy wym\u0119czeni po grudniowych wyzwaniach. Jednak okaza\u0142o si\u0119, \u017ce gdy Gunar Morling og\u0142osi\u0142 <strong><a href=\"https:\/\/github.com\/gunnarmorling\/1brc\/\">The One Billion Row Challenge<\/a><\/strong>, to spo\u0142eczno\u015b\u0107 programistyczna obudzi\u0142a si\u0119 z zimowego snu i zdecydowa\u0142a jeszcze raz podnie\u015b\u0107 r\u0119kawic\u0119.<\/p>\n\n\n\n<p>Wyzwanie &#8222;Miliard Wierszy&#8221; (1BRC) to projekt maj\u0105cy na celu przetestowanie wydajno\u015bci nowoczesnego Java w przetwarzaniu du\u017cych zbior\u00f3w danych, dok\u0142adnie miliarda wierszy z pliku tekstowego. Uczestnicy mog\u0105 wykorzysta\u0107 wszystkie dost\u0119pne \u015brodki, takie jak w\u0105tki wirtualne, SIMD, optymalizacj\u0119 GC i inne triki, aby stworzy\u0107 najszybsz\u0105 implementacj\u0119 tego zadania. Plik tekstowy zawiera dane temperatury z r\u00f3\u017cnych stacji meteorologicznych, a ka\u017cdy wiersz sk\u0142ada si\u0119 z nazwy stacji i pomiaru temperatury z dok\u0142adno\u015bci\u0105 do jednego miejsca po przecinku. Zadanie polega na napisaniu programu w Java, kt\u00f3ry odczyta plik, obliczy minimaln\u0105, \u015bredni\u0105 i maksymaln\u0105 temperatur\u0119 dla ka\u017cdej stacji, a nast\u0119pnie wy\u015bwietli wyniki.<\/p>\n\n\n\n<p>Do udzia\u0142u w wyzwaniu wymagane jest u\u017cywanie Java 21, cho\u0107 nie wyobra\u017cam sobie raczej sytuacji, w kt\u00f3rej kto\u015b \u015bwiadomie b\u0119dzie chcia\u0142 wykorzysta\u0107 starsz\u0105 &#8211; chyba \u017ce w\u0142a\u015bnie jako challenge. Uczestnicy musz\u0105 wczyta\u0107 plik z danymi, a nast\u0119pnie obliczy\u0107 \u015brednie warto\u015bci temperatur. Mo\u017cliwe jest dowolne optymalizowanie programu, z zachowaniem okre\u015blonych zasad, a same wyniki b\u0119d\u0105 oceniane na podstawie \u015bredniej z trzech pr\u00f3b na dedykowanym serwerze. Uczestnicy mog\u0105 wykorzysta\u0107 dowoln\u0105 dystrybucje OpenJDK (ju\u017c widz\u0119 przestrze\u0144 dla ka\u017cdego z vendor\u00f3w), jednak nie mog\u0105 u\u017cywa\u0107 zewn\u0119trznych bibliotek i musz\u0105 dostarczy\u0107 implementacj\u0119 w pojedynczym pliku \u017ar\u00f3d\u0142owym. Wyzwanie jest otwarte do ko\u0144ca stycznia 2024 roku.<\/p>\n\n\n\n<p>Dla mnie ca\u0142a sytuacja jest dowodem na dwie rzeczy. Po pierwsze, programi\u015bci lubi\u0105 wyzwania, por\u00f3wnywanie mi\u0119dzy sob\u0105 rozwi\u0105za\u0144 &#8211; ale to chyba nie jest dla nikogo zaskoczeniem. Druga obserwacja jest nieco innej natury &#8211; ca\u0142a ta otoczka \u015bwi\u0105teczna w Advent Of Cod\u0119 jest fajnym, buduj\u0105cym klimat dodatkiem, ale zdecydowanie nie jest niezb\u0119dna. Nawet wydawa\u0142oby si\u0119 banalne zadanie (wczytanie danych) mo\u017ce trafi\u0107 na podatny grunt, je\u015bli tylko b\u0119dzie wystarczaj\u0105co wymagaj\u0105ce, aby m\u00f3c si\u0119 &#8222;wy\u017cy\u0107&#8221;. Na ten moment ju\u017c ponad 100 os\u00f3b zaproponowa\u0142o swoje rozwi\u0105zania.<\/p>\n\n\n\n<p>I jeszcze jedno nawi\u0105zanie do przesz\u0142o\u015bci &#8211; tydzie\u0144 temu w moim podsumowaniu rocznym z\u017cyma\u0142em si\u0119, \u017ce Java trafia na j\u0119zyki spo\u0142eczno\u015bci programist\u00f3w tylko wtedy, gdy mamy dram\u0119 pokroju zmiany pricingu czy Log4Shell. Dlatego serce ro\u015bnie kiedy cz\u0142owiek widzi, \u017ce r\u00f3wnie\u017c ambitniejsze kwestie, pokroju Billion-Rows-Challenge potrafi\u0105 przebi\u0107 si\u0119 do szerszej \u015bwiadomo\u015bci.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/6SXnJbq.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Inicjatywa Gunnara trafi\u0142a bowiem min. na sam\u0105 g\u00f3r\u0119 Hacker News.<\/figcaption><\/figure><\/div>\n\n\n<p>Na moment pisania tego tekstu, doczeka\u0142a si\u0119 ona dw\u00f3ch tysi\u0119cy gwiazdek na GitHubie i ponad setki proponowanych rozwi\u0105za\u0144, w tym min. od Thomasa Wuerthingera, tw\u00f3rcy GraalVM. Prowadzi obecnie Roy van Rijn, za\u0142o\u017cyciel JUG Rotterdam. Polecam zapozna\u0107 si\u0119 <a href=\"https:\/\/github.com\/gunnarmorling\/1brc\">z list\u0105 rozwi\u0105za\u0144<\/a> &#8211; im wy\u017cej g\u00f3ry listy, tym wi\u0119ksza czarna magia si\u0119 tam odbywa.<\/p>\n\n\n\n<p>Co ciekawe, do zabawy przy\u0142\u0105czaj\u0105 si\u0119 ludzie z innych j\u0119zyk\u00f3w programowania i pr\u00f3buj\u0105 swoich si\u0142 w kontrze z rozwi\u0105zaniami w Javie. To wyj\u015bcie z banieczki bardzo cieszy &#8211; wierz\u0119, \u017ce takie inicjatywy najlepiej pokazuj\u0105, jak bardzo Java ewoluowa\u0142a w ostatnich latach i \u017ce jest to j\u0119zyk, kt\u00f3ry nie ust\u0119puje innym, modnym rozwi\u0105zaniom je\u015bli chodzi o mo\u017cliwo\u015bci pracy na wielkich zbiorach danych.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"2-release-radar\" data-num=2>2. Release Radar<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/qzLcGcI.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/gitlab.com\/ppopescu\/phoenix-template-engine\">Phoenix &#8211; a modern template engine for Spring<\/a><\/h3>\n\n\n\n<p>Radar zaczniemy sobie dzisiaj od ciekawego projektu Springowego.<\/p>\n\n\n\n<p>Phoenix Template Engine to pozostaj\u0105cy we wczesnej fazie rozwoju, eksperymentalny silnik szablon\u00f3w. Ma na celu u\u0142atwienie tworzenia z\u0142o\u017conych aplikacji internetowych poprzez dostarczenie \u0142atwej w u\u017cyciu i zrozumia\u0142ej sk\u0142adni do templatingu kodu HTML generowanego po stronie backendu &#8211; tak zwanego Server-Side-Rendering (SSR).<\/p>\n\n\n\n<p>Phoenix wyr\u00f3\u017cnia si\u0119 na tle innych dost\u0119pnych silnik\u00f3w szablon\u00f3w dla Springa tym, \u017ce u\u017cywa tylko jednego specjalnego znaku <code>@<\/code> do oddzielania kodu HTML od programowalnej cz\u0119\u015bci szablonu i umo\u017cliwia bezpo\u015brednie u\u017cycie Java w szablonie, eliminuj\u0105c potrzeb\u0119 nauki nowej sk\u0142adni j\u0119zyka. Phoenix umo\u017cliwia tworzenie szablon\u00f3w z u\u017cyciem konstruktor\u00f3w, importowanie klas Java, definiowanie zmiennych, p\u0119tli for, instrukcji warunkowych if, a tak\u017ce zabezpiecza inputy przed atakami CSRF. Dodatkowo chwali si\u0119 byciem szybszym i l\u017cejszy od Thymeleaf, dzi\u0119ki kompilacji plik\u00f3w szablon\u00f3w.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/LX1Nkkq.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Aczkolwiek osobi\u015bcie zawsze mam obawy, kiedy s\u0142ysz\u0119 wyra\u017cenie &#8222;lekka&#8221; technologia.<\/figcaption><\/figure><\/div>\n\n\n<p>W beczce miodu jest \u0142y\u017cka dziegciu &#8211; ka\u017cdy kontroler wykorzystuj\u0105cy Phoenix musi dziedziczy\u0107 po klasie <code>PhoenixController<\/code>, co pewnie dla wielu os\u00f3b mo\u017ce by\u0107 przynajmniej \u017c\u00f3\u0142tym \u015bwiat\u0142em, ale za to daje kilka ca\u0142kiem interesuj\u0105cych mo\u017cliwo\u015bci. Jedn\u0105 z nich jest odwr\u00f3cony routing, kt\u00f3ry staje si\u0119 coraz popularniejszy we frameworkach frontentdowych. Oznacza to, \u017ce pozwala na dynamiczne tworzenie URL-i w naszych templatkach &#8211; zamiast na sztywno pisa\u0107 href=<code>\/uzytkownik\/profil\/123<\/code>, mo\u017cesz u\u017cy\u0107 funkcji odwr\u00f3conego routingu, aby wygenerowa\u0107 ten URL, podaj\u0105c nazw\u0119 konkretnego route i podanie parametru (np. ID u\u017cytkownika).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;a href=&quot;@routes.ProfileController.renderPage(123)&quot;&gt;Go to this page&lt;\/a&gt;<\/code><\/pre>\n\n\n\n<p>Ja sobie spokojnie poczekam na stabiln\u0105 wersje i si\u0119 pobawi\u0119. Tw\u00f3rcom \u017cycz\u0119 powodzenia w rozwoju projektu!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/KGbnNAy.png\" alt=\"\" style=\"width:949px;height:auto\"\/><figcaption class=\"wp-element-caption\">Wspomnienia: najgorszy kod kt\u00f3ry w \u017cyciu widzia\u0142em to w\u0142a\u015bnie templating, w kt\u00f3rym by\u0142 potr\u00f3jnie zagnie\u017cd\u017cony if w trzech r\u00f3\u017cnych technologiach &#8211; w tagu jsp by\u0142 scripplet javowy, kt\u00f3ry konkatenowa\u0142 stringi zawieraj\u0105ce JavaScript. Je\u015bli kto\u015b z teamu Phoenix przypadkiem to b\u0119dzie czyta\u0142 &#8211; uniknijcie tej pu\u0142apki.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/instancio\/instancio\">Instancio 4.0<\/a><\/h3>\n\n\n\n<p>Instancio to biblioteka, kt\u00f3ra automatycznie tworzy i wype\u0142nia obiekty danych testowych dla test\u00f3w jednostkowych. Zamiast r\u0119cznego przygotowywania danych testowych, Instancio pozwala na generowanie kompletnych obiekt\u00f3w (w tym zagnie\u017cd\u017conych) i kolekcji, za pomoc\u0105 jednej linijki kodu. Obiekty s\u0105 wype\u0142niane losowymi danymi, kt\u00f3re mog\u0105 by\u0107 odtworzone w przypadku b\u0142\u0119du w te\u015bcie.<\/p>\n\n\n\n<p>Kod jest podobno warty tysi\u0105ca akapit\u00f3w tekstu, wi\u0119c ca\u0142o\u015b\u0107 u\u017cywa si\u0119 w nast\u0119puj\u0105cy spos\u00f3b &#8211; zamiast:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Address address  = new Address();\naddress.setStreet(&quot;street&quot;);\naddress.setCity(&quot;city&quot;);\n\nPerson person = new Person();\nperson.setFirstName(&quot;first-name&quot;);\nperson.setLastName(&quot;last-name&quot;);\nperson.setAddress(address);\n<\/code><\/pre>\n\n\n\n<p>Mo\u017cna po prostu stworzy\u0107 taki obiekt za pomoc\u0105 poni\u017cszej fabryczki:<\/p>\n\n\n\n<p><code>Person person = Instancio.create(Person.class);<\/code><\/p>\n\n\n\n<p>Wersji 4.0 to dalsza rozbudowa przypadk\u00f3w brzegowych, w tym ulepszenie przypisywania metod, kt\u00f3re umo\u017cliwia dynamiczne wype\u0142nianie obiekt\u00f3w nawet bez odpowiadaj\u0105cych im p\u00f3l, co jest przydatne przy obiektach z dynamicznymi atrybutami. Dodano r\u00f3wnie\u017c wsparcie dla sekwencyjnych kolekcji w Java 21, co u\u0142atwia manipulacj\u0119 danymi. Nowe API do generowania produktu kartezja\u0144skiego pozwala na tworzenie skomplikowanych zestaw\u00f3w danych. Zmieniono tak\u017ce zachowanie generator\u00f3w stanowych w funkcji <code>stream()<\/code>, czyni\u0105c wygenerowane obiekty ca\u0142kowicie niezale\u017cnymi od siebie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/blog.jooq.org\/jooq-3-19s-new-explicit-and-implicit-to-many-path-joins\/\">jOOQ 3.19<\/a><\/h3>\n\n\n\n<p>Jedna z najpopularniejszych bibliotek do obs\u0142ugi SQL-a w Javie robi spory krok do przodu &#8211; jej darmowa wersja porzuca bowiem wsparcie dla Javy 1.8. To co prawda pozostanie, ale tylko dla u\u017cytkownik\u00f3w Enterprise Editon.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/tsPN7c0.png\" alt=\"\" style=\"width:612px;height:auto\"\/><\/figure><\/div>\n\n\n<p>Co wydaje si\u0119 by\u0107 uczciwym podej\u015bciem. Jak na kim\u015b zarabia\u0107, to w\u0142a\u015bnie na legacy projektach w firmach typu Enteprise &#8211; niech ten koszt wrzuc\u0105 w swoje fitness function architektury.<\/p>\n\n\n\n<p>A firmy b\u0119d\u0105 mia\u0142y zdecydowanie ch\u0119tk\u0119 na upgrade, poniewa\u017c jOOQ 3.19 przynosi te\u017c kilka naprawd\u0119 przydatnych funkcji:<\/p>\n\n\n\n<p><strong>Explicit Path Joins<\/strong> Funkcja umo\u017cliwia jawne deklarowanie \u015bcie\u017cek do\u0142\u0105cze\u0144 w zapytaniach<br>Przyk\u0142ad:<br><code>java&lt;br&gt;\nctx.select(CUSTOMER.FIRST_NAME, CUSTOMER.LAST_NAME, CUSTOMER.address().city().country().NAME)&lt;br&gt;\n.from(CUSTOMER)&lt;br&gt;\n.leftJoin(CUSTOMER.address().city().country())&lt;br&gt;\n.fetch();&lt;br&gt;\n<\/code><\/p>\n\n\n\n<p><strong>To-Many Path Joins<\/strong>: Funkcja obs\u0142uguje do\u0142\u0105czenia jeden-do-wielu przy u\u017cyciu \u015bcie\u017cek<br><code>java&lt;br&gt;\nctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME, ACTOR.film().TITLE)&lt;br&gt;\n.from(ACTOR)&lt;br&gt;\n.leftJoin(ACTOR.film())&lt;br&gt;\n.fetch();&lt;br&gt;\n<\/code><\/p>\n\n\n\n<p><strong>Implicit Join Path Correlation<\/strong>: Funkcja u\u0142atwia korelowanie podzapyta\u0144 z zewn\u0119trznymi zapytaniami za pomoc\u0105 \u015bcie\u017cek<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n  .from(ACTOR)\n  .where(exists(\n      selectOne()\n      .from(ACTOR.film())\n      .where(ACTOR.film().TITLE.like(&quot;A%&quot;))\n  ))\n  .fetch();\n<\/code><\/pre>\n\n\n\n<p>Ka\u017cda z tych funkcji u\u0142atwia tworzenie z\u0142o\u017conych zapyta\u0144 SQL, poprawiaj\u0105c czytelno\u015b\u0107 kodu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj jeszcze ca\u0142y \u015bwiat si\u0119 rozp\u0119dza, ale dzi\u0119ki temu mog\u0119 podzieli\u0107 si\u0119 z Wami bardzo fajn\u0105 inicjatyw\u0105 dla chc\u0105cych si\u0119 spr\u00f3bowa\u0107 z najlepszymi ekspertami w bran\u017cy.<\/p>\n","protected":false},"author":10,"featured_media":17511,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-17509","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"7","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-4.jpg","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>1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - 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\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj jeszcze ca\u0142y \u015bwiat si\u0119 rozp\u0119dza, ale dzi\u0119ki temu mog\u0119 podzieli\u0107 si\u0119 z Wami bardzo fajn\u0105 inicjatyw\u0105 dla chc\u0105cych si\u0119 spr\u00f3bowa\u0107 z najlepszymi ekspertami w bran\u017cy.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-11T11:41:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-11T11:41:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? &#8211; JVM Weekly vol. 160\",\"datePublished\":\"2024-01-11T11:41:01+00:00\",\"dateModified\":\"2024-01-11T11:41:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\"},\"wordCount\":1445,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\",\"url\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\",\"name\":\"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg\",\"datePublished\":\"2024-01-11T11:41:01+00:00\",\"dateModified\":\"2024-01-11T11:41:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? &#8211; JVM Weekly vol. 160\"}]},{\"@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":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - 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\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/","og_locale":"pl_PL","og_type":"article","og_title":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - Vived","og_description":"Dzisiaj jeszcze ca\u0142y \u015bwiat si\u0119 rozp\u0119dza, ale dzi\u0119ki temu mog\u0119 podzieli\u0107 si\u0119 z Wami bardzo fajn\u0105 inicjatyw\u0105 dla chc\u0105cych si\u0119 spr\u00f3bowa\u0107 z najlepszymi ekspertami w bran\u017cy.","og_url":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/","og_site_name":"Vived","article_published_time":"2024-01-11T11:41:01+00:00","article_modified_time":"2024-01-11T11:41:54+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg","type":"image\/jpeg"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? &#8211; JVM Weekly vol. 160","datePublished":"2024-01-11T11:41:01+00:00","dateModified":"2024-01-11T11:41:54+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/"},"wordCount":1445,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/","url":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/","name":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? - JVM Weekly vol. 160 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg","datePublished":"2024-01-11T11:41:01+00:00","dateModified":"2024-01-11T11:41:54+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Linkedin-post-1200x675-3.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/1brc-kto-najszybciej-przetworzy-miliard-rekordow-w-javie-jvm-weekly-vol-160\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"1BRC: Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie? &#8211; JVM Weekly vol. 160"}]},{"@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. 1BRC - Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">1. 1BRC - Kto Najszybciej Przetworzy Miliard Rekord\u00f3w w Javie?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Pym8geL.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/Pym8geL.jpg\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak ju\u017c nie raz wspomina\u0142em, grudzie\u0144 zar\u00f3wno mnie, jak i wielu innym cz\u0142onkom naszej programistycznej spo\u0142eczno\u015bci, przebiega pod znakiem Advent of Code - programistycznego konkursu, w kt\u00f3rym ludzie rozwi\u0105zuj\u0105 ka\u017cdego poranka cz\u0119sto bardzo abstrakcyjne zadania. I o ile wi\u0119kszo\u015b\u0107 ludzi - tak jak zreszt\u0105 ja - walczy o to, \u017ceby utrzyma\u0107 tempo i nie odpa\u015b\u0107 przed ko\u0144cem, co wi\u0119kszo\u015bci - tak jak i zreszt\u0105 mnie \ud83e\udd72 - si\u0119 nie udaje, o tyle ka\u017cdego rodzaju zbiera si\u0119 te\u017c grono pasjonat\u00f3w. Ci s\u0105 ju\u017c tak znudzeni zajmowaniem szczytu leaderboardu, \u017ce staraj\u0105 si\u0119 ca\u0142\u0105 zabaw\u0119 dodatkowo utrudni\u0107, czy to poprzez optymalizacje ca\u0142o\u015bci, czy poprzez wykr\u0119cone wizualizacje (czemu na pewno sprzyjaj\u0105 wymy\u015blne \"fabu\u0142y\" poszczeg\u00f3lnych zada\u0144).<\/p>\n","innerContent":["\n<p>Jak ju\u017c nie raz wspomina\u0142em, grudzie\u0144 zar\u00f3wno mnie, jak i wielu innym cz\u0142onkom naszej programistycznej spo\u0142eczno\u015bci, przebiega pod znakiem Advent of Code - programistycznego konkursu, w kt\u00f3rym ludzie rozwi\u0105zuj\u0105 ka\u017cdego poranka cz\u0119sto bardzo abstrakcyjne zadania. I o ile wi\u0119kszo\u015b\u0107 ludzi - tak jak zreszt\u0105 ja - walczy o to, \u017ceby utrzyma\u0107 tempo i nie odpa\u015b\u0107 przed ko\u0144cem, co wi\u0119kszo\u015bci - tak jak i zreszt\u0105 mnie \ud83e\udd72 - si\u0119 nie udaje, o tyle ka\u017cdego rodzaju zbiera si\u0119 te\u017c grono pasjonat\u00f3w. Ci s\u0105 ju\u017c tak znudzeni zajmowaniem szczytu leaderboardu, \u017ce staraj\u0105 si\u0119 ca\u0142\u0105 zabaw\u0119 dodatkowo utrudni\u0107, czy to poprzez optymalizacje ca\u0142o\u015bci, czy poprzez wykr\u0119cone wizualizacje (czemu na pewno sprzyjaj\u0105 wymy\u015blne \"fabu\u0142y\" poszczeg\u00f3lnych zada\u0144).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/IJ3xUFP.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy obrazek to nie \u017cart - to rzeczywisto\u015b\u0107. Potwierdzam z pierwszej r\u0119ki.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/IJ3xUFP.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Powy\u017cszy obrazek to nie \u017cart - to rzeczywisto\u015b\u0107. Potwierdzam z pierwszej r\u0119ki.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przychodzi jednak stycze\u0144, i wydawa\u0142oby si\u0119, \u017ce wszyscy wym\u0119czeni po grudniowych wyzwaniach. Jednak okaza\u0142o si\u0119, \u017ce gdy Gunar Morling og\u0142osi\u0142 <strong><a href=\"https:\/\/github.com\/gunnarmorling\/1brc\/\">The One Billion Row Challenge<\/a><\/strong>, to spo\u0142eczno\u015b\u0107 programistyczna obudzi\u0142a si\u0119 z zimowego snu i zdecydowa\u0142a jeszcze raz podnie\u015b\u0107 r\u0119kawic\u0119.<\/p>\n","innerContent":["\n<p>Przychodzi jednak stycze\u0144, i wydawa\u0142oby si\u0119, \u017ce wszyscy wym\u0119czeni po grudniowych wyzwaniach. Jednak okaza\u0142o si\u0119, \u017ce gdy Gunar Morling og\u0142osi\u0142 <strong><a href=\"https:\/\/github.com\/gunnarmorling\/1brc\/\">The One Billion Row Challenge<\/a><\/strong>, to spo\u0142eczno\u015b\u0107 programistyczna obudzi\u0142a si\u0119 z zimowego snu i zdecydowa\u0142a jeszcze raz podnie\u015b\u0107 r\u0119kawic\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wyzwanie \"Miliard Wierszy\" (1BRC) to projekt maj\u0105cy na celu przetestowanie wydajno\u015bci nowoczesnego Java w przetwarzaniu du\u017cych zbior\u00f3w danych, dok\u0142adnie miliarda wierszy z pliku tekstowego. Uczestnicy mog\u0105 wykorzysta\u0107 wszystkie dost\u0119pne \u015brodki, takie jak w\u0105tki wirtualne, SIMD, optymalizacj\u0119 GC i inne triki, aby stworzy\u0107 najszybsz\u0105 implementacj\u0119 tego zadania. Plik tekstowy zawiera dane temperatury z r\u00f3\u017cnych stacji meteorologicznych, a ka\u017cdy wiersz sk\u0142ada si\u0119 z nazwy stacji i pomiaru temperatury z dok\u0142adno\u015bci\u0105 do jednego miejsca po przecinku. Zadanie polega na napisaniu programu w Java, kt\u00f3ry odczyta plik, obliczy minimaln\u0105, \u015bredni\u0105 i maksymaln\u0105 temperatur\u0119 dla ka\u017cdej stacji, a nast\u0119pnie wy\u015bwietli wyniki.<\/p>\n","innerContent":["\n<p>Wyzwanie \"Miliard Wierszy\" (1BRC) to projekt maj\u0105cy na celu przetestowanie wydajno\u015bci nowoczesnego Java w przetwarzaniu du\u017cych zbior\u00f3w danych, dok\u0142adnie miliarda wierszy z pliku tekstowego. Uczestnicy mog\u0105 wykorzysta\u0107 wszystkie dost\u0119pne \u015brodki, takie jak w\u0105tki wirtualne, SIMD, optymalizacj\u0119 GC i inne triki, aby stworzy\u0107 najszybsz\u0105 implementacj\u0119 tego zadania. Plik tekstowy zawiera dane temperatury z r\u00f3\u017cnych stacji meteorologicznych, a ka\u017cdy wiersz sk\u0142ada si\u0119 z nazwy stacji i pomiaru temperatury z dok\u0142adno\u015bci\u0105 do jednego miejsca po przecinku. Zadanie polega na napisaniu programu w Java, kt\u00f3ry odczyta plik, obliczy minimaln\u0105, \u015bredni\u0105 i maksymaln\u0105 temperatur\u0119 dla ka\u017cdej stacji, a nast\u0119pnie wy\u015bwietli wyniki.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Do udzia\u0142u w wyzwaniu wymagane jest u\u017cywanie Java 21, cho\u0107 nie wyobra\u017cam sobie raczej sytuacji, w kt\u00f3rej kto\u015b \u015bwiadomie b\u0119dzie chcia\u0142 wykorzysta\u0107 starsz\u0105 - chyba \u017ce w\u0142a\u015bnie jako challenge. Uczestnicy musz\u0105 wczyta\u0107 plik z danymi, a nast\u0119pnie obliczy\u0107 \u015brednie warto\u015bci temperatur. Mo\u017cliwe jest dowolne optymalizowanie programu, z zachowaniem okre\u015blonych zasad, a same wyniki b\u0119d\u0105 oceniane na podstawie \u015bredniej z trzech pr\u00f3b na dedykowanym serwerze. Uczestnicy mog\u0105 wykorzysta\u0107 dowoln\u0105 dystrybucje OpenJDK (ju\u017c widz\u0119 przestrze\u0144 dla ka\u017cdego z vendor\u00f3w), jednak nie mog\u0105 u\u017cywa\u0107 zewn\u0119trznych bibliotek i musz\u0105 dostarczy\u0107 implementacj\u0119 w pojedynczym pliku \u017ar\u00f3d\u0142owym. Wyzwanie jest otwarte do ko\u0144ca stycznia 2024 roku.<\/p>\n","innerContent":["\n<p>Do udzia\u0142u w wyzwaniu wymagane jest u\u017cywanie Java 21, cho\u0107 nie wyobra\u017cam sobie raczej sytuacji, w kt\u00f3rej kto\u015b \u015bwiadomie b\u0119dzie chcia\u0142 wykorzysta\u0107 starsz\u0105 - chyba \u017ce w\u0142a\u015bnie jako challenge. Uczestnicy musz\u0105 wczyta\u0107 plik z danymi, a nast\u0119pnie obliczy\u0107 \u015brednie warto\u015bci temperatur. Mo\u017cliwe jest dowolne optymalizowanie programu, z zachowaniem okre\u015blonych zasad, a same wyniki b\u0119d\u0105 oceniane na podstawie \u015bredniej z trzech pr\u00f3b na dedykowanym serwerze. Uczestnicy mog\u0105 wykorzysta\u0107 dowoln\u0105 dystrybucje OpenJDK (ju\u017c widz\u0119 przestrze\u0144 dla ka\u017cdego z vendor\u00f3w), jednak nie mog\u0105 u\u017cywa\u0107 zewn\u0119trznych bibliotek i musz\u0105 dostarczy\u0107 implementacj\u0119 w pojedynczym pliku \u017ar\u00f3d\u0142owym. Wyzwanie jest otwarte do ko\u0144ca stycznia 2024 roku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dla mnie ca\u0142a sytuacja jest dowodem na dwie rzeczy. Po pierwsze, programi\u015bci lubi\u0105 wyzwania, por\u00f3wnywanie mi\u0119dzy sob\u0105 rozwi\u0105za\u0144 - ale to chyba nie jest dla nikogo zaskoczeniem. Druga obserwacja jest nieco innej natury - ca\u0142a ta otoczka \u015bwi\u0105teczna w Advent Of Cod\u0119 jest fajnym, buduj\u0105cym klimat dodatkiem, ale zdecydowanie nie jest niezb\u0119dna. Nawet wydawa\u0142oby si\u0119 banalne zadanie (wczytanie danych) mo\u017ce trafi\u0107 na podatny grunt, je\u015bli tylko b\u0119dzie wystarczaj\u0105co wymagaj\u0105ce, aby m\u00f3c si\u0119 \"wy\u017cy\u0107\". Na ten moment ju\u017c ponad 100 os\u00f3b zaproponowa\u0142o swoje rozwi\u0105zania.<\/p>\n","innerContent":["\n<p>Dla mnie ca\u0142a sytuacja jest dowodem na dwie rzeczy. Po pierwsze, programi\u015bci lubi\u0105 wyzwania, por\u00f3wnywanie mi\u0119dzy sob\u0105 rozwi\u0105za\u0144 - ale to chyba nie jest dla nikogo zaskoczeniem. Druga obserwacja jest nieco innej natury - ca\u0142a ta otoczka \u015bwi\u0105teczna w Advent Of Cod\u0119 jest fajnym, buduj\u0105cym klimat dodatkiem, ale zdecydowanie nie jest niezb\u0119dna. Nawet wydawa\u0142oby si\u0119 banalne zadanie (wczytanie danych) mo\u017ce trafi\u0107 na podatny grunt, je\u015bli tylko b\u0119dzie wystarczaj\u0105co wymagaj\u0105ce, aby m\u00f3c si\u0119 \"wy\u017cy\u0107\". Na ten moment ju\u017c ponad 100 os\u00f3b zaproponowa\u0142o swoje rozwi\u0105zania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I jeszcze jedno nawi\u0105zanie do przesz\u0142o\u015bci - tydzie\u0144 temu w moim podsumowaniu rocznym z\u017cyma\u0142em si\u0119, \u017ce Java trafia na j\u0119zyki spo\u0142eczno\u015bci programist\u00f3w tylko wtedy, gdy mamy dram\u0119 pokroju zmiany pricingu czy Log4Shell. Dlatego serce ro\u015bnie kiedy cz\u0142owiek widzi, \u017ce r\u00f3wnie\u017c ambitniejsze kwestie, pokroju Billion-Rows-Challenge potrafi\u0105 przebi\u0107 si\u0119 do szerszej \u015bwiadomo\u015bci.<\/p>\n","innerContent":["\n<p>I jeszcze jedno nawi\u0105zanie do przesz\u0142o\u015bci - tydzie\u0144 temu w moim podsumowaniu rocznym z\u017cyma\u0142em si\u0119, \u017ce Java trafia na j\u0119zyki spo\u0142eczno\u015bci programist\u00f3w tylko wtedy, gdy mamy dram\u0119 pokroju zmiany pricingu czy Log4Shell. Dlatego serce ro\u015bnie kiedy cz\u0142owiek widzi, \u017ce r\u00f3wnie\u017c ambitniejsze kwestie, pokroju Billion-Rows-Challenge potrafi\u0105 przebi\u0107 si\u0119 do szerszej \u015bwiadomo\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/6SXnJbq.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Inicjatywa Gunnara trafi\u0142a bowiem min. na sam\u0105 g\u00f3r\u0119 Hacker News.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/6SXnJbq.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Inicjatywa Gunnara trafi\u0142a bowiem min. na sam\u0105 g\u00f3r\u0119 Hacker News.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na moment pisania tego tekstu, doczeka\u0142a si\u0119 ona dw\u00f3ch tysi\u0119cy gwiazdek na GitHubie i ponad setki proponowanych rozwi\u0105za\u0144, w tym min. od Thomasa Wuerthingera, tw\u00f3rcy GraalVM. Prowadzi obecnie Roy van Rijn, za\u0142o\u017cyciel JUG Rotterdam. Polecam zapozna\u0107 si\u0119 <a href=\"https:\/\/github.com\/gunnarmorling\/1brc\">z list\u0105 rozwi\u0105za\u0144<\/a> - im wy\u017cej g\u00f3ry listy, tym wi\u0119ksza czarna magia si\u0119 tam odbywa.<\/p>\n","innerContent":["\n<p>Na moment pisania tego tekstu, doczeka\u0142a si\u0119 ona dw\u00f3ch tysi\u0119cy gwiazdek na GitHubie i ponad setki proponowanych rozwi\u0105za\u0144, w tym min. od Thomasa Wuerthingera, tw\u00f3rcy GraalVM. Prowadzi obecnie Roy van Rijn, za\u0142o\u017cyciel JUG Rotterdam. Polecam zapozna\u0107 si\u0119 <a href=\"https:\/\/github.com\/gunnarmorling\/1brc\">z list\u0105 rozwi\u0105za\u0144<\/a> - im wy\u017cej g\u00f3ry listy, tym wi\u0119ksza czarna magia si\u0119 tam odbywa.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co ciekawe, do zabawy przy\u0142\u0105czaj\u0105 si\u0119 ludzie z innych j\u0119zyk\u00f3w programowania i pr\u00f3buj\u0105 swoich si\u0142 w kontrze z rozwi\u0105zaniami w Javie. To wyj\u015bcie z banieczki bardzo cieszy - wierz\u0119, \u017ce takie inicjatywy najlepiej pokazuj\u0105, jak bardzo Java ewoluowa\u0142a w ostatnich latach i \u017ce jest to j\u0119zyk, kt\u00f3ry nie ust\u0119puje innym, modnym rozwi\u0105zaniom je\u015bli chodzi o mo\u017cliwo\u015bci pracy na wielkich zbiorach danych.<\/p>\n","innerContent":["\n<p>Co ciekawe, do zabawy przy\u0142\u0105czaj\u0105 si\u0119 ludzie z innych j\u0119zyk\u00f3w programowania i pr\u00f3buj\u0105 swoich si\u0142 w kontrze z rozwi\u0105zaniami w Javie. To wyj\u015bcie z banieczki bardzo cieszy - wierz\u0119, \u017ce takie inicjatywy najlepiej pokazuj\u0105, jak bardzo Java ewoluowa\u0142a w ostatnich latach i \u017ce jest to j\u0119zyk, kt\u00f3ry nie ust\u0119puje innym, modnym rozwi\u0105zaniom je\u015bli chodzi o mo\u017cliwo\u015bci pracy na wielkich zbiorach danych.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">2. Release Radar<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">2. Release Radar<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/qzLcGcI.jpg\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/qzLcGcI.jpg\" alt=\"\"\/><\/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:\/\/gitlab.com\/ppopescu\/phoenix-template-engine\">Phoenix - a modern template engine for Spring<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/gitlab.com\/ppopescu\/phoenix-template-engine\">Phoenix - a modern template engine for Spring<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Radar zaczniemy sobie dzisiaj od ciekawego projektu Springowego.<\/p>\n","innerContent":["\n<p>Radar zaczniemy sobie dzisiaj od ciekawego projektu Springowego.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Phoenix Template Engine to pozostaj\u0105cy we wczesnej fazie rozwoju, eksperymentalny silnik szablon\u00f3w. Ma na celu u\u0142atwienie tworzenia z\u0142o\u017conych aplikacji internetowych poprzez dostarczenie \u0142atwej w u\u017cyciu i zrozumia\u0142ej sk\u0142adni do templatingu kodu HTML generowanego po stronie backendu - tak zwanego Server-Side-Rendering (SSR).<\/p>\n","innerContent":["\n<p>Phoenix Template Engine to pozostaj\u0105cy we wczesnej fazie rozwoju, eksperymentalny silnik szablon\u00f3w. Ma na celu u\u0142atwienie tworzenia z\u0142o\u017conych aplikacji internetowych poprzez dostarczenie \u0142atwej w u\u017cyciu i zrozumia\u0142ej sk\u0142adni do templatingu kodu HTML generowanego po stronie backendu - tak zwanego Server-Side-Rendering (SSR).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Phoenix wyr\u00f3\u017cnia si\u0119 na tle innych dost\u0119pnych silnik\u00f3w szablon\u00f3w dla Springa tym, \u017ce u\u017cywa tylko jednego specjalnego znaku <code>@<\/code> do oddzielania kodu HTML od programowalnej cz\u0119\u015bci szablonu i umo\u017cliwia bezpo\u015brednie u\u017cycie Java w szablonie, eliminuj\u0105c potrzeb\u0119 nauki nowej sk\u0142adni j\u0119zyka. Phoenix umo\u017cliwia tworzenie szablon\u00f3w z u\u017cyciem konstruktor\u00f3w, importowanie klas Java, definiowanie zmiennych, p\u0119tli for, instrukcji warunkowych if, a tak\u017ce zabezpiecza inputy przed atakami CSRF. Dodatkowo chwali si\u0119 byciem szybszym i l\u017cejszy od Thymeleaf, dzi\u0119ki kompilacji plik\u00f3w szablon\u00f3w.<\/p>\n","innerContent":["\n<p>Phoenix wyr\u00f3\u017cnia si\u0119 na tle innych dost\u0119pnych silnik\u00f3w szablon\u00f3w dla Springa tym, \u017ce u\u017cywa tylko jednego specjalnego znaku <code>@<\/code> do oddzielania kodu HTML od programowalnej cz\u0119\u015bci szablonu i umo\u017cliwia bezpo\u015brednie u\u017cycie Java w szablonie, eliminuj\u0105c potrzeb\u0119 nauki nowej sk\u0142adni j\u0119zyka. Phoenix umo\u017cliwia tworzenie szablon\u00f3w z u\u017cyciem konstruktor\u00f3w, importowanie klas Java, definiowanie zmiennych, p\u0119tli for, instrukcji warunkowych if, a tak\u017ce zabezpiecza inputy przed atakami CSRF. Dodatkowo chwali si\u0119 byciem szybszym i l\u017cejszy od Thymeleaf, dzi\u0119ki kompilacji plik\u00f3w szablon\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/LX1Nkkq.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Aczkolwiek osobi\u015bcie zawsze mam obawy, kiedy s\u0142ysz\u0119 wyra\u017cenie \"lekka\" technologia.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/LX1Nkkq.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Aczkolwiek osobi\u015bcie zawsze mam obawy, kiedy s\u0142ysz\u0119 wyra\u017cenie \"lekka\" technologia.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W beczce miodu jest \u0142y\u017cka dziegciu - ka\u017cdy kontroler wykorzystuj\u0105cy Phoenix musi dziedziczy\u0107 po klasie <code>PhoenixController<\/code>, co pewnie dla wielu os\u00f3b mo\u017ce by\u0107 przynajmniej \u017c\u00f3\u0142tym \u015bwiat\u0142em, ale za to daje kilka ca\u0142kiem interesuj\u0105cych mo\u017cliwo\u015bci. Jedn\u0105 z nich jest odwr\u00f3cony routing, kt\u00f3ry staje si\u0119 coraz popularniejszy we frameworkach frontentdowych. Oznacza to, \u017ce pozwala na dynamiczne tworzenie URL-i w naszych templatkach - zamiast na sztywno pisa\u0107 href=<code>\/uzytkownik\/profil\/123<\/code>, mo\u017cesz u\u017cy\u0107 funkcji odwr\u00f3conego routingu, aby wygenerowa\u0107 ten URL, podaj\u0105c nazw\u0119 konkretnego route i podanie parametru (np. ID u\u017cytkownika).<\/p>\n","innerContent":["\n<p>W beczce miodu jest \u0142y\u017cka dziegciu - ka\u017cdy kontroler wykorzystuj\u0105cy Phoenix musi dziedziczy\u0107 po klasie <code>PhoenixController<\/code>, co pewnie dla wielu os\u00f3b mo\u017ce by\u0107 przynajmniej \u017c\u00f3\u0142tym \u015bwiat\u0142em, ale za to daje kilka ca\u0142kiem interesuj\u0105cych mo\u017cliwo\u015bci. Jedn\u0105 z nich jest odwr\u00f3cony routing, kt\u00f3ry staje si\u0119 coraz popularniejszy we frameworkach frontentdowych. Oznacza to, \u017ce pozwala na dynamiczne tworzenie URL-i w naszych templatkach - zamiast na sztywno pisa\u0107 href=<code>\/uzytkownik\/profil\/123<\/code>, mo\u017cesz u\u017cy\u0107 funkcji odwr\u00f3conego routingu, aby wygenerowa\u0107 ten URL, podaj\u0105c nazw\u0119 konkretnego route i podanie parametru (np. ID u\u017cytkownika).<\/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>&lt;a href=\"@routes.ProfileController.renderPage(123)\">Go to this page&lt;\/a><\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>&lt;a href=\"@routes.ProfileController.renderPage(123)\">Go to this page&lt;\/a><\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ja sobie spokojnie poczekam na stabiln\u0105 wersje i si\u0119 pobawi\u0119. Tw\u00f3rcom \u017cycz\u0119 powodzenia w rozwoju projektu!<\/p>\n","innerContent":["\n<p>Ja sobie spokojnie poczekam na stabiln\u0105 wersje i si\u0119 pobawi\u0119. Tw\u00f3rcom \u017cycz\u0119 powodzenia w rozwoju projektu!<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":"949px","height":"auto"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/KGbnNAy.png\" alt=\"\" style=\"width:949px;height:auto\"\/><figcaption class=\"wp-element-caption\">Wspomnienia: najgorszy kod kt\u00f3ry w \u017cyciu widzia\u0142em to w\u0142a\u015bnie templating, w kt\u00f3rym by\u0142 potr\u00f3jnie zagnie\u017cd\u017cony if w trzech r\u00f3\u017cnych technologiach - w tagu jsp by\u0142 scripplet javowy, kt\u00f3ry konkatenowa\u0142 stringi zawieraj\u0105ce JavaScript. Je\u015bli kto\u015b z teamu Phoenix przypadkiem to b\u0119dzie czyta\u0142 - uniknijcie tej pu\u0142apki.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/KGbnNAy.png\" alt=\"\" style=\"width:949px;height:auto\"\/><figcaption class=\"wp-element-caption\">Wspomnienia: najgorszy kod kt\u00f3ry w \u017cyciu widzia\u0142em to w\u0142a\u015bnie templating, w kt\u00f3rym by\u0142 potr\u00f3jnie zagnie\u017cd\u017cony if w trzech r\u00f3\u017cnych technologiach - w tagu jsp by\u0142 scripplet javowy, kt\u00f3ry konkatenowa\u0142 stringi zawieraj\u0105ce JavaScript. Je\u015bli kto\u015b z teamu Phoenix przypadkiem to b\u0119dzie czyta\u0142 - uniknijcie tej pu\u0142apki.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/instancio\/instancio\">Instancio 4.0<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/instancio\/instancio\">Instancio 4.0<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Instancio to biblioteka, kt\u00f3ra automatycznie tworzy i wype\u0142nia obiekty danych testowych dla test\u00f3w jednostkowych. Zamiast r\u0119cznego przygotowywania danych testowych, Instancio pozwala na generowanie kompletnych obiekt\u00f3w (w tym zagnie\u017cd\u017conych) i kolekcji, za pomoc\u0105 jednej linijki kodu. Obiekty s\u0105 wype\u0142niane losowymi danymi, kt\u00f3re mog\u0105 by\u0107 odtworzone w przypadku b\u0142\u0119du w te\u015bcie.<\/p>\n","innerContent":["\n<p>Instancio to biblioteka, kt\u00f3ra automatycznie tworzy i wype\u0142nia obiekty danych testowych dla test\u00f3w jednostkowych. Zamiast r\u0119cznego przygotowywania danych testowych, Instancio pozwala na generowanie kompletnych obiekt\u00f3w (w tym zagnie\u017cd\u017conych) i kolekcji, za pomoc\u0105 jednej linijki kodu. Obiekty s\u0105 wype\u0142niane losowymi danymi, kt\u00f3re mog\u0105 by\u0107 odtworzone w przypadku b\u0142\u0119du w te\u015bcie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kod jest podobno warty tysi\u0105ca akapit\u00f3w tekstu, wi\u0119c ca\u0142o\u015b\u0107 u\u017cywa si\u0119 w nast\u0119puj\u0105cy spos\u00f3b - zamiast:<\/p>\n","innerContent":["\n<p>Kod jest podobno warty tysi\u0105ca akapit\u00f3w tekstu, wi\u0119c ca\u0142o\u015b\u0107 u\u017cywa si\u0119 w nast\u0119puj\u0105cy spos\u00f3b - zamiast:<\/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>Address address  = new Address();\naddress.setStreet(\"street\");\naddress.setCity(\"city\");\n\nPerson person = new Person();\nperson.setFirstName(\"first-name\");\nperson.setLastName(\"last-name\");\nperson.setAddress(address);\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>Address address  = new Address();\naddress.setStreet(\"street\");\naddress.setCity(\"city\");\n\nPerson person = new Person();\nperson.setFirstName(\"first-name\");\nperson.setLastName(\"last-name\");\nperson.setAddress(address);\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cna po prostu stworzy\u0107 taki obiekt za pomoc\u0105 poni\u017cszej fabryczki:<\/p>\n","innerContent":["\n<p>Mo\u017cna po prostu stworzy\u0107 taki obiekt za pomoc\u0105 poni\u017cszej fabryczki:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><code>Person person = Instancio.create(Person.class);<\/code><\/p>\n","innerContent":["\n<p><code>Person person = Instancio.create(Person.class);<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wersji 4.0 to dalsza rozbudowa przypadk\u00f3w brzegowych, w tym ulepszenie przypisywania metod, kt\u00f3re umo\u017cliwia dynamiczne wype\u0142nianie obiekt\u00f3w nawet bez odpowiadaj\u0105cych im p\u00f3l, co jest przydatne przy obiektach z dynamicznymi atrybutami. Dodano r\u00f3wnie\u017c wsparcie dla sekwencyjnych kolekcji w Java 21, co u\u0142atwia manipulacj\u0119 danymi. Nowe API do generowania produktu kartezja\u0144skiego pozwala na tworzenie skomplikowanych zestaw\u00f3w danych. Zmieniono tak\u017ce zachowanie generator\u00f3w stanowych w funkcji <code>stream()<\/code>, czyni\u0105c wygenerowane obiekty ca\u0142kowicie niezale\u017cnymi od siebie.<\/p>\n","innerContent":["\n<p>Wersji 4.0 to dalsza rozbudowa przypadk\u00f3w brzegowych, w tym ulepszenie przypisywania metod, kt\u00f3re umo\u017cliwia dynamiczne wype\u0142nianie obiekt\u00f3w nawet bez odpowiadaj\u0105cych im p\u00f3l, co jest przydatne przy obiektach z dynamicznymi atrybutami. Dodano r\u00f3wnie\u017c wsparcie dla sekwencyjnych kolekcji w Java 21, co u\u0142atwia manipulacj\u0119 danymi. Nowe API do generowania produktu kartezja\u0144skiego pozwala na tworzenie skomplikowanych zestaw\u00f3w danych. Zmieniono tak\u017ce zachowanie generator\u00f3w stanowych w funkcji <code>stream()<\/code>, czyni\u0105c wygenerowane obiekty ca\u0142kowicie niezale\u017cnymi od siebie.<\/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:\/\/blog.jooq.org\/jooq-3-19s-new-explicit-and-implicit-to-many-path-joins\/\">jOOQ 3.19<\/a><\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/blog.jooq.org\/jooq-3-19s-new-explicit-and-implicit-to-many-path-joins\/\">jOOQ 3.19<\/a><\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jedna z najpopularniejszych bibliotek do obs\u0142ugi SQL-a w Javie robi spory krok do przodu - jej darmowa wersja porzuca bowiem wsparcie dla Javy 1.8. To co prawda pozostanie, ale tylko dla u\u017cytkownik\u00f3w Enterprise Editon.<\/p>\n","innerContent":["\n<p>Jedna z najpopularniejszych bibliotek do obs\u0142ugi SQL-a w Javie robi spory krok do przodu - jej darmowa wersja porzuca bowiem wsparcie dla Javy 1.8. To co prawda pozostanie, ale tylko dla u\u017cytkownik\u00f3w Enterprise Editon.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":"612px","height":"auto"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/tsPN7c0.png\" alt=\"\" style=\"width:612px;height:auto\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2024\/01\/tsPN7c0.png\" alt=\"\" style=\"width:612px;height:auto\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Co wydaje si\u0119 by\u0107 uczciwym podej\u015bciem. Jak na kim\u015b zarabia\u0107, to w\u0142a\u015bnie na legacy projektach w firmach typu Enteprise - niech ten koszt wrzuc\u0105 w swoje fitness function architektury.<\/p>\n","innerContent":["\n<p>Co wydaje si\u0119 by\u0107 uczciwym podej\u015bciem. Jak na kim\u015b zarabia\u0107, to w\u0142a\u015bnie na legacy projektach w firmach typu Enteprise - niech ten koszt wrzuc\u0105 w swoje fitness function architektury.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A firmy b\u0119d\u0105 mia\u0142y zdecydowanie ch\u0119tk\u0119 na upgrade, poniewa\u017c jOOQ 3.19 przynosi te\u017c kilka naprawd\u0119 przydatnych funkcji:<\/p>\n","innerContent":["\n<p>A firmy b\u0119d\u0105 mia\u0142y zdecydowanie ch\u0119tk\u0119 na upgrade, poniewa\u017c jOOQ 3.19 przynosi te\u017c kilka naprawd\u0119 przydatnych funkcji:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Explicit Path Joins<\/strong> Funkcja umo\u017cliwia jawne deklarowanie \u015bcie\u017cek do\u0142\u0105cze\u0144 w zapytaniach<br>Przyk\u0142ad:<br><code>java<br>\nctx.select(CUSTOMER.FIRST_NAME, CUSTOMER.LAST_NAME, CUSTOMER.address().city().country().NAME)<br>\n.from(CUSTOMER)<br>\n.leftJoin(CUSTOMER.address().city().country())<br>\n.fetch();<br>\n<\/code><\/p>\n","innerContent":["\n<p><strong>Explicit Path Joins<\/strong> Funkcja umo\u017cliwia jawne deklarowanie \u015bcie\u017cek do\u0142\u0105cze\u0144 w zapytaniach<br>Przyk\u0142ad:<br><code>java<br>\nctx.select(CUSTOMER.FIRST_NAME, CUSTOMER.LAST_NAME, CUSTOMER.address().city().country().NAME)<br>\n.from(CUSTOMER)<br>\n.leftJoin(CUSTOMER.address().city().country())<br>\n.fetch();<br>\n<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>To-Many Path Joins<\/strong>: Funkcja obs\u0142uguje do\u0142\u0105czenia jeden-do-wielu przy u\u017cyciu \u015bcie\u017cek<br><code>java<br>\nctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME, ACTOR.film().TITLE)<br>\n.from(ACTOR)<br>\n.leftJoin(ACTOR.film())<br>\n.fetch();<br>\n<\/code><\/p>\n","innerContent":["\n<p><strong>To-Many Path Joins<\/strong>: Funkcja obs\u0142uguje do\u0142\u0105czenia jeden-do-wielu przy u\u017cyciu \u015bcie\u017cek<br><code>java<br>\nctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME, ACTOR.film().TITLE)<br>\n.from(ACTOR)<br>\n.leftJoin(ACTOR.film())<br>\n.fetch();<br>\n<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Implicit Join Path Correlation<\/strong>: Funkcja u\u0142atwia korelowanie podzapyta\u0144 z zewn\u0119trznymi zapytaniami za pomoc\u0105 \u015bcie\u017cek<\/p>\n","innerContent":["\n<p><strong>Implicit Join Path Correlation<\/strong>: Funkcja u\u0142atwia korelowanie podzapyta\u0144 z zewn\u0119trznymi zapytaniami za pomoc\u0105 \u015bcie\u017cek<\/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>ctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n  .from(ACTOR)\n  .where(exists(\n      selectOne()\n      .from(ACTOR.film())\n      .where(ACTOR.film().TITLE.like(\"A%\"))\n  ))\n  .fetch();\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>ctx.select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n  .from(ACTOR)\n  .where(exists(\n      selectOne()\n      .from(ACTOR.film())\n      .where(ACTOR.film().TITLE.like(\"A%\"))\n  ))\n  .fetch();\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ka\u017cda z tych funkcji u\u0142atwia tworzenie z\u0142o\u017conych zapyta\u0144 SQL, poprawiaj\u0105c czytelno\u015b\u0107 kodu.<\/p>\n","innerContent":["\n<p>Ka\u017cda z tych funkcji u\u0142atwia tworzenie z\u0142o\u017conych zapyta\u0144 SQL, poprawiaj\u0105c czytelno\u015b\u0107 kodu.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17509","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=17509"}],"version-history":[{"count":6,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17509\/revisions"}],"predecessor-version":[{"id":17520,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17509\/revisions\/17520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17511"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}