{"id":10195,"date":"2021-01-18T09:42:30","date_gmt":"2021-01-18T08:42:30","guid":{"rendered":"https:\/\/vived.io\/jvm-monday-21\/"},"modified":"2022-09-19T13:10:58","modified_gmt":"2022-09-19T11:10:58","slug":"jvm-monday-21","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-monday-21\/","title":{"rendered":"JVM Monday vol. 21"},"content":{"rendered":"<h3 id=\"1-obiekty-prymitywne-w-javie-project-valhalla-dostaje-spor-aktualizacj-\">1. Obiekty Prymitywne w Javie &#8211; &#8222;Project Valhalla&#8221; dostaje spor\u0105 aktualizacj\u0119<\/h3>\n<p>Obja\u015bnianie &#8222;Java Enhancement Proposali&#8221; jest zawsze interesuj\u0105cym procesem , a \u017ce <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">jeden z wa\u017cniejszych otrzyma\u0142 w\u0142a\u015bnie du\u017c\u0105 aktualizacje<\/a>, zaczniemy od niego dzisiejsz\u0105 edycj\u0119 &#8211; wspomniany JEP bardzo dobrze obrazuje kierunek zmian, w kt\u00f3rym pod\u0105\u017ca Java jako platforma.<\/p>\n<p>Wraz z <a href=\"http:\/\/cr.openjdk.java.net\/~briangoetz\/valhalla\/sov\/01-background.html\">Projektem Valhalla<\/a> mocno zaciera si\u0119 nam granica mi\u0119dzy tym, co jest obiektem, a co \u201cj\u0119zykowym prymitywem\u201d. Z jednej strony mamy cho\u0107by <a href=\"https:\/\/openjdk.java.net\/jeps\/169\">JEPa<\/a>, zadaniem kt\u00f3rego jest umo\u017cliwi\u0107 u\u017cywanie prymityw\u00f3w jako parametr\u00f3w generycznych. Z drugiej strony za\u015b postanowiono da\u0107 ludziom tworzenia swoich w\u0142asnych prymityw\u00f3w. Maj\u0105 bowiem one swoje <a href=\"https:\/\/www.baeldung.com\/java-primitives\">unikalne w\u0142a\u015bciwo\u015bci<\/a> &#8211; np. fakt \u017ce trzymane s\u0105 na stosie, a nie w heapie pozwala na przechowywanie ich bezpo\u015brednio w cache procesora, co przy dzisiejszej architekturze hardware ma niebagatelny wp\u0142yw na wydajno\u015b\u0107. To sprawia, \u017ce nieraz niezb\u0119dne jest operowanie w\u0142a\u015bnie na nich, a nie posiadaj\u0105cych wi\u0119ksze mo\u017cliwo\u015bci obiektach. St\u0105d te\u017c tylko o krok do tak zwanej <a href=\"https:\/\/refactoring.guru\/pl\/smells\/primitive-obsession\">Primitive Obsession<\/a>.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\" alt=\"\" \/><figcaption><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jvms\/se7\/html\/jvms-4.html#jvms-4.11\">Trivia: Maksymalna ilo\u015b\u0107 parametr\u00f3w funkcji w Javie to 255<\/a><\/figcaption><\/figure>\n<p><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\/632\">Oczywi\u015bcie<\/a>, <a href=\"https:\/\/github.com\/prestodb\/presto\/issues\/7645\">nikt<\/a> <a href=\"https:\/\/developer.salesforce.com\/forums\/?id=906F00000008q2cIAA\">tak<\/a> <a href=\"https:\/\/forums.pentaho.com\/threads\/74273-Too-many-arguments-in-method-signature\/\">nie<\/a> <a href=\"https:\/\/stackoverflow.com\/questions\/18631249\/too-many-parameters-error-exceeding-the-limit-of-255-words-eligible-for-method\">pisze<\/a> <a href=\"https:\/\/blog.pythian.com\/spark-performance-regression-sum-aggregations\/\">kodu<\/a>, ale w dalszym ci\u0105gu mo\u017cliwo\u015b\u0107 definiowania customowych, z\u0142o\u017conych obiekt\u00f3w traktowanych przez j\u0119zyk jako prymitywy daje pot\u0119\u017cne mo\u017cliwo\u015bci. \u017beby nie by\u0142o za r\u00f3\u017cowo, Primitive Objects b\u0119d\u0105 mia\u0142y swoje ograniczenia &#8211; przyk\u0142adowo, reprezentacja tego typu klas nie b\u0119dzie mia\u0142a sta\u0142ego miejsca w pami\u0119ci, nie jest wi\u0119c mo\u017cliwe stworzenie kieruj\u0105cego do niej wska\u017anika. Ma daleko id\u0105ce konsekwencje, min. w tym \u017ce klasy te s\u0105 \u201cefektywnie finalne\u201d, i \u201cefektywnie niemutowalne\u201d.<\/p>\n<p>Zmiany kt\u00f3re pojawi\u0142y si\u0119 we wspomnianym <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">drafcie JEPa<\/a> w zesz\u0142y pi\u0105tek w du\u017cej cz\u0119\u015bci dotycz\u0105 terminologii (cho\u0107 nie tylko). Dlatego przestrzegamy &#8211; je\u017celi kiedykolwiek natkniecie si\u0119 na nazw\u0119 Value Types w kontek\u015bcie JDK &#8211; to w\u0142a\u015bnie mowa tam o Primitive Objects.<\/p>\n<p><a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">JEP<\/a> zawiera mas\u0119 ciekawych detali implementacyjnych, ale bior\u0105c pod uwag\u0119 moje do\u015bwiadczenia zar\u00f3wno w wypadku Valhalli, jak i np. Looma, sugeruje si\u0119 jeszcze wstrzyma\u0107 z kuciem nowego syntaxu na blach\u0119. Z pewno\u015bci\u0105 si\u0119 w wielu miejscach jeszcze zmieni.<\/p>\n<p><a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/kyirfu\/jep_draft_primitive_objects_preview\/\">Dla ambitnych: Fajna rozmowa z Reddita na temat zmian z JEPa<\/a><\/p>\n<h3 id=\"2-typy-zale-ne-w-scali-3-czym-to-si-je-\">2. Typy zale\u017cne w Scali 3 &#8211; czym to si\u0119 je<\/h3>\n<p>Nieco napomkn\u0105\u0142em o tej publikacji (a ma ona dwie cz\u0119\u015bci &#8211; <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) <a href=\"https:\/\/blog.vived.io\/software-craftsmanship-saturday\/\">w edycji sobotniej<\/a> (do kt\u00f3rej regularnej lektury bardzo zapraszam), ale zdecydowanie powinna znale\u017a\u0107 si\u0119 ona r\u00f3wnie\u017c w dzisiejszym podsumowaniu (i nie tylko dlatego, \u017ce dotyka Scali, a tej u nas ostatnio nie za du\u017co by\u0142o). Jako ca\u0142o\u015b\u0107 stanowi bowiem jedno z najlepszych i najbardziej pragmatycznych wprowadze\u0144 do Typ\u00f3w Zale\u017cnych, kt\u00f3re to stanowi\u0105 jedn\u0105 z najciekawszych innowacji w j\u0119zykach programowania ostatnich lat.<\/p>\n<p>Niekt\u00f3rzy genezy samego konceptu niekt\u00f3rzy upatruj\u0105 si\u0119 u Bertranda Russella (co uwa\u017cam za cheatowanie, poniewa\u017c w zasadzie wszystko co zwi\u0105zane z typami mo\u017cna z Russellem w jaki\u015b spos\u00f3b powi\u0105za\u0107 &#8211; <a href=\"https:\/\/www.bbc.co.uk\/programmes\/b01p8fsr\">fascynuj\u0105cy cz\u0142owiek<\/a>). Z dzisiejszego punktu widzenia Dependent Types dosta\u0142y jednak \u017cycie gdy Haskell Curry (tak, dobrze si\u0119 domy\u015blacie, \u017ce jest to do\u015b\u0107 wa\u017cna persona dla j\u0119zyk\u00f3w funkcyjnych \u00a0\u019b) zauwa\u017cy\u0142, \u017ce rachunek lambda i logika kombinatoryczna maj\u0105 wiele wsp\u00f3lnego z rachunkiem zda\u0144, konkurencyjnym dzia\u0142em logiki.<\/p>\n<p>St\u0105d ju\u017c &#8222;prost\u0105&#8221; by\u0142a droga do zaprz\u0119gni\u0119cia komputer\u00f3w do udowadniania pewnej kategorii twierdze\u0144, gdzie Typy Zale\u017cne okaza\u0142y si\u0119 by\u0107 nieocenionym narz\u0119dziem. Programist\u00f3w za\u015b zainteresowa\u0142y stosunkowo niedawno, wraz z j\u0119zykiem Idris, kt\u00f3ry to pokaza\u0142 ich praktyczn\u0105 u\u017cyteczno\u015b\u0107 r\u00f3wnie\u017c do tak zwanego &#8222;general programmingu&#8221;.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1400b1e6d.png\" alt=\"\" \/><figcaption>Ok, przynudzam (wybaczcie, <a href=\"https:\/\/www2.slideshare.net\/ArturSkowroski\/artur-skowroski-ten-typ-tak-ma-o-systemach-typw-na-przykadzie-typescripta\">typy to m\u00f3j ma\u0142y konik<\/a>). <span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\n<p>Wi\u0119c czym Dependent Types tak naprawd\u0119 s\u0105? W uproszczeniu: s\u0105 one typami zale\u017cnymi od warto\u015bci. Ta unikalna cecha pozwala na unikni\u0119cie du\u017cej kategorii b\u0142\u0119d\u00f3w logicznych ju\u017c na samym poziomie kompilacji. Najprostszym chyba przyk\u0142adem jest mo\u017cliwo\u015b\u0107 zdefiniowania regu\u0142y, \u017ce dana funkcja przyjmuje tylko liczby parzyste (czy b\u0119d\u0105c szalenie precyzyjnym &#8211; &#8222;\u017ce jej argument nale\u017cy do zbioru liczb parzystych&#8221;). Je\u017celi kompilator wykryje z\u0142amanie tej regu\u0142y, przerwie proces i wyrzuci b\u0142\u0105d.<\/p>\n<p>Je\u017celi czujecie si\u0119 zach\u0119ceni, artyku\u0142y (a ma ona dwie cz\u0119\u015bci &#8211; <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) prezentuj\u0105 koncept znacznie szerzej na przyk\u0142adzie Scali 3. Mo\u017cecie znale\u017a\u0107 w nich nie tylko syntax, ale i interesuj\u0105ce przypadki u\u017cycia.<\/p>\n<p>PS: Je\u015bli zainteresowa\u0142 Was temat (ale nie lubicie Scali) <a href=\"https:\/\/www.youtube.com\/watch?v=VxINoKFm-S4\">ta prezentacja<\/a> jest bardzo dobrym, \u201cj\u0119zykowoagnostycznym\u201d jego rozwini\u0119ciem, pozwalaj\u0105c lepiej zrozumie\u0107 zar\u00f3wno teorie jak i powi\u0105zan\u0105 z ni\u0105 praktyk\u0119 \u200d<\/p>\n<h3 id=\"3-finalna-wersja-grpc-trafia-do-kotlina-\">3. Finalna wersja gRPC trafia do Kotlina<\/h3>\n<p>Na koniec news z grudnia, ale sami trafili\u015bmy na niego z drobnym op\u00f3\u017anieniem, a \u017ce w stosunku do <a href=\"https:\/\/app.vived.io\/hub\/keep-up\">Keep-Upowej<\/a> formu\u0142y (<em><a href=\"https:\/\/vived.io\/pl\/\">&lt;marketing&gt;bo pami\u0119tajcie, Vived to aplikacja kt\u00f3ra codziennie wybiera dla Was dopasowane artyku\u0142y, pozwalaj\u0105c by\u0107 na bie\u017c\u0105co z rynkiem IT&lt;\/marketing&gt;<\/a><\/em>) mamy tutaj troch\u0119 wi\u0119cej miejsca, spr\u00f3bujemy temat nie<br \/>\nco rozszerzy\u0107.<\/p>\n<p>gRPC jest rozbudowaniem koncepcji Protocol Buffers, binarnego formatu s\u0142u\u017c\u0105cego do komunikacji mi\u0119dzy us\u0142ugami sieciowymi i aplikacjami. RPC w nazwie jest akronimem Remote Procedure Calls &#8211; okrytej z\u0142\u0105 s\u0142aw\u0105 techniki programistycznej, pr\u00f3buj\u0105cej ukrywa\u0107 przed programistami fakt, \u017ce wykonania funkcji odbywaj\u0105 si\u0119 nie lokalnie, a do jakiej\u015b zewn\u0119trznej maszyny (<a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">no bo co mo\u017ce p\u00f3j\u015b\u0107 nie tak<\/a>). Jednak niekt\u00f3re lekcje trafi\u0142y do g\u0142owy, wnioski zosta\u0142y wyci\u0105gni\u0119te, <a href=\"https:\/\/www.infoworld.com\/article\/3114195\/the-8-fallacies-of-distributed-computing-are-becoming-irrelevant.html\">a i sama bran\u017ca w miejscu nie stoi<\/a>, wi\u0119c prze\u017cywaj\u0105 one sw\u00f3j renesans. gRPC jest cenione ze wzgl\u0119du na wsparcie dla HTTP\/2 i wsparcie dla schemat\u00f3w \u00a0(zapewniaj\u0105c \u0142atw\u0105 typowalno\u015b\u0107 request\u00f3w). Dzi\u0119ki tym cechom s\u0105 dla niekt\u00f3rych projektach interesuj\u0105c\u0105 alternatyw\u0105 dla RESTa.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1401535ba.png\" alt=\"\" \/><figcaption><a href=\"https:\/\/grpc.io\/docs\/\">Dokumentacja<\/a> nie wyja\u015bnia niestety, sk\u0105d w nazwie gRPC wzi\u0119\u0142o si\u0119 &#8222;g&#8221;. Pozostanie to zapewne na zawsze tajemnic\u0105.<\/figcaption><\/figure>\n<p>Jak mo\u017cna znale\u017a\u0107 w newsie, <a href=\"https:\/\/developers.googleblog.com\/2020\/12\/announcing-grpc-kotlin-10-for-android.html\">Kotlin otrzyma\u0142 stabilne wsparcie dla tego protoko\u0142u<\/a>. O ile wcze\u015bniej istnia\u0142y sposoby na u\u017cywanie go wraz z j\u0119zykiem od JetBrains, to dopiero wraz z udost\u0119pnieniem biblioteki od Google mo\u017cliwe jest idiomatyczne wsparcie wielu charakterystyk Kotlina, takich jak np. domy\u015blna nienullowalno\u015b\u0107.<\/p>\n<p>Wspomniany artyku\u0142 zawiera wiele link\u00f3w np. do zewn\u0119trznych tutoriali, je\u017celi wi\u0119c chcecie spr\u00f3bowa\u0107 swoich si\u0142 z gRPC, jest on bardzo dobrym punktem startowym.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cotygodniowy przegl\u0105d nowo\u015bci w JVM. Dzisiaj mamy aktualizacje w projekcie Valhalla \ud83c\udf29, Dependent Types w Scali \u2696\ufe0f oraz wsparcie protoko\u0142u gRPC w Kotlinie \ud83c\udf89. Zapraszamy do lektury.<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-10195","post","type-post","status-publish","format-standard","hentry","category-jvm-pl"],"acf":{"weekly_summary":true,"estimated_reading_time":"5"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JVM Monday vol. 21 - 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\/jvm-monday-21\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Monday vol. 21 - Vived\" \/>\n<meta property=\"og:description\" content=\"Cotygodniowy przegl\u0105d nowo\u015bci w JVM. Dzisiaj mamy aktualizacje w projekcie Valhalla \ud83c\udf29, Dependent Types w Scali \u2696\ufe0f oraz wsparcie protoko\u0142u gRPC w Kotlinie \ud83c\udf89. Zapraszamy do lektury.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-monday-21\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-18T08:42:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.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\/jvm-monday-21\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Monday vol. 21\",\"datePublished\":\"2021-01-18T08:42:30+00:00\",\"dateModified\":\"2022-09-19T11:10:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/\"},\"wordCount\":1106,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-monday-21\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/\",\"name\":\"JVM Monday vol. 21 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\",\"datePublished\":\"2021-01-18T08:42:30+00:00\",\"dateModified\":\"2022-09-19T11:10:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-monday-21\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-monday-21\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Monday vol. 21\"}]},{\"@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":"JVM Monday vol. 21 - 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\/jvm-monday-21\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Monday vol. 21 - Vived","og_description":"Cotygodniowy przegl\u0105d nowo\u015bci w JVM. Dzisiaj mamy aktualizacje w projekcie Valhalla \ud83c\udf29, Dependent Types w Scali \u2696\ufe0f oraz wsparcie protoko\u0142u gRPC w Kotlinie \ud83c\udf89. Zapraszamy do lektury.","og_url":"https:\/\/vived.io\/pl\/jvm-monday-21\/","og_site_name":"Vived","article_published_time":"2021-01-18T08:42:30+00:00","article_modified_time":"2022-09-19T11:10:58+00:00","og_image":[{"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png","type":"","width":"","height":""}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Monday vol. 21","datePublished":"2021-01-18T08:42:30+00:00","dateModified":"2022-09-19T11:10:58+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/"},"wordCount":1106,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png","articleSection":["JVM"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/jvm-monday-21\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/","url":"https:\/\/vived.io\/pl\/jvm-monday-21\/","name":"JVM Monday vol. 21 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png","datePublished":"2021-01-18T08:42:30+00:00","dateModified":"2022-09-19T11:10:58+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-monday-21\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png"},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-monday-21\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Monday vol. 21"}]},{"@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":null,"attrs":[],"innerBlocks":[],"innerHTML":"<h3 id=\"1-obiekty-prymitywne-w-javie-project-valhalla-dostaje-spor-aktualizacj-\">1. Obiekty Prymitywne w Javie - \"Project Valhalla\" dostaje spor\u0105 aktualizacj\u0119<\/h3>\nObja\u015bnianie \"Java Enhancement Proposali\" jest zawsze interesuj\u0105cym procesem , a \u017ce <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">jeden z wa\u017cniejszych otrzyma\u0142 w\u0142a\u015bnie du\u017c\u0105 aktualizacje<\/a>, zaczniemy od niego dzisiejsz\u0105 edycj\u0119 - wspomniany JEP bardzo dobrze obrazuje kierunek zmian, w kt\u00f3rym pod\u0105\u017ca Java jako platforma.\n\nWraz z <a href=\"http:\/\/cr.openjdk.java.net\/~briangoetz\/valhalla\/sov\/01-background.html\">Projektem Valhalla<\/a> mocno zaciera si\u0119 nam granica mi\u0119dzy tym, co jest obiektem, a co \u201cj\u0119zykowym prymitywem\u201d. Z jednej strony mamy cho\u0107by <a href=\"https:\/\/openjdk.java.net\/jeps\/169\">JEPa<\/a>, zadaniem kt\u00f3rego jest umo\u017cliwi\u0107 u\u017cywanie prymityw\u00f3w jako parametr\u00f3w generycznych. Z drugiej strony za\u015b postanowiono da\u0107 ludziom tworzenia swoich w\u0142asnych prymityw\u00f3w. Maj\u0105 bowiem one swoje <a href=\"https:\/\/www.baeldung.com\/java-primitives\">unikalne w\u0142a\u015bciwo\u015bci<\/a> - np. fakt \u017ce trzymane s\u0105 na stosie, a nie w heapie pozwala na przechowywanie ich bezpo\u015brednio w cache procesora, co przy dzisiejszej architekturze hardware ma niebagatelny wp\u0142yw na wydajno\u015b\u0107. To sprawia, \u017ce nieraz niezb\u0119dne jest operowanie w\u0142a\u015bnie na nich, a nie posiadaj\u0105cych wi\u0119ksze mo\u017cliwo\u015bci obiektach. St\u0105d te\u017c tylko o krok do tak zwanej <a href=\"https:\/\/refactoring.guru\/pl\/smells\/primitive-obsession\">Primitive Obsession<\/a>.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\" alt=\"\" \/>\n<figcaption><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jvms\/se7\/html\/jvms-4.html#jvms-4.11\">Trivia: Maksymalna ilo\u015b\u0107 parametr\u00f3w funkcji w Javie to 255<\/a><\/figcaption><\/figure>\n<a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\/632\">Oczywi\u015bcie<\/a>, <a href=\"https:\/\/github.com\/prestodb\/presto\/issues\/7645\">nikt<\/a> <a href=\"https:\/\/developer.salesforce.com\/forums\/?id=906F00000008q2cIAA\">tak<\/a> <a href=\"https:\/\/forums.pentaho.com\/threads\/74273-Too-many-arguments-in-method-signature\/\">nie<\/a> <a href=\"https:\/\/stackoverflow.com\/questions\/18631249\/too-many-parameters-error-exceeding-the-limit-of-255-words-eligible-for-method\">pisze<\/a> <a href=\"https:\/\/blog.pythian.com\/spark-performance-regression-sum-aggregations\/\">kodu<\/a>, ale w dalszym ci\u0105gu mo\u017cliwo\u015b\u0107 definiowania customowych, z\u0142o\u017conych obiekt\u00f3w traktowanych przez j\u0119zyk jako prymitywy daje pot\u0119\u017cne mo\u017cliwo\u015bci. \u017beby nie by\u0142o za r\u00f3\u017cowo, Primitive Objects b\u0119d\u0105 mia\u0142y swoje ograniczenia - przyk\u0142adowo, reprezentacja tego typu klas nie b\u0119dzie mia\u0142a sta\u0142ego miejsca w pami\u0119ci, nie jest wi\u0119c mo\u017cliwe stworzenie kieruj\u0105cego do niej wska\u017anika. Ma daleko id\u0105ce konsekwencje, min. w tym \u017ce klasy te s\u0105 \u201cefektywnie finalne\u201d, i \u201cefektywnie niemutowalne\u201d.\n\nZmiany kt\u00f3re pojawi\u0142y si\u0119 we wspomnianym <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">drafcie JEPa<\/a> w zesz\u0142y pi\u0105tek w du\u017cej cz\u0119\u015bci dotycz\u0105 terminologii (cho\u0107 nie tylko). Dlatego przestrzegamy - je\u017celi kiedykolwiek natkniecie si\u0119 na nazw\u0119 Value Types w kontek\u015bcie JDK - to w\u0142a\u015bnie mowa tam o Primitive Objects.\n\n<a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">JEP<\/a> zawiera mas\u0119 ciekawych detali implementacyjnych, ale bior\u0105c pod uwag\u0119 moje do\u015bwiadczenia zar\u00f3wno w wypadku Valhalli, jak i np. Looma, sugeruje si\u0119 jeszcze wstrzyma\u0107 z kuciem nowego syntaxu na blach\u0119. Z pewno\u015bci\u0105 si\u0119 w wielu miejscach jeszcze zmieni.\n\n<a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/kyirfu\/jep_draft_primitive_objects_preview\/\">Dla ambitnych: Fajna rozmowa z Reddita na temat zmian z JEPa<\/a>\n<h3 id=\"2-typy-zale-ne-w-scali-3-czym-to-si-je-\">2. Typy zale\u017cne w Scali 3 - czym to si\u0119 je<\/h3>\nNieco napomkn\u0105\u0142em o tej publikacji (a ma ona dwie cz\u0119\u015bci - <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) <a href=\"https:\/\/blog.vived.io\/software-craftsmanship-saturday\/\">w edycji sobotniej<\/a> (do kt\u00f3rej regularnej lektury bardzo zapraszam), ale zdecydowanie powinna znale\u017a\u0107 si\u0119 ona r\u00f3wnie\u017c w dzisiejszym podsumowaniu (i nie tylko dlatego, \u017ce dotyka Scali, a tej u nas ostatnio nie za du\u017co by\u0142o). Jako ca\u0142o\u015b\u0107 stanowi bowiem jedno z najlepszych i najbardziej pragmatycznych wprowadze\u0144 do Typ\u00f3w Zale\u017cnych, kt\u00f3re to stanowi\u0105 jedn\u0105 z najciekawszych innowacji w j\u0119zykach programowania ostatnich lat.\n\nNiekt\u00f3rzy genezy samego konceptu niekt\u00f3rzy upatruj\u0105 si\u0119 u Bertranda Russella (co uwa\u017cam za cheatowanie, poniewa\u017c w zasadzie wszystko co zwi\u0105zane z typami mo\u017cna z Russellem w jaki\u015b spos\u00f3b powi\u0105za\u0107 - <a href=\"https:\/\/www.bbc.co.uk\/programmes\/b01p8fsr\">fascynuj\u0105cy cz\u0142owiek<\/a>). Z dzisiejszego punktu widzenia Dependent Types dosta\u0142y jednak \u017cycie gdy Haskell Curry (tak, dobrze si\u0119 domy\u015blacie, \u017ce jest to do\u015b\u0107 wa\u017cna persona dla j\u0119zyk\u00f3w funkcyjnych \u00a0\u019b) zauwa\u017cy\u0142, \u017ce rachunek lambda i logika kombinatoryczna maj\u0105 wiele wsp\u00f3lnego z rachunkiem zda\u0144, konkurencyjnym dzia\u0142em logiki.\n\nSt\u0105d ju\u017c \"prost\u0105\" by\u0142a droga do zaprz\u0119gni\u0119cia komputer\u00f3w do udowadniania pewnej kategorii twierdze\u0144, gdzie Typy Zale\u017cne okaza\u0142y si\u0119 by\u0107 nieocenionym narz\u0119dziem. Programist\u00f3w za\u015b zainteresowa\u0142y stosunkowo niedawno, wraz z j\u0119zykiem Idris, kt\u00f3ry to pokaza\u0142 ich praktyczn\u0105 u\u017cyteczno\u015b\u0107 r\u00f3wnie\u017c do tak zwanego \"general programmingu\".\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1400b1e6d.png\" alt=\"\" \/>\n\n<figcaption>Ok, przynudzam (wybaczcie, <a href=\"https:\/\/www2.slideshare.net\/ArturSkowroski\/artur-skowroski-ten-typ-tak-ma-o-systemach-typw-na-przykadzie-typescripta\">typy to m\u00f3j ma\u0142y konik<\/a>). <span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nWi\u0119c czym Dependent Types tak naprawd\u0119 s\u0105? W uproszczeniu: s\u0105 one typami zale\u017cnymi od warto\u015bci. Ta unikalna cecha pozwala na unikni\u0119cie du\u017cej kategorii b\u0142\u0119d\u00f3w logicznych ju\u017c na samym poziomie kompilacji. Najprostszym chyba przyk\u0142adem jest mo\u017cliwo\u015b\u0107 zdefiniowania regu\u0142y, \u017ce dana funkcja przyjmuje tylko liczby parzyste (czy b\u0119d\u0105c szalenie precyzyjnym - \"\u017ce jej argument nale\u017cy do zbioru liczb parzystych\"). Je\u017celi kompilator wykryje z\u0142amanie tej regu\u0142y, przerwie proces i wyrzuci b\u0142\u0105d.\n\nJe\u017celi czujecie si\u0119 zach\u0119ceni, artyku\u0142y (a ma ona dwie cz\u0119\u015bci - <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) prezentuj\u0105 koncept znacznie szerzej na przyk\u0142adzie Scali 3. Mo\u017cecie znale\u017a\u0107 w nich nie tylko syntax, ale i interesuj\u0105ce przypadki u\u017cycia.\n\nPS: Je\u015bli zainteresowa\u0142 Was temat (ale nie lubicie Scali) <a href=\"https:\/\/www.youtube.com\/watch?v=VxINoKFm-S4\">ta prezentacja<\/a> jest bardzo dobrym, \u201cj\u0119zykowoagnostycznym\u201d jego rozwini\u0119ciem, pozwalaj\u0105c lepiej zrozumie\u0107 zar\u00f3wno teorie jak i powi\u0105zan\u0105 z ni\u0105 praktyk\u0119 \u200d\n<h3 id=\"3-finalna-wersja-grpc-trafia-do-kotlina-\">3. Finalna wersja gRPC trafia do Kotlina<\/h3>\nNa koniec news z grudnia, ale sami trafili\u015bmy na niego z drobnym op\u00f3\u017anieniem, a \u017ce w stosunku do <a href=\"https:\/\/app.vived.io\/hub\/keep-up\">Keep-Upowej<\/a> formu\u0142y (<em><a href=\"https:\/\/vived.io\/pl\/\">&lt;marketing&gt;bo pami\u0119tajcie, Vived to aplikacja kt\u00f3ra codziennie wybiera dla Was dopasowane artyku\u0142y, pozwalaj\u0105c by\u0107 na bie\u017c\u0105co z rynkiem IT&lt;\/marketing&gt;<\/a><\/em>) mamy tutaj troch\u0119 wi\u0119cej miejsca, spr\u00f3bujemy temat nie\nco rozszerzy\u0107.\n\ngRPC jest rozbudowaniem koncepcji Protocol Buffers, binarnego formatu s\u0142u\u017c\u0105cego do komunikacji mi\u0119dzy us\u0142ugami sieciowymi i aplikacjami. RPC w nazwie jest akronimem Remote Procedure Calls - okrytej z\u0142\u0105 s\u0142aw\u0105 techniki programistycznej, pr\u00f3buj\u0105cej ukrywa\u0107 przed programistami fakt, \u017ce wykonania funkcji odbywaj\u0105 si\u0119 nie lokalnie, a do jakiej\u015b zewn\u0119trznej maszyny (<a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">no bo co mo\u017ce p\u00f3j\u015b\u0107 nie tak<\/a>). Jednak niekt\u00f3re lekcje trafi\u0142y do g\u0142owy, wnioski zosta\u0142y wyci\u0105gni\u0119te, <a href=\"https:\/\/www.infoworld.com\/article\/3114195\/the-8-fallacies-of-distributed-computing-are-becoming-irrelevant.html\">a i sama bran\u017ca w miejscu nie stoi<\/a>, wi\u0119c prze\u017cywaj\u0105 one sw\u00f3j renesans. gRPC jest cenione ze wzgl\u0119du na wsparcie dla HTTP\/2 i wsparcie dla schemat\u00f3w \u00a0(zapewniaj\u0105c \u0142atw\u0105 typowalno\u015b\u0107 request\u00f3w). Dzi\u0119ki tym cechom s\u0105 dla niekt\u00f3rych projektach interesuj\u0105c\u0105 alternatyw\u0105 dla RESTa.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1401535ba.png\" alt=\"\" \/>\n\n<figcaption><a href=\"https:\/\/grpc.io\/docs\/\">Dokumentacja<\/a> nie wyja\u015bnia niestety, sk\u0105d w nazwie gRPC wzi\u0119\u0142o si\u0119 \"g\". Pozostanie to zapewne na zawsze tajemnic\u0105.<\/figcaption><\/figure>\nJak mo\u017cna znale\u017a\u0107 w newsie, <a href=\"https:\/\/developers.googleblog.com\/2020\/12\/announcing-grpc-kotlin-10-for-android.html\">Kotlin otrzyma\u0142 stabilne wsparcie dla tego protoko\u0142u<\/a>. O ile wcze\u015bniej istnia\u0142y sposoby na u\u017cywanie go wraz z j\u0119zykiem od JetBrains, to dopiero wraz z udost\u0119pnieniem biblioteki od Google mo\u017cliwe jest idiomatyczne wsparcie wielu charakterystyk Kotlina, takich jak np. domy\u015blna nienullowalno\u015b\u0107.\n\nWspomniany artyku\u0142 zawiera wiele link\u00f3w np. do zewn\u0119trznych tutoriali, je\u017celi wi\u0119c chcecie spr\u00f3bowa\u0107 swoich si\u0142 z gRPC, jest on bardzo dobrym punktem startowym.","innerContent":["<h3 id=\"1-obiekty-prymitywne-w-javie-project-valhalla-dostaje-spor-aktualizacj-\">1. Obiekty Prymitywne w Javie - \"Project Valhalla\" dostaje spor\u0105 aktualizacj\u0119<\/h3>\nObja\u015bnianie \"Java Enhancement Proposali\" jest zawsze interesuj\u0105cym procesem , a \u017ce <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">jeden z wa\u017cniejszych otrzyma\u0142 w\u0142a\u015bnie du\u017c\u0105 aktualizacje<\/a>, zaczniemy od niego dzisiejsz\u0105 edycj\u0119 - wspomniany JEP bardzo dobrze obrazuje kierunek zmian, w kt\u00f3rym pod\u0105\u017ca Java jako platforma.\n\nWraz z <a href=\"http:\/\/cr.openjdk.java.net\/~briangoetz\/valhalla\/sov\/01-background.html\">Projektem Valhalla<\/a> mocno zaciera si\u0119 nam granica mi\u0119dzy tym, co jest obiektem, a co \u201cj\u0119zykowym prymitywem\u201d. Z jednej strony mamy cho\u0107by <a href=\"https:\/\/openjdk.java.net\/jeps\/169\">JEPa<\/a>, zadaniem kt\u00f3rego jest umo\u017cliwi\u0107 u\u017cywanie prymityw\u00f3w jako parametr\u00f3w generycznych. Z drugiej strony za\u015b postanowiono da\u0107 ludziom tworzenia swoich w\u0142asnych prymityw\u00f3w. Maj\u0105 bowiem one swoje <a href=\"https:\/\/www.baeldung.com\/java-primitives\">unikalne w\u0142a\u015bciwo\u015bci<\/a> - np. fakt \u017ce trzymane s\u0105 na stosie, a nie w heapie pozwala na przechowywanie ich bezpo\u015brednio w cache procesora, co przy dzisiejszej architekturze hardware ma niebagatelny wp\u0142yw na wydajno\u015b\u0107. To sprawia, \u017ce nieraz niezb\u0119dne jest operowanie w\u0142a\u015bnie na nich, a nie posiadaj\u0105cych wi\u0119ksze mo\u017cliwo\u015bci obiektach. St\u0105d te\u017c tylko o krok do tak zwanej <a href=\"https:\/\/refactoring.guru\/pl\/smells\/primitive-obsession\">Primitive Obsession<\/a>.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d13ffd6f4e.png\" alt=\"\" \/>\n<figcaption><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jvms\/se7\/html\/jvms-4.html#jvms-4.11\">Trivia: Maksymalna ilo\u015b\u0107 parametr\u00f3w funkcji w Javie to 255<\/a><\/figcaption><\/figure>\n<a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/issues\/632\">Oczywi\u015bcie<\/a>, <a href=\"https:\/\/github.com\/prestodb\/presto\/issues\/7645\">nikt<\/a> <a href=\"https:\/\/developer.salesforce.com\/forums\/?id=906F00000008q2cIAA\">tak<\/a> <a href=\"https:\/\/forums.pentaho.com\/threads\/74273-Too-many-arguments-in-method-signature\/\">nie<\/a> <a href=\"https:\/\/stackoverflow.com\/questions\/18631249\/too-many-parameters-error-exceeding-the-limit-of-255-words-eligible-for-method\">pisze<\/a> <a href=\"https:\/\/blog.pythian.com\/spark-performance-regression-sum-aggregations\/\">kodu<\/a>, ale w dalszym ci\u0105gu mo\u017cliwo\u015b\u0107 definiowania customowych, z\u0142o\u017conych obiekt\u00f3w traktowanych przez j\u0119zyk jako prymitywy daje pot\u0119\u017cne mo\u017cliwo\u015bci. \u017beby nie by\u0142o za r\u00f3\u017cowo, Primitive Objects b\u0119d\u0105 mia\u0142y swoje ograniczenia - przyk\u0142adowo, reprezentacja tego typu klas nie b\u0119dzie mia\u0142a sta\u0142ego miejsca w pami\u0119ci, nie jest wi\u0119c mo\u017cliwe stworzenie kieruj\u0105cego do niej wska\u017anika. Ma daleko id\u0105ce konsekwencje, min. w tym \u017ce klasy te s\u0105 \u201cefektywnie finalne\u201d, i \u201cefektywnie niemutowalne\u201d.\n\nZmiany kt\u00f3re pojawi\u0142y si\u0119 we wspomnianym <a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">drafcie JEPa<\/a> w zesz\u0142y pi\u0105tek w du\u017cej cz\u0119\u015bci dotycz\u0105 terminologii (cho\u0107 nie tylko). Dlatego przestrzegamy - je\u017celi kiedykolwiek natkniecie si\u0119 na nazw\u0119 Value Types w kontek\u015bcie JDK - to w\u0142a\u015bnie mowa tam o Primitive Objects.\n\n<a href=\"https:\/\/openjdk.java.net\/jeps\/8251554\">JEP<\/a> zawiera mas\u0119 ciekawych detali implementacyjnych, ale bior\u0105c pod uwag\u0119 moje do\u015bwiadczenia zar\u00f3wno w wypadku Valhalli, jak i np. Looma, sugeruje si\u0119 jeszcze wstrzyma\u0107 z kuciem nowego syntaxu na blach\u0119. Z pewno\u015bci\u0105 si\u0119 w wielu miejscach jeszcze zmieni.\n\n<a href=\"https:\/\/www.reddit.com\/r\/java\/comments\/kyirfu\/jep_draft_primitive_objects_preview\/\">Dla ambitnych: Fajna rozmowa z Reddita na temat zmian z JEPa<\/a>\n<h3 id=\"2-typy-zale-ne-w-scali-3-czym-to-si-je-\">2. Typy zale\u017cne w Scali 3 - czym to si\u0119 je<\/h3>\nNieco napomkn\u0105\u0142em o tej publikacji (a ma ona dwie cz\u0119\u015bci - <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) <a href=\"https:\/\/blog.vived.io\/software-craftsmanship-saturday\/\">w edycji sobotniej<\/a> (do kt\u00f3rej regularnej lektury bardzo zapraszam), ale zdecydowanie powinna znale\u017a\u0107 si\u0119 ona r\u00f3wnie\u017c w dzisiejszym podsumowaniu (i nie tylko dlatego, \u017ce dotyka Scali, a tej u nas ostatnio nie za du\u017co by\u0142o). Jako ca\u0142o\u015b\u0107 stanowi bowiem jedno z najlepszych i najbardziej pragmatycznych wprowadze\u0144 do Typ\u00f3w Zale\u017cnych, kt\u00f3re to stanowi\u0105 jedn\u0105 z najciekawszych innowacji w j\u0119zykach programowania ostatnich lat.\n\nNiekt\u00f3rzy genezy samego konceptu niekt\u00f3rzy upatruj\u0105 si\u0119 u Bertranda Russella (co uwa\u017cam za cheatowanie, poniewa\u017c w zasadzie wszystko co zwi\u0105zane z typami mo\u017cna z Russellem w jaki\u015b spos\u00f3b powi\u0105za\u0107 - <a href=\"https:\/\/www.bbc.co.uk\/programmes\/b01p8fsr\">fascynuj\u0105cy cz\u0142owiek<\/a>). Z dzisiejszego punktu widzenia Dependent Types dosta\u0142y jednak \u017cycie gdy Haskell Curry (tak, dobrze si\u0119 domy\u015blacie, \u017ce jest to do\u015b\u0107 wa\u017cna persona dla j\u0119zyk\u00f3w funkcyjnych \u00a0\u019b) zauwa\u017cy\u0142, \u017ce rachunek lambda i logika kombinatoryczna maj\u0105 wiele wsp\u00f3lnego z rachunkiem zda\u0144, konkurencyjnym dzia\u0142em logiki.\n\nSt\u0105d ju\u017c \"prost\u0105\" by\u0142a droga do zaprz\u0119gni\u0119cia komputer\u00f3w do udowadniania pewnej kategorii twierdze\u0144, gdzie Typy Zale\u017cne okaza\u0142y si\u0119 by\u0107 nieocenionym narz\u0119dziem. Programist\u00f3w za\u015b zainteresowa\u0142y stosunkowo niedawno, wraz z j\u0119zykiem Idris, kt\u00f3ry to pokaza\u0142 ich praktyczn\u0105 u\u017cyteczno\u015b\u0107 r\u00f3wnie\u017c do tak zwanego \"general programmingu\".\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1400b1e6d.png\" alt=\"\" \/>\n\n<figcaption>Ok, przynudzam (wybaczcie, <a href=\"https:\/\/www2.slideshare.net\/ArturSkowroski\/artur-skowroski-ten-typ-tak-ma-o-systemach-typw-na-przykadzie-typescripta\">typy to m\u00f3j ma\u0142y konik<\/a>). <span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nWi\u0119c czym Dependent Types tak naprawd\u0119 s\u0105? W uproszczeniu: s\u0105 one typami zale\u017cnymi od warto\u015bci. Ta unikalna cecha pozwala na unikni\u0119cie du\u017cej kategorii b\u0142\u0119d\u00f3w logicznych ju\u017c na samym poziomie kompilacji. Najprostszym chyba przyk\u0142adem jest mo\u017cliwo\u015b\u0107 zdefiniowania regu\u0142y, \u017ce dana funkcja przyjmuje tylko liczby parzyste (czy b\u0119d\u0105c szalenie precyzyjnym - \"\u017ce jej argument nale\u017cy do zbioru liczb parzystych\"). Je\u017celi kompilator wykryje z\u0142amanie tej regu\u0142y, przerwie proces i wyrzuci b\u0142\u0105d.\n\nJe\u017celi czujecie si\u0119 zach\u0119ceni, artyku\u0142y (a ma ona dwie cz\u0119\u015bci - <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-i-273e9076e8f8\">1<\/a> i <a href=\"https:\/\/medium.com\/scala-3\/scala-3-dependent-types-part-ii-e7fc04dbfb08?source=collection_home---6------0-----------------------\">2<\/a>) prezentuj\u0105 koncept znacznie szerzej na przyk\u0142adzie Scali 3. Mo\u017cecie znale\u017a\u0107 w nich nie tylko syntax, ale i interesuj\u0105ce przypadki u\u017cycia.\n\nPS: Je\u015bli zainteresowa\u0142 Was temat (ale nie lubicie Scali) <a href=\"https:\/\/www.youtube.com\/watch?v=VxINoKFm-S4\">ta prezentacja<\/a> jest bardzo dobrym, \u201cj\u0119zykowoagnostycznym\u201d jego rozwini\u0119ciem, pozwalaj\u0105c lepiej zrozumie\u0107 zar\u00f3wno teorie jak i powi\u0105zan\u0105 z ni\u0105 praktyk\u0119 \u200d\n<h3 id=\"3-finalna-wersja-grpc-trafia-do-kotlina-\">3. Finalna wersja gRPC trafia do Kotlina<\/h3>\nNa koniec news z grudnia, ale sami trafili\u015bmy na niego z drobnym op\u00f3\u017anieniem, a \u017ce w stosunku do <a href=\"https:\/\/app.vived.io\/hub\/keep-up\">Keep-Upowej<\/a> formu\u0142y (<em><a href=\"https:\/\/vived.io\/pl\/\">&lt;marketing&gt;bo pami\u0119tajcie, Vived to aplikacja kt\u00f3ra codziennie wybiera dla Was dopasowane artyku\u0142y, pozwalaj\u0105c by\u0107 na bie\u017c\u0105co z rynkiem IT&lt;\/marketing&gt;<\/a><\/em>) mamy tutaj troch\u0119 wi\u0119cej miejsca, spr\u00f3bujemy temat nie\nco rozszerzy\u0107.\n\ngRPC jest rozbudowaniem koncepcji Protocol Buffers, binarnego formatu s\u0142u\u017c\u0105cego do komunikacji mi\u0119dzy us\u0142ugami sieciowymi i aplikacjami. RPC w nazwie jest akronimem Remote Procedure Calls - okrytej z\u0142\u0105 s\u0142aw\u0105 techniki programistycznej, pr\u00f3buj\u0105cej ukrywa\u0107 przed programistami fakt, \u017ce wykonania funkcji odbywaj\u0105 si\u0119 nie lokalnie, a do jakiej\u015b zewn\u0119trznej maszyny (<a href=\"https:\/\/www.researchgate.net\/publication\/322500050_Fallacies_of_Distributed_Computing_Explained\">no bo co mo\u017ce p\u00f3j\u015b\u0107 nie tak<\/a>). Jednak niekt\u00f3re lekcje trafi\u0142y do g\u0142owy, wnioski zosta\u0142y wyci\u0105gni\u0119te, <a href=\"https:\/\/www.infoworld.com\/article\/3114195\/the-8-fallacies-of-distributed-computing-are-becoming-irrelevant.html\">a i sama bran\u017ca w miejscu nie stoi<\/a>, wi\u0119c prze\u017cywaj\u0105 one sw\u00f3j renesans. gRPC jest cenione ze wzgl\u0119du na wsparcie dla HTTP\/2 i wsparcie dla schemat\u00f3w \u00a0(zapewniaj\u0105c \u0142atw\u0105 typowalno\u015b\u0107 request\u00f3w). Dzi\u0119ki tym cechom s\u0105 dla niekt\u00f3rych projektach interesuj\u0105c\u0105 alternatyw\u0105 dla RESTa.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d1401535ba.png\" alt=\"\" \/>\n\n<figcaption><a href=\"https:\/\/grpc.io\/docs\/\">Dokumentacja<\/a> nie wyja\u015bnia niestety, sk\u0105d w nazwie gRPC wzi\u0119\u0142o si\u0119 \"g\". Pozostanie to zapewne na zawsze tajemnic\u0105.<\/figcaption><\/figure>\nJak mo\u017cna znale\u017a\u0107 w newsie, <a href=\"https:\/\/developers.googleblog.com\/2020\/12\/announcing-grpc-kotlin-10-for-android.html\">Kotlin otrzyma\u0142 stabilne wsparcie dla tego protoko\u0142u<\/a>. O ile wcze\u015bniej istnia\u0142y sposoby na u\u017cywanie go wraz z j\u0119zykiem od JetBrains, to dopiero wraz z udost\u0119pnieniem biblioteki od Google mo\u017cliwe jest idiomatyczne wsparcie wielu charakterystyk Kotlina, takich jak np. domy\u015blna nienullowalno\u015b\u0107.\n\nWspomniany artyku\u0142 zawiera wiele link\u00f3w np. do zewn\u0119trznych tutoriali, je\u017celi wi\u0119c chcecie spr\u00f3bowa\u0107 swoich si\u0142 z gRPC, jest on bardzo dobrym punktem startowym."]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10195","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=10195"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10195\/revisions"}],"predecessor-version":[{"id":10590,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10195\/revisions\/10590"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}