{"id":10003,"date":"2022-02-22T17:14:30","date_gmt":"2022-02-22T16:14:30","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/"},"modified":"2022-09-19T13:10:41","modified_gmt":"2022-09-19T11:10:41","slug":"jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/","title":{"rendered":"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie"},"content":{"rendered":"\n<h2 id=\"1-spolecznosc-sama-pisze-dokumentacje-do-jdk-flight-recorder\" data-num=1>1. Spo\u0142eczno\u015b\u0107 sama pisze dokumentacj\u0119 do JDK Flight Recorder&nbsp;<\/h2>\n\n\n\n<p>JDK Flight Recorder (oficjalna aplikacja do monitoringu JVM) przez d\u0142ugi czas \u201clata\u0142 pod radarem\u201d wi\u0119kszo\u015b\u0107 programist\u00f3w JVM. By\u0142o to oczywi\u015bcie zwi\u0105zane z faktem, \u017ce przez d\u0142ugi okres czasu wymaga\u0142 komercyjnej wersji JDK udost\u0119pnianej przez Oracle. Cho\u0107 zdarza\u0142y si\u0119 oczywi\u015bcie firmy, kt\u00f3re takow\u0105 posiada\u0142y, to jednak taki stan rzeczy mocno wp\u0142ywa\u0142 zar\u00f3wno na poziom umiej\u0119tno\u015bci programist\u00f3w (w ko\u0144cu nawet nauczy\u0107 si\u0119 obs\u0142ugi tego narz\u0119dzia by\u0142o trudno), jak i zainteresowanie do inwestowania w jego poznanie (zbyt prawdopodobnym by\u0142o, \u017ce kolejna firma, w kt\u00f3rej b\u0119dziemy pracowa\u0107, nie b\u0119dzie mia\u0142a do niego dost\u0119pu). Teraz jednak, kiedy ju\u017c nareszcie ca\u0142o\u015b\u0107 trafi\u0142a w r\u0119ce spo\u0142eczno\u015bci i ka\u017cdy mo\u017ce go swobodnie u\u017cywa\u0107, powinien nast\u0105pi\u0107 jego renesans, prawda?<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc42c5df.gif\" alt=\"\"\/><figcaption>Nie prawda.<\/figcaption><\/figure><\/div>\n\n\n<p>Ale czemu tu si\u0119 dziwi\u0107, skoro przy oddawaniu ca\u0142o\u015bci spo\u0142eczno\u015bci wyra\u017anie zapomniano, \u017ce to nie jest tak, \u017ce wystarczy zopensourcowa\u0107 i \u201csamo si\u0119 podzieje\u201d, tylko o spo\u0142eczno\u015b\u0107 trzeba zadba\u0107. A Flight Recorder wydaje si\u0119 by\u0107 dzieckiem mocno porzuconym, mimo tego, \u017ce w kolejnych wersjach JDK zdarza\u0142o mu si\u0119 dostawa\u0107 jakie\u015b drobne (<a href=\"https:\/\/openjdk.java.net\/jeps\/349\">a i mniej drobne<\/a>) usprawnienia. Wyobra\u017cacie sobie, \u017ce na przyk\u0142ad format pliku wynikowego nie jest w \u017caden spos\u00f3b udokumentowany? Tak, te\u017c si\u0119 zdziwi\u0142em &#8211; jest to w moim mniemaniu pok\u0142osie tego, \u017ce przez lata Oracle nie zale\u017ca\u0142o na zapewnienie odpowiedniego poziomu kompatybilno\u015bci z ekosystemem narz\u0119dzi &#8211; w ko\u0144cu mowa by\u0142a tu o oprogramowaniu zamkni\u0119tym.&nbsp;<a href=\"https:\/\/www.morling.dev\/images\/jfr_file_format.png\"><\/a><\/p>\n\n\n\n<p>Na szcz\u0119\u015bcie JFR w obecnej postaci jest oprogramowaniem otwarto\u017ar\u00f3d\u0142owym, a nie ka\u017cdy bohater nosi peleryn\u0119. To w\u0142a\u015bnie na podstawie kodu \u017ar\u00f3d\u0142owego Gunnar Morling przygotowa\u0142 <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">pe\u0142n\u0105 specyfikacj\u0119 tego, w jaki spos\u00f3b Flight Recorder dzia\u0142a<\/a>, wraz z bardzo dok\u0142adnym diagramem. Ten reverse engineering (aczkolwiek skoro mamy dost\u0119p do kodu okre\u015blenie to jest pewnym nadu\u017cyciem) pozwoli\u0107 ma na stworzenie alternatyw do oryginalnych narz\u0119dzi Oracle, a tak\u017ce integracje ca\u0142o\u015bci z ca\u0142ym ekosystemem tooli do monitoringu.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc5c0673.gif\" alt=\"\"\/><figcaption>Kto wie, mo\u017ce praca Gunnara da JFR-owi drugie \u017cycie?<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/openjdk.java.net\/jeps\/349\">JEP 349: JFR Event Streaming<\/a><\/li><li><a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">The JDK Flight Recorder File Format &#8211; Gunnar Morling<\/a><\/li><\/ul>\n\n\n\n<h2 id=\"2-kolejna-alternatywa-do-dziedziczenia-w-kotlinie-context-receivers\" data-num=2>2. Kolejna alternatywa do dziedziczenia w Kotlinie &#8211; Context Receivers<\/h2>\n\n\n\n<p>Wersje 1.x.20 s\u0105 dla Kotlina bardzo istotne, stanowi\u0105 bowiem zwykle swoiste preview przed kolejnym du\u017cym wydaniem, daj\u0105 wi\u0119c szanse na przetestowanie je jeszcze przed dojechaniem na odpowiedni\u0105 stacj\u0119 odpowiedniego release traina. Nie inaczej jest tym razem &#8211; Kotlin 1.6.20 to masa dobra o kt\u00f3ry jeszcze Wam b\u0119d\u0119 opowiada\u0107. Pierwszy milestony ju\u017c si\u0119 pojawi\u0142, ale tym razem z opisem nowo\u015bci zdecydowa\u0142em si\u0119 poczeka\u0107 na jego oficjaln\u0105 premier\u0119. Dzisiaj jednak wykorzystam okazj\u0119 pojawienia si\u0119 \u015bwietne <a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">opracowania Context Receivers<\/a>, \u017ceby opisa\u0107 Wam ten nadchodz\u0105cy feature j\u0119zyka &#8211; inaczej zginie nam w morzu innych nowo\u015bci, a sam w sobie jest naprawd\u0119 interesuj\u0105cy.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc695a89.gif\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>W ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n\n\n\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; &#8211; czyli kontener (List) razem z parametrem (Int). Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n\n\n\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. \u017beby to zwizualizowa\u0107 pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem zaczerpni\u0119tym ze wspomnianego ju\u017c artyku\u0142u:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n\n\n\n<p>Publikacja poza sk\u0142adni\u0105 zawiera te\u017c przyk\u0142ady, gdzie w og\u00f3le tego typu (do\u015b\u0107 jednak pogmatwana) sk\u0142adania mo\u017ce si\u0119 przyda\u0107. Zapewniam Was, hejterzy j\u0119zyk\u00f3w obiektowych b\u0119d\u0105 w swoim \u017cywiole, Context Receivers da im bowiem jeszcze jedno narz\u0119dzie do reu\u017cywania kodu bez potrzeby u\u017cycia (a tfu) dziedziczenia.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc7beffd.png\" alt=\"\" width=\"800\" height=\"584\"\/><figcaption>I pewnie nie tylko oni &#8211; by\u0142 to bowiem trzeci najcz\u0119\u015bciej wybierany przez spo\u0142eczno\u015b\u0107 dodatek do j\u0119zyka przy okazji poprzedniej <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">ankiety stworzonej przez tw\u00f3rc\u00f3w j\u0119zyka<\/a>.<\/figcaption><\/figure><\/div>\n\n\n<p>A jak ju\u017c jeste\u015bmy przy Kotlinie, to podrzuc\u0119 Wam jeszcze jeden, nieco mniej \u201codjechany\u201d artyku\u0142. Nicolas Fr\u00e4nkel przygotowa\u0142 <a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">przegl\u0105d funkcjonalno\u015bci Kotlina<\/a>, takich kt\u00f3re pozwol\u0105 nam wykorzysta\u0107 pot\u0119g\u0119 jego systemu typ\u00f3w. Ja wiem, tego typu tekst\u00f3w jest pewnie p\u00f3\u0142 \u015bwiata i znani bywalcy ju\u017c pewnie wszystkie triki prezentowane przez autora znaj\u0105, ale ca\u0142o\u015b\u0107 jest na tyle zwi\u0119z\u0142a, \u017ce nie mog\u0142em sobie odm\u00f3wi\u0107 sobie po\u015bwi\u0119cenia jej cho\u0107 akapitu.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bcaa5bf8.gif\" alt=\"\"\/><figcaption>A ju\u017c nied\u0142ugo spodziewajcie si\u0119 reszty nowo\u015bci z Kotlina 1.6.20<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">Exploring Kotlin&#8217;s Context Receivers<\/a>&nbsp;<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">Results of the Kotlin Features Survey 2021<\/a><\/li><li><a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">Avoiding Stringly-typed in Kotlin<\/a>&nbsp;<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Oj, to nie by\u0142 bardzo aktywny tydzie\u0144 w JVMowym \u015bwiecie&#8230; W dalszym jednak ci\u0105gu uda\u0142o nam si\u0119 znale\u017a\u0107 dla Was par\u0119 interesuj\u0105cych publikacji &#8211; zar\u00f3wno dla fan\u00f3w Kotlina, jak u\u017cytkownik\u00f3w JFR (s\u0105 tu tacy?). Zapraszam do lektury \ud83d\ude09<\/p>\n","protected":false},"author":10,"featured_media":7960,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-10003","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"4","weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/JVM-4.png","feature_image_visible":false,"feature_image_blog":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - 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-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - Vived\" \/>\n<meta property=\"og:description\" content=\"Oj, to nie by\u0142 bardzo aktywny tydzie\u0144 w JVMowym \u015bwiecie... W dalszym jednak ci\u0105gu uda\u0142o nam si\u0119 znale\u017a\u0107 dla Was par\u0119 interesuj\u0105cych publikacji - zar\u00f3wno dla fan\u00f3w Kotlina, jak u\u017cytkownik\u00f3w JFR (s\u0105 tu tacy?). Zapraszam do lektury \ud83d\ude09\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-22T16:14:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/JVM-4-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie\",\"datePublished\":\"2022-02-22T16:14:30+00:00\",\"dateModified\":\"2022-09-19T11:10:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\"},\"wordCount\":886,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\",\"name\":\"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg\",\"datePublished\":\"2022-02-22T16:14:30+00:00\",\"dateModified\":\"2022-09-19T11:10:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg\",\"width\":271,\"height\":186},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie\"}]},{\"@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 Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - 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-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - Vived","og_description":"Oj, to nie by\u0142 bardzo aktywny tydzie\u0144 w JVMowym \u015bwiecie... W dalszym jednak ci\u0105gu uda\u0142o nam si\u0119 znale\u017a\u0107 dla Was par\u0119 interesuj\u0105cych publikacji - zar\u00f3wno dla fan\u00f3w Kotlina, jak u\u017cytkownik\u00f3w JFR (s\u0105 tu tacy?). Zapraszam do lektury \ud83d\ude09","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/","og_site_name":"Vived","article_published_time":"2022-02-22T16:14:30+00:00","article_modified_time":"2022-09-19T11:10:41+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/JVM-4-1.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie","datePublished":"2022-02-22T16:14:30+00:00","dateModified":"2022-09-19T11:10:41+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/"},"wordCount":886,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/","name":"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg","datePublished":"2022-02-22T16:14:30+00:00","dateModified":"2022-09-19T11:10:41+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/02\/images.jpeg","width":271,"height":186},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-java-flight-recorder-i-context-receivers-w-kotlinie\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday vol.77 \u2013 Java Flight Recorder i Context Receivers w Kotlinie"}]},{"@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 id=\"1-spolecznosc-sama-pisze-dokumentacje-do-jdk-flight-recorder\">1. Spo\u0142eczno\u015b\u0107 sama pisze dokumentacj\u0119 do JDK Flight Recorder&nbsp;<\/h2>\n","innerContent":["\n<h2 id=\"1-spolecznosc-sama-pisze-dokumentacje-do-jdk-flight-recorder\">1. Spo\u0142eczno\u015b\u0107 sama pisze dokumentacj\u0119 do JDK Flight Recorder&nbsp;<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JDK Flight Recorder (oficjalna aplikacja do monitoringu JVM) przez d\u0142ugi czas \u201clata\u0142 pod radarem\u201d wi\u0119kszo\u015b\u0107 programist\u00f3w JVM. By\u0142o to oczywi\u015bcie zwi\u0105zane z faktem, \u017ce przez d\u0142ugi okres czasu wymaga\u0142 komercyjnej wersji JDK udost\u0119pnianej przez Oracle. Cho\u0107 zdarza\u0142y si\u0119 oczywi\u015bcie firmy, kt\u00f3re takow\u0105 posiada\u0142y, to jednak taki stan rzeczy mocno wp\u0142ywa\u0142 zar\u00f3wno na poziom umiej\u0119tno\u015bci programist\u00f3w (w ko\u0144cu nawet nauczy\u0107 si\u0119 obs\u0142ugi tego narz\u0119dzia by\u0142o trudno), jak i zainteresowanie do inwestowania w jego poznanie (zbyt prawdopodobnym by\u0142o, \u017ce kolejna firma, w kt\u00f3rej b\u0119dziemy pracowa\u0107, nie b\u0119dzie mia\u0142a do niego dost\u0119pu). Teraz jednak, kiedy ju\u017c nareszcie ca\u0142o\u015b\u0107 trafi\u0142a w r\u0119ce spo\u0142eczno\u015bci i ka\u017cdy mo\u017ce go swobodnie u\u017cywa\u0107, powinien nast\u0105pi\u0107 jego renesans, prawda?<\/p>\n","innerContent":["\n<p>JDK Flight Recorder (oficjalna aplikacja do monitoringu JVM) przez d\u0142ugi czas \u201clata\u0142 pod radarem\u201d wi\u0119kszo\u015b\u0107 programist\u00f3w JVM. By\u0142o to oczywi\u015bcie zwi\u0105zane z faktem, \u017ce przez d\u0142ugi okres czasu wymaga\u0142 komercyjnej wersji JDK udost\u0119pnianej przez Oracle. Cho\u0107 zdarza\u0142y si\u0119 oczywi\u015bcie firmy, kt\u00f3re takow\u0105 posiada\u0142y, to jednak taki stan rzeczy mocno wp\u0142ywa\u0142 zar\u00f3wno na poziom umiej\u0119tno\u015bci programist\u00f3w (w ko\u0144cu nawet nauczy\u0107 si\u0119 obs\u0142ugi tego narz\u0119dzia by\u0142o trudno), jak i zainteresowanie do inwestowania w jego poznanie (zbyt prawdopodobnym by\u0142o, \u017ce kolejna firma, w kt\u00f3rej b\u0119dziemy pracowa\u0107, nie b\u0119dzie mia\u0142a do niego dost\u0119pu). Teraz jednak, kiedy ju\u017c nareszcie ca\u0142o\u015b\u0107 trafi\u0142a w r\u0119ce spo\u0142eczno\u015bci i ka\u017cdy mo\u017ce go swobodnie u\u017cywa\u0107, powinien nast\u0105pi\u0107 jego renesans, prawda?<\/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\/2022\/06\/img_62a88bc42c5df.gif\" alt=\"\"\/><figcaption>Nie prawda.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc42c5df.gif\" alt=\"\"\/><figcaption>Nie prawda.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ale czemu tu si\u0119 dziwi\u0107, skoro przy oddawaniu ca\u0142o\u015bci spo\u0142eczno\u015bci wyra\u017anie zapomniano, \u017ce to nie jest tak, \u017ce wystarczy zopensourcowa\u0107 i \u201csamo si\u0119 podzieje\u201d, tylko o spo\u0142eczno\u015b\u0107 trzeba zadba\u0107. A Flight Recorder wydaje si\u0119 by\u0107 dzieckiem mocno porzuconym, mimo tego, \u017ce w kolejnych wersjach JDK zdarza\u0142o mu si\u0119 dostawa\u0107 jakie\u015b drobne (<a href=\"https:\/\/openjdk.java.net\/jeps\/349\">a i mniej drobne<\/a>) usprawnienia. Wyobra\u017cacie sobie, \u017ce na przyk\u0142ad format pliku wynikowego nie jest w \u017caden spos\u00f3b udokumentowany? Tak, te\u017c si\u0119 zdziwi\u0142em - jest to w moim mniemaniu pok\u0142osie tego, \u017ce przez lata Oracle nie zale\u017ca\u0142o na zapewnienie odpowiedniego poziomu kompatybilno\u015bci z ekosystemem narz\u0119dzi - w ko\u0144cu mowa by\u0142a tu o oprogramowaniu zamkni\u0119tym.&nbsp;<a href=\"https:\/\/www.morling.dev\/images\/jfr_file_format.png\"><\/a><\/p>\n","innerContent":["\n<p>Ale czemu tu si\u0119 dziwi\u0107, skoro przy oddawaniu ca\u0142o\u015bci spo\u0142eczno\u015bci wyra\u017anie zapomniano, \u017ce to nie jest tak, \u017ce wystarczy zopensourcowa\u0107 i \u201csamo si\u0119 podzieje\u201d, tylko o spo\u0142eczno\u015b\u0107 trzeba zadba\u0107. A Flight Recorder wydaje si\u0119 by\u0107 dzieckiem mocno porzuconym, mimo tego, \u017ce w kolejnych wersjach JDK zdarza\u0142o mu si\u0119 dostawa\u0107 jakie\u015b drobne (<a href=\"https:\/\/openjdk.java.net\/jeps\/349\">a i mniej drobne<\/a>) usprawnienia. Wyobra\u017cacie sobie, \u017ce na przyk\u0142ad format pliku wynikowego nie jest w \u017caden spos\u00f3b udokumentowany? Tak, te\u017c si\u0119 zdziwi\u0142em - jest to w moim mniemaniu pok\u0142osie tego, \u017ce przez lata Oracle nie zale\u017ca\u0142o na zapewnienie odpowiedniego poziomu kompatybilno\u015bci z ekosystemem narz\u0119dzi - w ko\u0144cu mowa by\u0142a tu o oprogramowaniu zamkni\u0119tym.&nbsp;<a href=\"https:\/\/www.morling.dev\/images\/jfr_file_format.png\"><\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na szcz\u0119\u015bcie JFR w obecnej postaci jest oprogramowaniem otwarto\u017ar\u00f3d\u0142owym, a nie ka\u017cdy bohater nosi peleryn\u0119. To w\u0142a\u015bnie na podstawie kodu \u017ar\u00f3d\u0142owego Gunnar Morling przygotowa\u0142 <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">pe\u0142n\u0105 specyfikacj\u0119 tego, w jaki spos\u00f3b Flight Recorder dzia\u0142a<\/a>, wraz z bardzo dok\u0142adnym diagramem. Ten reverse engineering (aczkolwiek skoro mamy dost\u0119p do kodu okre\u015blenie to jest pewnym nadu\u017cyciem) pozwoli\u0107 ma na stworzenie alternatyw do oryginalnych narz\u0119dzi Oracle, a tak\u017ce integracje ca\u0142o\u015bci z ca\u0142ym ekosystemem tooli do monitoringu.&nbsp;<\/p>\n","innerContent":["\n<p>Na szcz\u0119\u015bcie JFR w obecnej postaci jest oprogramowaniem otwarto\u017ar\u00f3d\u0142owym, a nie ka\u017cdy bohater nosi peleryn\u0119. To w\u0142a\u015bnie na podstawie kodu \u017ar\u00f3d\u0142owego Gunnar Morling przygotowa\u0142 <a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">pe\u0142n\u0105 specyfikacj\u0119 tego, w jaki spos\u00f3b Flight Recorder dzia\u0142a<\/a>, wraz z bardzo dok\u0142adnym diagramem. Ten reverse engineering (aczkolwiek skoro mamy dost\u0119p do kodu okre\u015blenie to jest pewnym nadu\u017cyciem) pozwoli\u0107 ma na stworzenie alternatyw do oryginalnych narz\u0119dzi Oracle, a tak\u017ce integracje ca\u0142o\u015bci z ca\u0142ym ekosystemem tooli do monitoringu.&nbsp;<\/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\/2022\/06\/img_62a88bc5c0673.gif\" alt=\"\"\/><figcaption>Kto wie, mo\u017ce praca Gunnara da JFR-owi drugie \u017cycie?<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc5c0673.gif\" alt=\"\"\/><figcaption>Kto wie, mo\u017ce praca Gunnara da JFR-owi drugie \u017cycie?<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3 id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/openjdk.java.net\/jeps\/349\">JEP 349: JFR Event Streaming<\/a><\/li><li><a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">The JDK Flight Recorder File Format - Gunnar Morling<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/openjdk.java.net\/jeps\/349\">JEP 349: JFR Event Streaming<\/a><\/li><li><a href=\"https:\/\/www.morling.dev\/blog\/jdk-flight-recorder-file-format\/\">The JDK Flight Recorder File Format - Gunnar Morling<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 id=\"2-kolejna-alternatywa-do-dziedziczenia-w-kotlinie-context-receivers\">2. Kolejna alternatywa do dziedziczenia w Kotlinie - Context Receivers<\/h2>\n","innerContent":["\n<h2 id=\"2-kolejna-alternatywa-do-dziedziczenia-w-kotlinie-context-receivers\">2. Kolejna alternatywa do dziedziczenia w Kotlinie - Context Receivers<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wersje 1.x.20 s\u0105 dla Kotlina bardzo istotne, stanowi\u0105 bowiem zwykle swoiste preview przed kolejnym du\u017cym wydaniem, daj\u0105 wi\u0119c szanse na przetestowanie je jeszcze przed dojechaniem na odpowiedni\u0105 stacj\u0119 odpowiedniego release traina. Nie inaczej jest tym razem - Kotlin 1.6.20 to masa dobra o kt\u00f3ry jeszcze Wam b\u0119d\u0119 opowiada\u0107. Pierwszy milestony ju\u017c si\u0119 pojawi\u0142, ale tym razem z opisem nowo\u015bci zdecydowa\u0142em si\u0119 poczeka\u0107 na jego oficjaln\u0105 premier\u0119. Dzisiaj jednak wykorzystam okazj\u0119 pojawienia si\u0119 \u015bwietne <a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">opracowania Context Receivers<\/a>, \u017ceby opisa\u0107 Wam ten nadchodz\u0105cy feature j\u0119zyka - inaczej zginie nam w morzu innych nowo\u015bci, a sam w sobie jest naprawd\u0119 interesuj\u0105cy.&nbsp;<\/p>\n","innerContent":["\n<p>Wersje 1.x.20 s\u0105 dla Kotlina bardzo istotne, stanowi\u0105 bowiem zwykle swoiste preview przed kolejnym du\u017cym wydaniem, daj\u0105 wi\u0119c szanse na przetestowanie je jeszcze przed dojechaniem na odpowiedni\u0105 stacj\u0119 odpowiedniego release traina. Nie inaczej jest tym razem - Kotlin 1.6.20 to masa dobra o kt\u00f3ry jeszcze Wam b\u0119d\u0119 opowiada\u0107. Pierwszy milestony ju\u017c si\u0119 pojawi\u0142, ale tym razem z opisem nowo\u015bci zdecydowa\u0142em si\u0119 poczeka\u0107 na jego oficjaln\u0105 premier\u0119. Dzisiaj jednak wykorzystam okazj\u0119 pojawienia si\u0119 \u015bwietne <a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">opracowania Context Receivers<\/a>, \u017ceby opisa\u0107 Wam ten nadchodz\u0105cy feature j\u0119zyka - inaczej zginie nam w morzu innych nowo\u015bci, a sam w sobie jest naprawd\u0119 interesuj\u0105cy.&nbsp;<\/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\/2022\/06\/img_62a88bc695a89.gif\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc695a89.gif\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/p>\n","innerContent":["\n<p>W ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/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>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; - czyli kontener (List) razem z parametrem (Int). Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/p>\n","innerContent":["\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; - czyli kontener (List) razem z parametrem (Int). Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/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>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. \u017beby to zwizualizowa\u0107 pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem zaczerpni\u0119tym ze wspomnianego ju\u017c artyku\u0142u:<\/p>\n","innerContent":["\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. \u017beby to zwizualizowa\u0107 pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem zaczerpni\u0119tym ze wspomnianego ju\u017c artyku\u0142u:<\/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>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Publikacja poza sk\u0142adni\u0105 zawiera te\u017c przyk\u0142ady, gdzie w og\u00f3le tego typu (do\u015b\u0107 jednak pogmatwana) sk\u0142adania mo\u017ce si\u0119 przyda\u0107. Zapewniam Was, hejterzy j\u0119zyk\u00f3w obiektowych b\u0119d\u0105 w swoim \u017cywiole, Context Receivers da im bowiem jeszcze jedno narz\u0119dzie do reu\u017cywania kodu bez potrzeby u\u017cycia (a tfu) dziedziczenia.&nbsp;<\/p>\n","innerContent":["\n<p>Publikacja poza sk\u0142adni\u0105 zawiera te\u017c przyk\u0142ady, gdzie w og\u00f3le tego typu (do\u015b\u0107 jednak pogmatwana) sk\u0142adania mo\u017ce si\u0119 przyda\u0107. Zapewniam Was, hejterzy j\u0119zyk\u00f3w obiektowych b\u0119d\u0105 w swoim \u017cywiole, Context Receivers da im bowiem jeszcze jedno narz\u0119dzie do reu\u017cywania kodu bez potrzeby u\u017cycia (a tfu) dziedziczenia.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":800,"height":584},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc7beffd.png\" alt=\"\" width=\"800\" height=\"584\"\/><figcaption>I pewnie nie tylko oni - by\u0142 to bowiem trzeci najcz\u0119\u015bciej wybierany przez spo\u0142eczno\u015b\u0107 dodatek do j\u0119zyka przy okazji poprzedniej <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">ankiety stworzonej przez tw\u00f3rc\u00f3w j\u0119zyka<\/a>.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bc7beffd.png\" alt=\"\" width=\"800\" height=\"584\"\/><figcaption>I pewnie nie tylko oni - by\u0142 to bowiem trzeci najcz\u0119\u015bciej wybierany przez spo\u0142eczno\u015b\u0107 dodatek do j\u0119zyka przy okazji poprzedniej <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">ankiety stworzonej przez tw\u00f3rc\u00f3w j\u0119zyka<\/a>.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A jak ju\u017c jeste\u015bmy przy Kotlinie, to podrzuc\u0119 Wam jeszcze jeden, nieco mniej \u201codjechany\u201d artyku\u0142. Nicolas Fr\u00e4nkel przygotowa\u0142 <a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">przegl\u0105d funkcjonalno\u015bci Kotlina<\/a>, takich kt\u00f3re pozwol\u0105 nam wykorzysta\u0107 pot\u0119g\u0119 jego systemu typ\u00f3w. Ja wiem, tego typu tekst\u00f3w jest pewnie p\u00f3\u0142 \u015bwiata i znani bywalcy ju\u017c pewnie wszystkie triki prezentowane przez autora znaj\u0105, ale ca\u0142o\u015b\u0107 jest na tyle zwi\u0119z\u0142a, \u017ce nie mog\u0142em sobie odm\u00f3wi\u0107 sobie po\u015bwi\u0119cenia jej cho\u0107 akapitu.&nbsp;<\/p>\n","innerContent":["\n<p>A jak ju\u017c jeste\u015bmy przy Kotlinie, to podrzuc\u0119 Wam jeszcze jeden, nieco mniej \u201codjechany\u201d artyku\u0142. Nicolas Fr\u00e4nkel przygotowa\u0142 <a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">przegl\u0105d funkcjonalno\u015bci Kotlina<\/a>, takich kt\u00f3re pozwol\u0105 nam wykorzysta\u0107 pot\u0119g\u0119 jego systemu typ\u00f3w. Ja wiem, tego typu tekst\u00f3w jest pewnie p\u00f3\u0142 \u015bwiata i znani bywalcy ju\u017c pewnie wszystkie triki prezentowane przez autora znaj\u0105, ale ca\u0142o\u015b\u0107 jest na tyle zwi\u0119z\u0142a, \u017ce nie mog\u0142em sobie odm\u00f3wi\u0107 sobie po\u015bwi\u0119cenia jej cho\u0107 akapitu.&nbsp;<\/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\/2022\/06\/img_62a88bcaa5bf8.gif\" alt=\"\"\/><figcaption>A ju\u017c nied\u0142ugo spodziewajcie si\u0119 reszty nowo\u015bci z Kotlina 1.6.20<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88bcaa5bf8.gif\" alt=\"\"\/><figcaption>A ju\u017c nied\u0142ugo spodziewajcie si\u0119 reszty nowo\u015bci z Kotlina 1.6.20<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3 id=\"zrodla\">\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">Exploring Kotlin's Context Receivers<\/a>&nbsp;<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">Results of the Kotlin Features Survey 2021<\/a><\/li><li><a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">Avoiding Stringly-typed in Kotlin<\/a>&nbsp;<\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/nomisrev.github.io\/context-receivers\/\">Exploring Kotlin's Context Receivers<\/a>&nbsp;<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/kotlin-features-survey-2021-results\/\">Results of the Kotlin Features Survey 2021<\/a><\/li><li><a href=\"https:\/\/blog.frankel.ch\/avoid-stringly-typed-kotlin\/\">Avoiding Stringly-typed in Kotlin<\/a>&nbsp;<\/li><\/ul>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10003","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=10003"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10003\/revisions"}],"predecessor-version":[{"id":10528,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10003\/revisions\/10528"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/7960"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10003"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10003"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}