{"id":10037,"date":"2021-12-07T19:09:53","date_gmt":"2021-12-07T18:09:53","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/"},"modified":"2022-09-19T13:10:44","modified_gmt":"2022-09-19T11:10:44","slug":"jvm-tuesday-vol-77-kotlin-i-jego-ekosystem","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/","title":{"rendered":"JVM Tuesday vol. 67 &#8211; Kotlin i jego ekosystem"},"content":{"rendered":"\n<p>Cze\u015b\u0107, <\/p>\n\n\n\n<p>Dzisiaj mam dla Was specjalne wydanie. W dniu jutrzejszym mam przyjemno\u015b\u0107 robi\u0107 na AGH w Krakowie wprowadzenie do Kotlina dla ko\u0142a naukowego <strong>&#8222;Kernel&#8221;<\/strong>, dlatego te\u017c przygotowa\u0142em do\u015b\u0107 bogaty zestaw notatek, kt\u00f3ry pomo\u017ce ka\u017cdemu kto chce pozna\u0107 si\u0119 z j\u0119zykiem od JetBrains. Jako, \u017ce mo\u017ce wielu z Was potrzebuje takiego wprowadzenia, bo np. nie mieli jeszcze do czynienia z Kotliniem a chcieli go spr\u00f3bowa\u0107, postanowi\u0142em dzisiejsz\u0105 edycj\u0119 po\u015bwi\u0119ci\u0107 w\u0142a\u015bnie temu tematowi. Zapraszam do lektury<\/p>\n\n\n\n<h2 id=\"zacznijmy-od-odrobiny-historii\" data-num=1>Zacznijmy od odrobiny historii<\/h2>\n\n\n\n<p>Nale\u017c\u0119 do ludzi, kt\u00f3rzy twierdz\u0105, \u017ce nic tak nie pomaga w zrozumieniu filozofii stoj\u0105cej za danym j\u0119zykiem programowania, jak poznanie kontekstu, w kt\u00f3rym powstawa\u0142. Nie zawsze jest to proste &#8211; wiele z dzi\u015b u\u017cywanych technologii powstawa\u0142o jeszcze w czasach przedinternetowych, wi\u0119c wszelkiej ma\u015bci materia\u0142y s\u0105 mocno porozrzucane &#8211; z\u0142o\u017cenie ich wi\u0119c w sp\u00f3jny obrazek wymaga sporej ilo\u015bci pracy. Na szcz\u0119\u015bcie w wypadku Kotlina, kt\u00f3ry w tym roku sko\u0144czy\u0142 10 lat, wszystko mamy w zasadzie podane na tacy. Nie do\u015b\u0107, \u017ce JetBrains od samego pocz\u0105tku by\u0142o bardzo otwarte i dba\u0142o o dobr\u0105 prac\u0119 ze spo\u0142eczno\u015bci\u0105, to jeszcze z przypadaj\u0105cej na ten rok dziesi\u0105tej rocznicy postanowili dokona\u0107 kronikarskiego obowi\u0105zku spisania <a href=\"https:\/\/kotlinlang.org\/lp\/10yearsofkotlin\/future\/\">pe\u0142nej linii czasu rozwoju j\u0119zyka<\/a>.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>I nie m\u00f3wimy tutaj o jakim\u015b po\u015bcie blogowym, a o pe\u0142nej, bogato ilustrowanej historii oryginalnych prototyp\u00f3w i kolejno dodawanych funkcjonalno\u015bci.&nbsp;<\/p>\n\n\n\n<p>To jednak nie wszystko. Okr\u0105g\u0142\u0105 rocznic\u0119 dope\u0142ni\u0142 te\u017c specjalnie nakr\u0119cony na t\u0105 okazj\u0119 dokument. Znajdziecie w nim wypowiedzi oryginalnych tw\u00f3rc\u00f3w, wspominki z pierwszych spotka\u0144 projektowych, nadzieje i obawy. Powy\u017csza strona internetowa jest \u017ar\u00f3d\u0142em nieco tre\u015bciwszym, ale to wspomniane wideo pozwoli poczu\u0107 Wam atmosfer\u0119, w jakiej rodzi\u0142 si\u0119 Kotlin jako j\u0119zyk. Dowiecie si\u0119 m.in. sk\u0105d taka, a nie inna nazwa.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=uE-1oF9PyiY\">Ten Years of Kotlin: The Story of The Programming Language<\/a><\/p>\n\n\n\n<h2 id=\"zacheciles-mnie-chcialbym-sie-nauczyc-troche-skladni-jezyka-gdzie-najlepiej-zaczac\" data-num=2>Zach\u0119ci\u0142e\u015b mnie &#8211; chcia\u0142bym si\u0119 nauczy\u0107 troch\u0119 sk\u0142adni j\u0119zyka &#8211; gdzie najlepiej zacz\u0105\u0107?<\/h2>\n\n\n\n<p>Zdecydowanie pierwszym Waszym krokiem powinna by\u0107 oficjalna dokumentacja. I nie m\u00f3wimy tutaj o zwyk\u0142ych docsach w klasycznym tego s\u0142owa znaczeniu &#8211; Kotlin to j\u0119zyk nowoczesny nie tylko sam w sobie, ale jego ca\u0142a otoczka zdecydowanie przystaje do obecnych standard\u00f3w. Dlatego te\u017c oficjalna strona powinna by\u0107 miejscem, od kt\u00f3rego zaczniesz.<\/p>\n\n\n\n<p>Znajdziecie na niej:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/kotlinlang.org\/docs\/getting-started.html\">Przewodnik<\/a> stanowi\u0105cy idealne wprowadzenie dla wszystkich zaczynaj\u0105cych swoj\u0105 przygod\u0119 z Kotlinem, kt\u00f3ry przeprowadzi Ci\u0119 przez niezb\u0119dne podstawy<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/\">REPL w przegl\u0105darce<\/a>, pozwalaj\u0105cy pobawi\u0107 si\u0119 sk\u0142adni\u0105&nbsp;<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/koans\/overview\">Plugin do Intellij Idea<\/a>, kt\u00f3ry umo\u017cliwia przej\u015bcie przez szereg zada\u0144 pozwalaj\u0105cych sprawdzi\u0107, czy co\u015b nam w g\u0142owie z przeczytanej teorii zosta\u0142o<\/li><li>No i oczywi\u015bcie pe\u0142n\u0105 dokumentacje referencyjn\u0105.&nbsp;<\/li><\/ul>\n\n\n\n<p>To w\u0142a\u015bnie na stronie Kotlina znajdziecie te\u017c opracowanie bardziej zaawansowanych temat\u00f3w, takich jak <a href=\"https:\/\/kotlinlang.org\/docs\/coroutines-overview.html\">Korutyny<\/a>. Ten feature jest w mojej opinii jednym z najciekawszych aspekt\u00f3w j\u0119zyka i niejeden z Was w\u0142a\u015bnie dla niego si\u0119 nim w\u0142a\u015bnie zainteresowa\u0142. Tutaj ponownie odezwie si\u0119 moja \u017cy\u0142ka historyka, poniewa\u017c nie mog\u0119 nie poleci\u0107 Wam prezentacji <a href=\"https:\/\/www.youtube.com\/watch?v=Mj5P47F6nJg\">Roman Elizarov \u2014 Structured concurrency<\/a>. To w\u0142a\u015bnie Elizarowowi zawdzi\u0119czamy to, jak korutyny wygl\u0105daj\u0105 w swojej ostatecznej formie, a swoj\u0105 prac\u0119 wykona\u0142 tak dobrze, \u017ce obecnie pe\u0142ni rol\u0119 szefa ca\u0142ego projektu.<\/p>\n\n\n\n<p>Je\u017celi chodzi za\u015b o materia\u0142y nie pochodz\u0105ce bezpo\u015brednio od JetBrains, na pewno godnym wspomnienia jest tutaj <a href=\"https:\/\/kotlin.link\/\">Kotlin is Awesome!<\/a>. Je\u017celi nie znacie tak zwanych \u201cawesom\u00f3w\u201d, to s\u0105 to utrzymywane przez spo\u0142eczno\u015b\u0107 zbiory najlepszych zasob\u00f3w powi\u0105zanych z dan\u0105 technologi\u0105. Zwykle wyst\u0119puj\u0105 pod postaci\u0105 GitHubowych repozytori\u00f3w, w wypadku Kotlina mamy do czynienia z pe\u0142n\u0105 stron\u0105 internetow\u0105.<\/p>\n\n\n\n<h2 id=\"sam-jezyk-to-tylko-wierzcholek-gory-lodowej-jak-wyglada-tooling\" data-num=3>Sam j\u0119zyk to tylko wierzcho\u0142ek g\u00f3ry lodowej. Jak wygl\u0105da tooling?<\/h2>\n\n\n\n<p>Dlatego teraz zrobimy szybki przegl\u0105d przez najwa\u017cniejszy tooling dla Kotlina.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Intellij Idea<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/kotlin-new-project-gradleg.png\" alt=\"Template list for a new Kotlin project\"\/><\/figure><\/div>\n\n\n<p>Wszystkim dzia\u0142aniom JetBrains przy\u015bwieca fakt, \u017ce dobra narz\u0119dzi\u00f3wka zwi\u0119ksza w olbrzymim stopniu wydajno\u015b\u0107 programist\u00f3w. Dlatego nikogo nie dziwi, \u017ce jedn\u0105 z idei (hehe) za\u0142o\u017cycielskich Kotlina by\u0142o stworzenie j\u0119zyka, kt\u00f3ry b\u0119dzie w maksymalnie wygodny spos\u00f3b integrowa\u0142 si\u0119 z IDE. Ma to swoje dobre strony &#8211; Intellij Idea jest \u015bwietnym IDE, kt\u00f3re jest u\u017cywane przez prawie 80% programist\u00f3w Java. W 2020 roku do beczki miodu dosypano jednak \u0142y\u017ck\u0119 dziegciu &#8211; o ile ilo\u015b\u0107 u\u017cytkownik\u00f3w Kotlina nie u\u017cywaj\u0105cych narz\u0119dzi od jego tw\u00f3rc\u00f3w zawsze by\u0142a homeopatyczna, to w zesz\u0142ym roku JetBrains zdecydowa\u0142o si\u0119 na i\u015bcie applowski ruch, \u201cwmergowuj\u0105c\u201d plugin do obs\u0142ugi Kotlina do repozytorium IDE. Spowodowa\u0142o to, \u017ce j\u0119zyk bardzo mocno spl\u0105ta\u0142 si\u0119 z jedynym s\u0142usznym narz\u0119dziem, przez co w zasadzie niemo\u017cliwe sta\u0142o si\u0119 u\u017cywanie go z jakimkolwiek innym IDE. JetBrains twierdzi, \u017ce pozwoli\u0142o im to na uzyskanie znacznie wy\u017cszej jako\u015bci narz\u0119dzi, ale je\u017celi cenisz sobie otwarto\u015b\u0107 ekosystemu lub jeste\u015b fanem Emacsa, Twoje z\u0119by mog\u0105 niejednokrotnie zazgrzyta\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gradle<\/h3>\n\n\n\n<p>Kolejnym wa\u017cnym narz\u0119dziem je\u015bli chodzi o wytwarzanie oprogramowania w Kotlinie jest Gradle. Tutaj, co ciekawe, m\u00f3wimy o obop\u00f3lnej korzy\u015bci. Z jednej strony, Gradle od pocz\u0105tku by\u0142o build toolem wspieraj\u0105cym j\u0119zyk JetBrains, z drugiej Kotlin dokona\u0142 w nim sporej rewolucji. To w\u0142a\u015bnie w tym j\u0119zyku pojawi\u0142 si\u0119 bowiem pierwszy alternatywny DSL do definiowania build\u00f3w gradlowych.&nbsp;<\/p>\n\n\n\n<p>W por\u00f3wnaniu do oryginalnego syntaxu, opieraj\u0105cego si\u0119 o j\u0119zyk Groovy, wariant Kotlinowy pozwala na znacznie lepsze podpowiadanie sk\u0142adni. Jest to wi\u0119c obiektywnie lepsza metoda tworzenia build skrypt\u00f3w, ale niestety nie mog\u0119 jej z czystym sumieniem poleci\u0107. Przez lata w sieci pojawi\u0142o si\u0119 mas\u0119 tutoriali, poradnik\u00f3w i przyk\u0142ad\u00f3w dla groove\u2019owego wariantu Gradle, dlatego te\u017c o wiele \u0142atwiej ci\u0105gle trafi\u0107 na \u201cgotowce\u201d rozwi\u0105za\u0144 w\u0142a\u015bnie w nim. Kotlin niestety ci\u0105gle stanowi w tym ekosystemie j\u0119zyk drugiej kategorii. To si\u0119 powoli zmienia, ale jednak nie tak szybko jak si\u0119 spodziewa\u0142em, gdy rozwi\u0105zanie debiutowa\u0142o kilka lat temu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kompilator<\/h3>\n\n\n\n<p>Ach zbieraj\u0105 nam si\u0119 te wady Kotlina jako\u015b przy tej sekcji tooling. Przez lata to w\u0142a\u015bnie wolna kompilacja by\u0142a najcz\u0119\u015bciej przywo\u0142ywan\u0105 wad\u0105 j\u0119zyka od JetBrains. I je\u015bli wydaje Wam si\u0119, \u017ce to pewnie przesada, to niestety nie &#8211; sam pami\u0119tam, \u017ce moje pierwsza przygoda z Kotlinem prawie zako\u0144czy\u0142a si\u0119 w momencie, gdy okaza\u0142o si\u0119, \u017ce odpalenie unit test\u00f3w trwa oko\u0142o minuty (!). Na szcz\u0119\u015bcie od tamtego czasu sytuacja si\u0119 znacznie poprawi\u0142a, a dzi\u0119ki nowej reprezentacji wewn\u0119trznej zyskali\u015bmy nie tylko szybko\u015b\u0107 kompilacji, ale r\u00f3wnie\u017c lepsz\u0105 interoperacyjno\u015b\u0107 z sam\u0105 Jav\u0105 (co te\u017c historycznie bywa\u0142o problemem). Kompilacja Kotlina jest zreszt\u0105 bardzo ciekawym tematem, tw\u00f3rcy stosuj\u0105 mas\u0119 sztuczek, \u017ceby zapewni\u0107 efektywno\u015b\u0107 ca\u0142ego procesu. Kulminacj\u0105 prac ostatnich lat ma by\u0107 za\u015b K2 &#8211; kompilator, kt\u00f3ry ma pozwoli\u0107 na szybsz\u0105 iteracj\u0119 nad nowymi funkcjami j\u0119zyka poprzez uwsp\u00f3lnienie kluczowych element\u00f3w procesu mi\u0119dzy Kotlina JVM, Kotlina JS i Kotlina Native.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Analiza Statyczna<\/h3>\n\n\n\n<p>Jestem fanem analizy statycznej, dlatego bardzo ciesz\u0119 si\u0119, \u017ce Kotlin posiada w tym temacie sporo interesuj\u0105cych narz\u0119dzi. Przez lata by\u0142y one utrzymywane g\u0142\u00f3wnie przez spo\u0142eczno\u015b\u0107. Mogli\u015bmy u\u017cywa\u0107:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/pinterest\/ktlint\">ktlinta<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod ze zbiorem predefiniowanych regu\u0142 syntaktycznych<\/li><li><a href=\"https:\/\/github.com\/detekt\/detekt\">detekt<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod pod k\u0105tem popularnych podatno\u015bci.<\/li><\/ul>\n\n\n\n<p>JetBrains postanowi\u0142o jednak postanowi\u0142o dorzuci\u0107 co\u015b od siebie i stworzy\u0142o Qodan\u0119 &#8211; narz\u0119dzie przeznaczone do odpalania w ramach terminala lub systemu CI, posiadaj\u0105ce mo\u017cliwo\u015bci zbli\u017cone do tych posiadanych przez tooling Intellij. Qodana jest obecnie w Preview, ale ju\u017c teraz zapowiada si\u0119 na istotny dodatek do portfolio narz\u0119dzi od JetBrains.<\/p>\n\n\n\n<p>A jak ju\u017c jeste\u015bmy w temacie analizy statycznej: firma pokaza\u0142a ostatnio r\u00f3wnie\u017c Kover &#8211;&nbsp; narz\u0119dzie do liczenia pokrycia kodem. Sama praktyka liczenia Code Coverage sta\u0142a si\u0119 ostatnimi czasy do\u015b\u0107 kontrowersyjna, ale wed\u0142ug ma ona sporo zastosowa\u0144, wi\u0119c cieszy mnie inwestycja r\u00f3wnie\u017c w tym obszarze.<\/p>\n\n\n\n<h2 id=\"to-jeszcze-przejdzmy-przez-najwazniejsze-biblioteki\" data-num=4>To jeszcze przejd\u017amy przez najwa\u017cniejsze biblioteki&nbsp;<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><a href=\"https:\/\/www.spekframework.org\/\">Spek<\/a><\/strong> &#8211; g\u0142\u00f3wna biblioteka do test\u00f3w, kt\u00f3ra mnie osobi\u015bcie ze wszystkich dost\u0119pnych na rynku najbardziej przypomina JavaScriptow Jasmine. Pozwala na \u0142adne pisanie zagnie\u017cd\u017conych test\u00f3w w stylu BDD i posiada dobre wsparcie do testowania korutyn<\/li><li><strong><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\">kotlinx.serialization<\/a> <\/strong>&#8211; Kotlin posiada bardzo dobre wsparcie dla serializacji do r\u00f3\u017cnych format\u00f3w takich jak JSON czy YAML, ale nie w bibliotece standardowej a w\u0142a\u015bnie w zewn\u0119trznym rozszerzeniu <strong>kotlinx.serialization<\/strong> (kt\u00f3re te\u017c jest tworzone przez JetBrains). Opr\u00f3cz tego, \u017ce jego konfiguracja wymaga nieco Gradlowej magii, to jest na tyle wygodne, \u017ce dok\u0142adam je do w\u0142a\u015bciwie ka\u017cdego projektu, nie spogl\u0105daj\u0105c wcale w kierunku np. Jacksona, kt\u00f3ry te\u017c ma wsparcie dla Kotlina<\/li><li><strong><a href=\"https:\/\/www.http4k.org\/\">http4k<\/a> <\/strong>&#8211; mamy tu do czynienia z klientem HTTP. Cho\u0107 nie jest to produkt JetBrains, co nie przeszkadza jej w byciu jednym z najcz\u0119\u015bciej wybieranych rozwi\u0105za\u0144 w Kotlinowym \u015bwiecie. Podobnie jak poprzednicy, cechuje si\u0119 dobrym natywnym wsparciem dla r\u00f3\u017cnych rozwi\u0105za\u0144 j\u0119zyka i stanowi wygodne rozwi\u0105zanie do produkcji i konsumpcji r\u00f3\u017cnych API<\/li><li><strong><a href=\"https:\/\/ktor.io\/\">KTOR<\/a> <\/strong>&#8211; tutaj m\u00f3wimy ju\u017c o rozwi\u0105zaniu, kt\u00f3re mo\u017cna umiejscowi\u0107 gdzie\u015b pomi\u0119dzy bibliotek\u0105, a frameworkiem. Jest to forma <strong>http4k<\/strong> na sterydach, daj\u0105ca u\u017cytkownikom w zasadzie mo\u017cliwo\u015b\u0107 stworzenia pe\u0142nego restowego API w spos\u00f3b mocno funkcyjny. <strong>KTOR <\/strong>w pe\u0142ni wykorzystuje moc korutyny przy tworzenia API.<\/li><\/ul>\n\n\n\n<h2 id=\"calosc-zakonczymy-zas-przegladem-wsparcia-kotlina-w-popularnych-frameworkach\" data-num=5>Ca\u0142o\u015b\u0107 zako\u0144czymy za\u015b przegl\u0105dem wsparcia Kotlina w popularnych frameworkach<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Boot<\/h3>\n\n\n\n<p>Spring od dawna mocno inwestuje w Kotlina &#8211; i to wida\u0107. Jego tw\u00f3rcy regularnie wydaj\u0105 kolejne edycje swojego przegl\u0105du <a href=\"https:\/\/www.youtube.com\/watch?v=tt4cxR5onQU\">The State of Kotlin Support in Spring<\/a>, gdzie chwal\u0105 si\u0119 jak bardzo kochaj\u0105 Kotlina i staraj\u0105 si\u0119 by\u0107 na bie\u017c\u0105co z zamieszczanymi zmianami. Dlatego te\u017c np. ju\u017c dzisiaj mo\u017cecie u\u017cywa\u0107 WebFluxa opartego o korutyny. Bardzo ciekawym projektem jest te\u017c KoFu &#8211; specjalny DSL, pozwalaj\u0105cy na konfigurowanie Spring Bootowej aplikacji za pomoc\u0105 Kotlina<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>val app = webApplication {\n\tlogging { level = LogLevel.DEBUG }\n\tbeans { bean&lt;SampleService&gt;()}\n\twebMvc {\n\t\tport = if (profiles.contains(&quot;test&quot;)) 8181 else 8080\n\t\trouter {\n\t\t\tval service = ref&lt;SampleService&gt;()\n\t\t\tGET(&quot;\/api&quot;) {\n\t\t\t\tok().body(Sample(service.generateMessage()))\n\t\t\t}\n\t\t}\n\t\tconverters {\n\t\t\tstring()\n\t\t\tjackson {\n\t\t\t\tindentOutput = true\n\t\t\t}\n\t\t}}}\n\ndata class Sample(val message: String)\n\nclass SampleService { fun generateMessage() = &quot;Hello world!&quot; }\n\nfun main() {\n\tapp.run()\n}\n<\/code><\/pre>\n\n\n\n<p>Na koniec wspomn\u0119, \u017ce r\u00f3wnie\u017c Spring Native wspiera Kotlina (w jego edycji Native), pozwalaj\u0105c na generowanie obraz\u00f3w do uruchomienia w ramach maszyny GraalVM (stan obecnego wsparcia dla GraalVM to jest og\u00f3lnie frapuj\u0105cy temat, kt\u00f3ry kiedy\u015b nie omieszkam tu opisa\u0107).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Micronaut<\/h3>\n\n\n\n<p>Nast\u0119pca Grails\u00f3w od razu wskoczy\u0142 te\u017c na Kotlinowy wagonik, a tw\u00f3rcy chwal\u0105 si\u0119, \u017ce od pocz\u0105tku traktowali j\u0119zyk jako obywatela pierwszej kategorii &#8211; co akurat jest do nich podobne, zawsze lubili nowinki (Grails to w ko\u0144cu skr\u00f3t od Groovy on Grails). Wida\u0107, \u017ce wzi\u0119li sobie do serca wspieranie wszystkich koncept\u00f3w j\u0119zyka, poniewa\u017c pozwalaj\u0105 na u\u017cycie korutyn w zasadzie na przekr\u00f3j ca\u0142ego stacku aplikacji. Ich wsparcie opiera si\u0119 wprawdzie o nak\u0142adk\u0119 na Reactora poprzez u\u017cyciu biblioteki org.jetbrains.kotlinx:kotlinx-coroutines-reactor, ale w dalszym ci\u0105gu pozwala to na tworzenie np. bardzo eleganckich kontroler\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Get(&quot;\/simple&quot;, produces = &#091;MediaType.TEXT_PLAIN])\nsuspend fun simple(): String { \n   return &quot;Hello&quot;\n}<\/code><\/pre>\n\n\n\n<p>Ca\u0142o\u015b\u0107 oczywi\u015bcie r\u00f3wnie\u017c wspiera Kotlinowy wariant GraalVM, a tak\u017ce bardzo dobrze integruje si\u0119 ze wspomnianym KTORem. Nie umniejszaj\u0105c Springowi, \u015bmiem twierdzi\u0107, \u017ce ze wszystkich narz\u0119dzi to w\u0142a\u015bnie Micronaut najlepiej sprawdza si\u0119 w u\u017cyciu z Kotlinem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quarkus<\/h3>\n\n\n\n<p>Ze wzgl\u0119du na specjalne miejsce w moim serduszku dla Jakarty EE, oparty o Microprofile Quarkus to m\u00f3j ulubiony z nowopowsta\u0142ych JVMowych framework\u00f3w. Niestety, je\u017celi chodzi o wsparcie Kotlina, wypada on chyba najs\u0142abiej. Oczywi\u015bcie, wi\u0119kszo\u015b\u0107 funkcjonalno\u015bci dzia\u0142a dobrze (tw\u00f3rcy Quarkusa chwal\u0105 si\u0119 min. \u015bwietnym wsparciem Kotlina przez ich \u201cdev mode\u201d, pozwalaj\u0105cy na szybkie prze\u0142adowanie klas w aplikacji), ale niestety wsparcie korutyn mocno kuleje. Microprofile &#8211; m\u0142odszy, zwinniejszy brat Jakarty EE jest tutaj pewn\u0105 kul\u0105 u nogi. Samych korutyn mo\u017cna u\u017cywa\u0107, ale w miejscach, gdzie wspierany jest standard Microprofile (czyli np. w endpointach Restowych), niezb\u0119dne jest opakowanie suspend\u00f3w za pomoc\u0105 biblioteki \u200b\u200b<a href=\"https:\/\/smallrye.io\/smallrye-mutiny\/guides\/kotlin\">SmallRye Mutiny<\/a>.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun mutinyService(id: Long): Uni&lt;Fruit?&gt; {\n    GlobalScope.async {\n        findById(id)\n    }.asUni()\n}\n<\/code><\/pre>\n\n\n\n<p>Jest to bardzo brzydkie, a efekt robi si\u0119 co najwy\u017cej \u015bredni. Dlatego o ile nie zniech\u0119cam zupe\u0142nie do u\u017cywania Quarkusa z Kotlinem, to jednak nie wykorzystacie w ten spos\u00f3b najpot\u0119\u017cniejszych mo\u017cliwo\u015bci j\u0119zyka je\u015bli chodzi o wsp\u00f3\u0142bie\u017cno\u015b\u0107\u2026 przynajmniej nie w elegancki spos\u00f3b.<\/p>\n\n\n\n<h2 id=\"i-jeszcze-lekcja-na-koniec\" data-num=6>I jeszcze lekcja na koniec:<br><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/buq1tgml8ea51.jpg\" alt=\"Haha Kotlin go brrr : r\/ProgrammerHumor\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj mamy dla Was co\u015b specjalnego &#8211; je\u015bli kiedykolwiek chcieli\u015bcie pozna\u0107 podstawy Kotlina, nowa edycja naszego przegl\u0105du b\u0119dzie do tego \u015bwietnym miejscem.  Zapraszam serdecznie.<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-10037","post","type-post","status-publish","format-standard","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"10","weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2021\/12\/Screenshot-2021-12-07-at-19.07.55.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. 67 - Kotlin i jego ekosystem - 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-kotlin-i-jego-ekosystem\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday vol. 67 - Kotlin i jego ekosystem - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj mamy dla Was co\u015b specjalnego - je\u015bli kiedykolwiek chcieli\u015bcie pozna\u0107 podstawy Kotlina, nowa edycja naszego przegl\u0105du b\u0119dzie do tego \u015bwietnym miejscem. Zapraszam serdecznie.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-07T18:09:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/12\/Screenshot-2021-12-07-at-19.07.55.png\" \/>\n\t<meta property=\"og:image:width\" content=\"940\" \/>\n\t<meta property=\"og:image:height\" content=\"594\" \/>\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-kotlin-i-jego-ekosystem\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday vol. 67 &#8211; Kotlin i jego ekosystem\",\"datePublished\":\"2021-12-07T18:09:53+00:00\",\"dateModified\":\"2022-09-19T11:10:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\"},\"wordCount\":2115,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\",\"name\":\"JVM Tuesday vol. 67 - Kotlin i jego ekosystem - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\",\"datePublished\":\"2021-12-07T18:09:53+00:00\",\"dateModified\":\"2022-09-19T11:10:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday vol. 67 &#8211; Kotlin i jego ekosystem\"}]},{\"@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. 67 - Kotlin i jego ekosystem - 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-kotlin-i-jego-ekosystem\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday vol. 67 - Kotlin i jego ekosystem - Vived","og_description":"Dzisiaj mamy dla Was co\u015b specjalnego - je\u015bli kiedykolwiek chcieli\u015bcie pozna\u0107 podstawy Kotlina, nowa edycja naszego przegl\u0105du b\u0119dzie do tego \u015bwietnym miejscem. Zapraszam serdecznie.","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/","og_site_name":"Vived","article_published_time":"2021-12-07T18:09:53+00:00","article_modified_time":"2022-09-19T11:10:44+00:00","og_image":[{"width":940,"height":594,"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/12\/Screenshot-2021-12-07-at-19.07.55.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-kotlin-i-jego-ekosystem\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday vol. 67 &#8211; Kotlin i jego ekosystem","datePublished":"2021-12-07T18:09:53+00:00","dateModified":"2022-09-19T11:10:44+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/"},"wordCount":2115,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/","name":"JVM Tuesday vol. 67 - Kotlin i jego ekosystem - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png","datePublished":"2021-12-07T18:09:53+00:00","dateModified":"2022-09-19T11:10:44+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png"},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-vol-77-kotlin-i-jego-ekosystem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday vol. 67 &#8211; Kotlin i jego ekosystem"}]},{"@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\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Cze\u015b\u0107, <\/p>\n","innerContent":["\n<p>Cze\u015b\u0107, <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dzisiaj mam dla Was specjalne wydanie. W dniu jutrzejszym mam przyjemno\u015b\u0107 robi\u0107 na AGH w Krakowie wprowadzenie do Kotlina dla ko\u0142a naukowego <strong>\"Kernel\"<\/strong>, dlatego te\u017c przygotowa\u0142em do\u015b\u0107 bogaty zestaw notatek, kt\u00f3ry pomo\u017ce ka\u017cdemu kto chce pozna\u0107 si\u0119 z j\u0119zykiem od JetBrains. Jako, \u017ce mo\u017ce wielu z Was potrzebuje takiego wprowadzenia, bo np. nie mieli jeszcze do czynienia z Kotliniem a chcieli go spr\u00f3bowa\u0107, postanowi\u0142em dzisiejsz\u0105 edycj\u0119 po\u015bwi\u0119ci\u0107 w\u0142a\u015bnie temu tematowi. Zapraszam do lektury<\/p>\n","innerContent":["\n<p>Dzisiaj mam dla Was specjalne wydanie. W dniu jutrzejszym mam przyjemno\u015b\u0107 robi\u0107 na AGH w Krakowie wprowadzenie do Kotlina dla ko\u0142a naukowego <strong>\"Kernel\"<\/strong>, dlatego te\u017c przygotowa\u0142em do\u015b\u0107 bogaty zestaw notatek, kt\u00f3ry pomo\u017ce ka\u017cdemu kto chce pozna\u0107 si\u0119 z j\u0119zykiem od JetBrains. Jako, \u017ce mo\u017ce wielu z Was potrzebuje takiego wprowadzenia, bo np. nie mieli jeszcze do czynienia z Kotliniem a chcieli go spr\u00f3bowa\u0107, postanowi\u0142em dzisiejsz\u0105 edycj\u0119 po\u015bwi\u0119ci\u0107 w\u0142a\u015bnie temu tematowi. Zapraszam do lektury<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Zacznijmy od odrobiny historii<\/h2>\n","innerContent":["\n<h2>Zacznijmy od odrobiny historii<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nale\u017c\u0119 do ludzi, kt\u00f3rzy twierdz\u0105, \u017ce nic tak nie pomaga w zrozumieniu filozofii stoj\u0105cej za danym j\u0119zykiem programowania, jak poznanie kontekstu, w kt\u00f3rym powstawa\u0142. Nie zawsze jest to proste - wiele z dzi\u015b u\u017cywanych technologii powstawa\u0142o jeszcze w czasach przedinternetowych, wi\u0119c wszelkiej ma\u015bci materia\u0142y s\u0105 mocno porozrzucane - z\u0142o\u017cenie ich wi\u0119c w sp\u00f3jny obrazek wymaga sporej ilo\u015bci pracy. Na szcz\u0119\u015bcie w wypadku Kotlina, kt\u00f3ry w tym roku sko\u0144czy\u0142 10 lat, wszystko mamy w zasadzie podane na tacy. Nie do\u015b\u0107, \u017ce JetBrains od samego pocz\u0105tku by\u0142o bardzo otwarte i dba\u0142o o dobr\u0105 prac\u0119 ze spo\u0142eczno\u015bci\u0105, to jeszcze z przypadaj\u0105cej na ten rok dziesi\u0105tej rocznicy postanowili dokona\u0107 kronikarskiego obowi\u0105zku spisania <a href=\"https:\/\/kotlinlang.org\/lp\/10yearsofkotlin\/future\/\">pe\u0142nej linii czasu rozwoju j\u0119zyka<\/a>.&nbsp;<\/p>\n","innerContent":["\n<p>Nale\u017c\u0119 do ludzi, kt\u00f3rzy twierdz\u0105, \u017ce nic tak nie pomaga w zrozumieniu filozofii stoj\u0105cej za danym j\u0119zykiem programowania, jak poznanie kontekstu, w kt\u00f3rym powstawa\u0142. Nie zawsze jest to proste - wiele z dzi\u015b u\u017cywanych technologii powstawa\u0142o jeszcze w czasach przedinternetowych, wi\u0119c wszelkiej ma\u015bci materia\u0142y s\u0105 mocno porozrzucane - z\u0142o\u017cenie ich wi\u0119c w sp\u00f3jny obrazek wymaga sporej ilo\u015bci pracy. Na szcz\u0119\u015bcie w wypadku Kotlina, kt\u00f3ry w tym roku sko\u0144czy\u0142 10 lat, wszystko mamy w zasadzie podane na tacy. Nie do\u015b\u0107, \u017ce JetBrains od samego pocz\u0105tku by\u0142o bardzo otwarte i dba\u0142o o dobr\u0105 prac\u0119 ze spo\u0142eczno\u015bci\u0105, to jeszcze z przypadaj\u0105cej na ten rok dziesi\u0105tej rocznicy postanowili dokona\u0107 kronikarskiego obowi\u0105zku spisania <a href=\"https:\/\/kotlinlang.org\/lp\/10yearsofkotlin\/future\/\">pe\u0142nej linii czasu rozwoju j\u0119zyka<\/a>.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a883abb76b3.png\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I nie m\u00f3wimy tutaj o jakim\u015b po\u015bcie blogowym, a o pe\u0142nej, bogato ilustrowanej historii oryginalnych prototyp\u00f3w i kolejno dodawanych funkcjonalno\u015bci.&nbsp;<\/p>\n","innerContent":["\n<p>I nie m\u00f3wimy tutaj o jakim\u015b po\u015bcie blogowym, a o pe\u0142nej, bogato ilustrowanej historii oryginalnych prototyp\u00f3w i kolejno dodawanych funkcjonalno\u015bci.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jednak nie wszystko. Okr\u0105g\u0142\u0105 rocznic\u0119 dope\u0142ni\u0142 te\u017c specjalnie nakr\u0119cony na t\u0105 okazj\u0119 dokument. Znajdziecie w nim wypowiedzi oryginalnych tw\u00f3rc\u00f3w, wspominki z pierwszych spotka\u0144 projektowych, nadzieje i obawy. Powy\u017csza strona internetowa jest \u017ar\u00f3d\u0142em nieco tre\u015bciwszym, ale to wspomniane wideo pozwoli poczu\u0107 Wam atmosfer\u0119, w jakiej rodzi\u0142 si\u0119 Kotlin jako j\u0119zyk. Dowiecie si\u0119 m.in. sk\u0105d taka, a nie inna nazwa.<\/p>\n","innerContent":["\n<p>To jednak nie wszystko. Okr\u0105g\u0142\u0105 rocznic\u0119 dope\u0142ni\u0142 te\u017c specjalnie nakr\u0119cony na t\u0105 okazj\u0119 dokument. Znajdziecie w nim wypowiedzi oryginalnych tw\u00f3rc\u00f3w, wspominki z pierwszych spotka\u0144 projektowych, nadzieje i obawy. Powy\u017csza strona internetowa jest \u017ar\u00f3d\u0142em nieco tre\u015bciwszym, ale to wspomniane wideo pozwoli poczu\u0107 Wam atmosfer\u0119, w jakiej rodzi\u0142 si\u0119 Kotlin jako j\u0119zyk. Dowiecie si\u0119 m.in. sk\u0105d taka, a nie inna nazwa.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=uE-1oF9PyiY\">Ten Years of Kotlin: The Story of The Programming Language<\/a><\/p>\n","innerContent":["\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=uE-1oF9PyiY\">Ten Years of Kotlin: The Story of The Programming Language<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Zach\u0119ci\u0142e\u015b mnie - chcia\u0142bym si\u0119 nauczy\u0107 troch\u0119 sk\u0142adni j\u0119zyka - gdzie najlepiej zacz\u0105\u0107?<\/h2>\n","innerContent":["\n<h2>Zach\u0119ci\u0142e\u015b mnie - chcia\u0142bym si\u0119 nauczy\u0107 troch\u0119 sk\u0142adni j\u0119zyka - gdzie najlepiej zacz\u0105\u0107?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zdecydowanie pierwszym Waszym krokiem powinna by\u0107 oficjalna dokumentacja. I nie m\u00f3wimy tutaj o zwyk\u0142ych docsach w klasycznym tego s\u0142owa znaczeniu - Kotlin to j\u0119zyk nowoczesny nie tylko sam w sobie, ale jego ca\u0142a otoczka zdecydowanie przystaje do obecnych standard\u00f3w. Dlatego te\u017c oficjalna strona powinna by\u0107 miejscem, od kt\u00f3rego zaczniesz.<\/p>\n","innerContent":["\n<p>Zdecydowanie pierwszym Waszym krokiem powinna by\u0107 oficjalna dokumentacja. I nie m\u00f3wimy tutaj o zwyk\u0142ych docsach w klasycznym tego s\u0142owa znaczeniu - Kotlin to j\u0119zyk nowoczesny nie tylko sam w sobie, ale jego ca\u0142a otoczka zdecydowanie przystaje do obecnych standard\u00f3w. Dlatego te\u017c oficjalna strona powinna by\u0107 miejscem, od kt\u00f3rego zaczniesz.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Znajdziecie na niej:<\/p>\n","innerContent":["\n<p>Znajdziecie na niej:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/kotlinlang.org\/docs\/getting-started.html\">Przewodnik<\/a> stanowi\u0105cy idealne wprowadzenie dla wszystkich zaczynaj\u0105cych swoj\u0105 przygod\u0119 z Kotlinem, kt\u00f3ry przeprowadzi Ci\u0119 przez niezb\u0119dne podstawy<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/\">REPL w przegl\u0105darce<\/a>, pozwalaj\u0105cy pobawi\u0107 si\u0119 sk\u0142adni\u0105&nbsp;<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/koans\/overview\">Plugin do Intellij Idea<\/a>, kt\u00f3ry umo\u017cliwia przej\u015bcie przez szereg zada\u0144 pozwalaj\u0105cych sprawdzi\u0107, czy co\u015b nam w g\u0142owie z przeczytanej teorii zosta\u0142o<\/li><li>No i oczywi\u015bcie pe\u0142n\u0105 dokumentacje referencyjn\u0105.&nbsp;<\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/kotlinlang.org\/docs\/getting-started.html\">Przewodnik<\/a> stanowi\u0105cy idealne wprowadzenie dla wszystkich zaczynaj\u0105cych swoj\u0105 przygod\u0119 z Kotlinem, kt\u00f3ry przeprowadzi Ci\u0119 przez niezb\u0119dne podstawy<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/\">REPL w przegl\u0105darce<\/a>, pozwalaj\u0105cy pobawi\u0107 si\u0119 sk\u0142adni\u0105&nbsp;<\/li><li><a href=\"https:\/\/play.kotlinlang.org\/koans\/overview\">Plugin do Intellij Idea<\/a>, kt\u00f3ry umo\u017cliwia przej\u015bcie przez szereg zada\u0144 pozwalaj\u0105cych sprawdzi\u0107, czy co\u015b nam w g\u0142owie z przeczytanej teorii zosta\u0142o<\/li><li>No i oczywi\u015bcie pe\u0142n\u0105 dokumentacje referencyjn\u0105.&nbsp;<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To w\u0142a\u015bnie na stronie Kotlina znajdziecie te\u017c opracowanie bardziej zaawansowanych temat\u00f3w, takich jak <a href=\"https:\/\/kotlinlang.org\/docs\/coroutines-overview.html\">Korutyny<\/a>. Ten feature jest w mojej opinii jednym z najciekawszych aspekt\u00f3w j\u0119zyka i niejeden z Was w\u0142a\u015bnie dla niego si\u0119 nim w\u0142a\u015bnie zainteresowa\u0142. Tutaj ponownie odezwie si\u0119 moja \u017cy\u0142ka historyka, poniewa\u017c nie mog\u0119 nie poleci\u0107 Wam prezentacji <a href=\"https:\/\/www.youtube.com\/watch?v=Mj5P47F6nJg\">Roman Elizarov \u2014 Structured concurrency<\/a>. To w\u0142a\u015bnie Elizarowowi zawdzi\u0119czamy to, jak korutyny wygl\u0105daj\u0105 w swojej ostatecznej formie, a swoj\u0105 prac\u0119 wykona\u0142 tak dobrze, \u017ce obecnie pe\u0142ni rol\u0119 szefa ca\u0142ego projektu.<\/p>\n","innerContent":["\n<p>To w\u0142a\u015bnie na stronie Kotlina znajdziecie te\u017c opracowanie bardziej zaawansowanych temat\u00f3w, takich jak <a href=\"https:\/\/kotlinlang.org\/docs\/coroutines-overview.html\">Korutyny<\/a>. Ten feature jest w mojej opinii jednym z najciekawszych aspekt\u00f3w j\u0119zyka i niejeden z Was w\u0142a\u015bnie dla niego si\u0119 nim w\u0142a\u015bnie zainteresowa\u0142. Tutaj ponownie odezwie si\u0119 moja \u017cy\u0142ka historyka, poniewa\u017c nie mog\u0119 nie poleci\u0107 Wam prezentacji <a href=\"https:\/\/www.youtube.com\/watch?v=Mj5P47F6nJg\">Roman Elizarov \u2014 Structured concurrency<\/a>. To w\u0142a\u015bnie Elizarowowi zawdzi\u0119czamy to, jak korutyny wygl\u0105daj\u0105 w swojej ostatecznej formie, a swoj\u0105 prac\u0119 wykona\u0142 tak dobrze, \u017ce obecnie pe\u0142ni rol\u0119 szefa ca\u0142ego projektu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u017celi chodzi za\u015b o materia\u0142y nie pochodz\u0105ce bezpo\u015brednio od JetBrains, na pewno godnym wspomnienia jest tutaj <a href=\"https:\/\/kotlin.link\/\">Kotlin is Awesome!<\/a>. Je\u017celi nie znacie tak zwanych \u201cawesom\u00f3w\u201d, to s\u0105 to utrzymywane przez spo\u0142eczno\u015b\u0107 zbiory najlepszych zasob\u00f3w powi\u0105zanych z dan\u0105 technologi\u0105. Zwykle wyst\u0119puj\u0105 pod postaci\u0105 GitHubowych repozytori\u00f3w, w wypadku Kotlina mamy do czynienia z pe\u0142n\u0105 stron\u0105 internetow\u0105.<\/p>\n","innerContent":["\n<p>Je\u017celi chodzi za\u015b o materia\u0142y nie pochodz\u0105ce bezpo\u015brednio od JetBrains, na pewno godnym wspomnienia jest tutaj <a href=\"https:\/\/kotlin.link\/\">Kotlin is Awesome!<\/a>. Je\u017celi nie znacie tak zwanych \u201cawesom\u00f3w\u201d, to s\u0105 to utrzymywane przez spo\u0142eczno\u015b\u0107 zbiory najlepszych zasob\u00f3w powi\u0105zanych z dan\u0105 technologi\u0105. Zwykle wyst\u0119puj\u0105 pod postaci\u0105 GitHubowych repozytori\u00f3w, w wypadku Kotlina mamy do czynienia z pe\u0142n\u0105 stron\u0105 internetow\u0105.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Sam j\u0119zyk to tylko wierzcho\u0142ek g\u00f3ry lodowej. Jak wygl\u0105da tooling?<\/h2>\n","innerContent":["\n<h2>Sam j\u0119zyk to tylko wierzcho\u0142ek g\u00f3ry lodowej. Jak wygl\u0105da tooling?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego teraz zrobimy szybki przegl\u0105d przez najwa\u017cniejszy tooling dla Kotlina.<\/p>\n","innerContent":["\n<p>Dlatego teraz zrobimy szybki przegl\u0105d przez najwa\u017cniejszy tooling dla Kotlina.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Intellij Idea<\/h3>\n","innerContent":["\n<h3>Intellij Idea<\/h3>\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\/kotlin-new-project-gradleg.png\" alt=\"Template list for a new Kotlin project\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/kotlin-new-project-gradleg.png\" alt=\"Template list for a new Kotlin project\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wszystkim dzia\u0142aniom JetBrains przy\u015bwieca fakt, \u017ce dobra narz\u0119dzi\u00f3wka zwi\u0119ksza w olbrzymim stopniu wydajno\u015b\u0107 programist\u00f3w. Dlatego nikogo nie dziwi, \u017ce jedn\u0105 z idei (hehe) za\u0142o\u017cycielskich Kotlina by\u0142o stworzenie j\u0119zyka, kt\u00f3ry b\u0119dzie w maksymalnie wygodny spos\u00f3b integrowa\u0142 si\u0119 z IDE. Ma to swoje dobre strony - Intellij Idea jest \u015bwietnym IDE, kt\u00f3re jest u\u017cywane przez prawie 80% programist\u00f3w Java. W 2020 roku do beczki miodu dosypano jednak \u0142y\u017ck\u0119 dziegciu - o ile ilo\u015b\u0107 u\u017cytkownik\u00f3w Kotlina nie u\u017cywaj\u0105cych narz\u0119dzi od jego tw\u00f3rc\u00f3w zawsze by\u0142a homeopatyczna, to w zesz\u0142ym roku JetBrains zdecydowa\u0142o si\u0119 na i\u015bcie applowski ruch, \u201cwmergowuj\u0105c\u201d plugin do obs\u0142ugi Kotlina do repozytorium IDE. Spowodowa\u0142o to, \u017ce j\u0119zyk bardzo mocno spl\u0105ta\u0142 si\u0119 z jedynym s\u0142usznym narz\u0119dziem, przez co w zasadzie niemo\u017cliwe sta\u0142o si\u0119 u\u017cywanie go z jakimkolwiek innym IDE. JetBrains twierdzi, \u017ce pozwoli\u0142o im to na uzyskanie znacznie wy\u017cszej jako\u015bci narz\u0119dzi, ale je\u017celi cenisz sobie otwarto\u015b\u0107 ekosystemu lub jeste\u015b fanem Emacsa, Twoje z\u0119by mog\u0105 niejednokrotnie zazgrzyta\u0107.<\/p>\n","innerContent":["\n<p>Wszystkim dzia\u0142aniom JetBrains przy\u015bwieca fakt, \u017ce dobra narz\u0119dzi\u00f3wka zwi\u0119ksza w olbrzymim stopniu wydajno\u015b\u0107 programist\u00f3w. Dlatego nikogo nie dziwi, \u017ce jedn\u0105 z idei (hehe) za\u0142o\u017cycielskich Kotlina by\u0142o stworzenie j\u0119zyka, kt\u00f3ry b\u0119dzie w maksymalnie wygodny spos\u00f3b integrowa\u0142 si\u0119 z IDE. Ma to swoje dobre strony - Intellij Idea jest \u015bwietnym IDE, kt\u00f3re jest u\u017cywane przez prawie 80% programist\u00f3w Java. W 2020 roku do beczki miodu dosypano jednak \u0142y\u017ck\u0119 dziegciu - o ile ilo\u015b\u0107 u\u017cytkownik\u00f3w Kotlina nie u\u017cywaj\u0105cych narz\u0119dzi od jego tw\u00f3rc\u00f3w zawsze by\u0142a homeopatyczna, to w zesz\u0142ym roku JetBrains zdecydowa\u0142o si\u0119 na i\u015bcie applowski ruch, \u201cwmergowuj\u0105c\u201d plugin do obs\u0142ugi Kotlina do repozytorium IDE. Spowodowa\u0142o to, \u017ce j\u0119zyk bardzo mocno spl\u0105ta\u0142 si\u0119 z jedynym s\u0142usznym narz\u0119dziem, przez co w zasadzie niemo\u017cliwe sta\u0142o si\u0119 u\u017cywanie go z jakimkolwiek innym IDE. JetBrains twierdzi, \u017ce pozwoli\u0142o im to na uzyskanie znacznie wy\u017cszej jako\u015bci narz\u0119dzi, ale je\u017celi cenisz sobie otwarto\u015b\u0107 ekosystemu lub jeste\u015b fanem Emacsa, Twoje z\u0119by mog\u0105 niejednokrotnie zazgrzyta\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Gradle<\/h3>\n","innerContent":["\n<h3>Gradle<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kolejnym wa\u017cnym narz\u0119dziem je\u015bli chodzi o wytwarzanie oprogramowania w Kotlinie jest Gradle. Tutaj, co ciekawe, m\u00f3wimy o obop\u00f3lnej korzy\u015bci. Z jednej strony, Gradle od pocz\u0105tku by\u0142o build toolem wspieraj\u0105cym j\u0119zyk JetBrains, z drugiej Kotlin dokona\u0142 w nim sporej rewolucji. To w\u0142a\u015bnie w tym j\u0119zyku pojawi\u0142 si\u0119 bowiem pierwszy alternatywny DSL do definiowania build\u00f3w gradlowych.&nbsp;<\/p>\n","innerContent":["\n<p>Kolejnym wa\u017cnym narz\u0119dziem je\u015bli chodzi o wytwarzanie oprogramowania w Kotlinie jest Gradle. Tutaj, co ciekawe, m\u00f3wimy o obop\u00f3lnej korzy\u015bci. Z jednej strony, Gradle od pocz\u0105tku by\u0142o build toolem wspieraj\u0105cym j\u0119zyk JetBrains, z drugiej Kotlin dokona\u0142 w nim sporej rewolucji. To w\u0142a\u015bnie w tym j\u0119zyku pojawi\u0142 si\u0119 bowiem pierwszy alternatywny DSL do definiowania build\u00f3w gradlowych.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W por\u00f3wnaniu do oryginalnego syntaxu, opieraj\u0105cego si\u0119 o j\u0119zyk Groovy, wariant Kotlinowy pozwala na znacznie lepsze podpowiadanie sk\u0142adni. Jest to wi\u0119c obiektywnie lepsza metoda tworzenia build skrypt\u00f3w, ale niestety nie mog\u0119 jej z czystym sumieniem poleci\u0107. Przez lata w sieci pojawi\u0142o si\u0119 mas\u0119 tutoriali, poradnik\u00f3w i przyk\u0142ad\u00f3w dla groove\u2019owego wariantu Gradle, dlatego te\u017c o wiele \u0142atwiej ci\u0105gle trafi\u0107 na \u201cgotowce\u201d rozwi\u0105za\u0144 w\u0142a\u015bnie w nim. Kotlin niestety ci\u0105gle stanowi w tym ekosystemie j\u0119zyk drugiej kategorii. To si\u0119 powoli zmienia, ale jednak nie tak szybko jak si\u0119 spodziewa\u0142em, gdy rozwi\u0105zanie debiutowa\u0142o kilka lat temu.<\/p>\n","innerContent":["\n<p>W por\u00f3wnaniu do oryginalnego syntaxu, opieraj\u0105cego si\u0119 o j\u0119zyk Groovy, wariant Kotlinowy pozwala na znacznie lepsze podpowiadanie sk\u0142adni. Jest to wi\u0119c obiektywnie lepsza metoda tworzenia build skrypt\u00f3w, ale niestety nie mog\u0119 jej z czystym sumieniem poleci\u0107. Przez lata w sieci pojawi\u0142o si\u0119 mas\u0119 tutoriali, poradnik\u00f3w i przyk\u0142ad\u00f3w dla groove\u2019owego wariantu Gradle, dlatego te\u017c o wiele \u0142atwiej ci\u0105gle trafi\u0107 na \u201cgotowce\u201d rozwi\u0105za\u0144 w\u0142a\u015bnie w nim. Kotlin niestety ci\u0105gle stanowi w tym ekosystemie j\u0119zyk drugiej kategorii. To si\u0119 powoli zmienia, ale jednak nie tak szybko jak si\u0119 spodziewa\u0142em, gdy rozwi\u0105zanie debiutowa\u0142o kilka lat temu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Kompilator<\/h3>\n","innerContent":["\n<h3>Kompilator<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ach zbieraj\u0105 nam si\u0119 te wady Kotlina jako\u015b przy tej sekcji tooling. Przez lata to w\u0142a\u015bnie wolna kompilacja by\u0142a najcz\u0119\u015bciej przywo\u0142ywan\u0105 wad\u0105 j\u0119zyka od JetBrains. I je\u015bli wydaje Wam si\u0119, \u017ce to pewnie przesada, to niestety nie - sam pami\u0119tam, \u017ce moje pierwsza przygoda z Kotlinem prawie zako\u0144czy\u0142a si\u0119 w momencie, gdy okaza\u0142o si\u0119, \u017ce odpalenie unit test\u00f3w trwa oko\u0142o minuty (!). Na szcz\u0119\u015bcie od tamtego czasu sytuacja si\u0119 znacznie poprawi\u0142a, a dzi\u0119ki nowej reprezentacji wewn\u0119trznej zyskali\u015bmy nie tylko szybko\u015b\u0107 kompilacji, ale r\u00f3wnie\u017c lepsz\u0105 interoperacyjno\u015b\u0107 z sam\u0105 Jav\u0105 (co te\u017c historycznie bywa\u0142o problemem). Kompilacja Kotlina jest zreszt\u0105 bardzo ciekawym tematem, tw\u00f3rcy stosuj\u0105 mas\u0119 sztuczek, \u017ceby zapewni\u0107 efektywno\u015b\u0107 ca\u0142ego procesu. Kulminacj\u0105 prac ostatnich lat ma by\u0107 za\u015b K2 - kompilator, kt\u00f3ry ma pozwoli\u0107 na szybsz\u0105 iteracj\u0119 nad nowymi funkcjami j\u0119zyka poprzez uwsp\u00f3lnienie kluczowych element\u00f3w procesu mi\u0119dzy Kotlina JVM, Kotlina JS i Kotlina Native.<\/p>\n","innerContent":["\n<p>Ach zbieraj\u0105 nam si\u0119 te wady Kotlina jako\u015b przy tej sekcji tooling. Przez lata to w\u0142a\u015bnie wolna kompilacja by\u0142a najcz\u0119\u015bciej przywo\u0142ywan\u0105 wad\u0105 j\u0119zyka od JetBrains. I je\u015bli wydaje Wam si\u0119, \u017ce to pewnie przesada, to niestety nie - sam pami\u0119tam, \u017ce moje pierwsza przygoda z Kotlinem prawie zako\u0144czy\u0142a si\u0119 w momencie, gdy okaza\u0142o si\u0119, \u017ce odpalenie unit test\u00f3w trwa oko\u0142o minuty (!). Na szcz\u0119\u015bcie od tamtego czasu sytuacja si\u0119 znacznie poprawi\u0142a, a dzi\u0119ki nowej reprezentacji wewn\u0119trznej zyskali\u015bmy nie tylko szybko\u015b\u0107 kompilacji, ale r\u00f3wnie\u017c lepsz\u0105 interoperacyjno\u015b\u0107 z sam\u0105 Jav\u0105 (co te\u017c historycznie bywa\u0142o problemem). Kompilacja Kotlina jest zreszt\u0105 bardzo ciekawym tematem, tw\u00f3rcy stosuj\u0105 mas\u0119 sztuczek, \u017ceby zapewni\u0107 efektywno\u015b\u0107 ca\u0142ego procesu. Kulminacj\u0105 prac ostatnich lat ma by\u0107 za\u015b K2 - kompilator, kt\u00f3ry ma pozwoli\u0107 na szybsz\u0105 iteracj\u0119 nad nowymi funkcjami j\u0119zyka poprzez uwsp\u00f3lnienie kluczowych element\u00f3w procesu mi\u0119dzy Kotlina JVM, Kotlina JS i Kotlina Native.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Analiza Statyczna<\/h3>\n","innerContent":["\n<h3>Analiza Statyczna<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jestem fanem analizy statycznej, dlatego bardzo ciesz\u0119 si\u0119, \u017ce Kotlin posiada w tym temacie sporo interesuj\u0105cych narz\u0119dzi. Przez lata by\u0142y one utrzymywane g\u0142\u00f3wnie przez spo\u0142eczno\u015b\u0107. Mogli\u015bmy u\u017cywa\u0107:&nbsp;<\/p>\n","innerContent":["\n<p>Jestem fanem analizy statycznej, dlatego bardzo ciesz\u0119 si\u0119, \u017ce Kotlin posiada w tym temacie sporo interesuj\u0105cych narz\u0119dzi. Przez lata by\u0142y one utrzymywane g\u0142\u00f3wnie przez spo\u0142eczno\u015b\u0107. Mogli\u015bmy u\u017cywa\u0107:&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/github.com\/pinterest\/ktlint\">ktlinta<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod ze zbiorem predefiniowanych regu\u0142 syntaktycznych<\/li><li><a href=\"https:\/\/github.com\/detekt\/detekt\">detekt<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod pod k\u0105tem popularnych podatno\u015bci.<\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/github.com\/pinterest\/ktlint\">ktlinta<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod ze zbiorem predefiniowanych regu\u0142 syntaktycznych<\/li><li><a href=\"https:\/\/github.com\/detekt\/detekt\">detekt<\/a>, kt\u00f3ry sprawdza\u0142 nasz kod pod k\u0105tem popularnych podatno\u015bci.<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>JetBrains postanowi\u0142o jednak postanowi\u0142o dorzuci\u0107 co\u015b od siebie i stworzy\u0142o Qodan\u0119 - narz\u0119dzie przeznaczone do odpalania w ramach terminala lub systemu CI, posiadaj\u0105ce mo\u017cliwo\u015bci zbli\u017cone do tych posiadanych przez tooling Intellij. Qodana jest obecnie w Preview, ale ju\u017c teraz zapowiada si\u0119 na istotny dodatek do portfolio narz\u0119dzi od JetBrains.<\/p>\n","innerContent":["\n<p>JetBrains postanowi\u0142o jednak postanowi\u0142o dorzuci\u0107 co\u015b od siebie i stworzy\u0142o Qodan\u0119 - narz\u0119dzie przeznaczone do odpalania w ramach terminala lub systemu CI, posiadaj\u0105ce mo\u017cliwo\u015bci zbli\u017cone do tych posiadanych przez tooling Intellij. Qodana jest obecnie w Preview, ale ju\u017c teraz zapowiada si\u0119 na istotny dodatek do portfolio narz\u0119dzi od JetBrains.<\/p>\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 w temacie analizy statycznej: firma pokaza\u0142a ostatnio r\u00f3wnie\u017c Kover -&nbsp; narz\u0119dzie do liczenia pokrycia kodem. Sama praktyka liczenia Code Coverage sta\u0142a si\u0119 ostatnimi czasy do\u015b\u0107 kontrowersyjna, ale wed\u0142ug ma ona sporo zastosowa\u0144, wi\u0119c cieszy mnie inwestycja r\u00f3wnie\u017c w tym obszarze.<\/p>\n","innerContent":["\n<p>A jak ju\u017c jeste\u015bmy w temacie analizy statycznej: firma pokaza\u0142a ostatnio r\u00f3wnie\u017c Kover -&nbsp; narz\u0119dzie do liczenia pokrycia kodem. Sama praktyka liczenia Code Coverage sta\u0142a si\u0119 ostatnimi czasy do\u015b\u0107 kontrowersyjna, ale wed\u0142ug ma ona sporo zastosowa\u0144, wi\u0119c cieszy mnie inwestycja r\u00f3wnie\u017c w tym obszarze.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>To jeszcze przejd\u017amy przez najwa\u017cniejsze biblioteki&nbsp;<\/h2>\n","innerContent":["\n<h2>To jeszcze przejd\u017amy przez najwa\u017cniejsze biblioteki&nbsp;<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><strong><a href=\"https:\/\/www.spekframework.org\/\">Spek<\/a><\/strong> - g\u0142\u00f3wna biblioteka do test\u00f3w, kt\u00f3ra mnie osobi\u015bcie ze wszystkich dost\u0119pnych na rynku najbardziej przypomina JavaScriptow Jasmine. Pozwala na \u0142adne pisanie zagnie\u017cd\u017conych test\u00f3w w stylu BDD i posiada dobre wsparcie do testowania korutyn<\/li><li><strong><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\">kotlinx.serialization<\/a> <\/strong>- Kotlin posiada bardzo dobre wsparcie dla serializacji do r\u00f3\u017cnych format\u00f3w takich jak JSON czy YAML, ale nie w bibliotece standardowej a w\u0142a\u015bnie w zewn\u0119trznym rozszerzeniu <strong>kotlinx.serialization<\/strong> (kt\u00f3re te\u017c jest tworzone przez JetBrains). Opr\u00f3cz tego, \u017ce jego konfiguracja wymaga nieco Gradlowej magii, to jest na tyle wygodne, \u017ce dok\u0142adam je do w\u0142a\u015bciwie ka\u017cdego projektu, nie spogl\u0105daj\u0105c wcale w kierunku np. Jacksona, kt\u00f3ry te\u017c ma wsparcie dla Kotlina<\/li><li><strong><a href=\"https:\/\/www.http4k.org\/\">http4k<\/a> <\/strong>- mamy tu do czynienia z klientem HTTP. Cho\u0107 nie jest to produkt JetBrains, co nie przeszkadza jej w byciu jednym z najcz\u0119\u015bciej wybieranych rozwi\u0105za\u0144 w Kotlinowym \u015bwiecie. Podobnie jak poprzednicy, cechuje si\u0119 dobrym natywnym wsparciem dla r\u00f3\u017cnych rozwi\u0105za\u0144 j\u0119zyka i stanowi wygodne rozwi\u0105zanie do produkcji i konsumpcji r\u00f3\u017cnych API<\/li><li><strong><a href=\"https:\/\/ktor.io\/\">KTOR<\/a> <\/strong>- tutaj m\u00f3wimy ju\u017c o rozwi\u0105zaniu, kt\u00f3re mo\u017cna umiejscowi\u0107 gdzie\u015b pomi\u0119dzy bibliotek\u0105, a frameworkiem. Jest to forma <strong>http4k<\/strong> na sterydach, daj\u0105ca u\u017cytkownikom w zasadzie mo\u017cliwo\u015b\u0107 stworzenia pe\u0142nego restowego API w spos\u00f3b mocno funkcyjny. <strong>KTOR <\/strong>w pe\u0142ni wykorzystuje moc korutyny przy tworzenia API.<\/li><\/ul>\n","innerContent":["\n<ul><li><strong><a href=\"https:\/\/www.spekframework.org\/\">Spek<\/a><\/strong> - g\u0142\u00f3wna biblioteka do test\u00f3w, kt\u00f3ra mnie osobi\u015bcie ze wszystkich dost\u0119pnych na rynku najbardziej przypomina JavaScriptow Jasmine. Pozwala na \u0142adne pisanie zagnie\u017cd\u017conych test\u00f3w w stylu BDD i posiada dobre wsparcie do testowania korutyn<\/li><li><strong><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\">kotlinx.serialization<\/a> <\/strong>- Kotlin posiada bardzo dobre wsparcie dla serializacji do r\u00f3\u017cnych format\u00f3w takich jak JSON czy YAML, ale nie w bibliotece standardowej a w\u0142a\u015bnie w zewn\u0119trznym rozszerzeniu <strong>kotlinx.serialization<\/strong> (kt\u00f3re te\u017c jest tworzone przez JetBrains). Opr\u00f3cz tego, \u017ce jego konfiguracja wymaga nieco Gradlowej magii, to jest na tyle wygodne, \u017ce dok\u0142adam je do w\u0142a\u015bciwie ka\u017cdego projektu, nie spogl\u0105daj\u0105c wcale w kierunku np. Jacksona, kt\u00f3ry te\u017c ma wsparcie dla Kotlina<\/li><li><strong><a href=\"https:\/\/www.http4k.org\/\">http4k<\/a> <\/strong>- mamy tu do czynienia z klientem HTTP. Cho\u0107 nie jest to produkt JetBrains, co nie przeszkadza jej w byciu jednym z najcz\u0119\u015bciej wybieranych rozwi\u0105za\u0144 w Kotlinowym \u015bwiecie. Podobnie jak poprzednicy, cechuje si\u0119 dobrym natywnym wsparciem dla r\u00f3\u017cnych rozwi\u0105za\u0144 j\u0119zyka i stanowi wygodne rozwi\u0105zanie do produkcji i konsumpcji r\u00f3\u017cnych API<\/li><li><strong><a href=\"https:\/\/ktor.io\/\">KTOR<\/a> <\/strong>- tutaj m\u00f3wimy ju\u017c o rozwi\u0105zaniu, kt\u00f3re mo\u017cna umiejscowi\u0107 gdzie\u015b pomi\u0119dzy bibliotek\u0105, a frameworkiem. Jest to forma <strong>http4k<\/strong> na sterydach, daj\u0105ca u\u017cytkownikom w zasadzie mo\u017cliwo\u015b\u0107 stworzenia pe\u0142nego restowego API w spos\u00f3b mocno funkcyjny. <strong>KTOR <\/strong>w pe\u0142ni wykorzystuje moc korutyny przy tworzenia API.<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Ca\u0142o\u015b\u0107 zako\u0144czymy za\u015b przegl\u0105dem wsparcia Kotlina w popularnych frameworkach<\/h2>\n","innerContent":["\n<h2>Ca\u0142o\u015b\u0107 zako\u0144czymy za\u015b przegl\u0105dem wsparcia Kotlina w popularnych frameworkach<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Spring Boot<\/h3>\n","innerContent":["\n<h3>Spring Boot<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Spring od dawna mocno inwestuje w Kotlina - i to wida\u0107. Jego tw\u00f3rcy regularnie wydaj\u0105 kolejne edycje swojego przegl\u0105du <a href=\"https:\/\/www.youtube.com\/watch?v=tt4cxR5onQU\">The State of Kotlin Support in Spring<\/a>, gdzie chwal\u0105 si\u0119 jak bardzo kochaj\u0105 Kotlina i staraj\u0105 si\u0119 by\u0107 na bie\u017c\u0105co z zamieszczanymi zmianami. Dlatego te\u017c np. ju\u017c dzisiaj mo\u017cecie u\u017cywa\u0107 WebFluxa opartego o korutyny. Bardzo ciekawym projektem jest te\u017c KoFu - specjalny DSL, pozwalaj\u0105cy na konfigurowanie Spring Bootowej aplikacji za pomoc\u0105 Kotlina<\/p>\n","innerContent":["\n<p>Spring od dawna mocno inwestuje w Kotlina - i to wida\u0107. Jego tw\u00f3rcy regularnie wydaj\u0105 kolejne edycje swojego przegl\u0105du <a href=\"https:\/\/www.youtube.com\/watch?v=tt4cxR5onQU\">The State of Kotlin Support in Spring<\/a>, gdzie chwal\u0105 si\u0119 jak bardzo kochaj\u0105 Kotlina i staraj\u0105 si\u0119 by\u0107 na bie\u017c\u0105co z zamieszczanymi zmianami. Dlatego te\u017c np. ju\u017c dzisiaj mo\u017cecie u\u017cywa\u0107 WebFluxa opartego o korutyny. Bardzo ciekawym projektem jest te\u017c KoFu - specjalny DSL, pozwalaj\u0105cy na konfigurowanie Spring Bootowej aplikacji za pomoc\u0105 Kotlina<\/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>val app = webApplication {\n\tlogging { level = LogLevel.DEBUG }\n\tbeans { bean&lt;SampleService&gt;()}\n\twebMvc {\n\t\tport = if (profiles.contains(\"test\")) 8181 else 8080\n\t\trouter {\n\t\t\tval service = ref&lt;SampleService&gt;()\n\t\t\tGET(\"\/api\") {\n\t\t\t\tok().body(Sample(service.generateMessage()))\n\t\t\t}\n\t\t}\n\t\tconverters {\n\t\t\tstring()\n\t\t\tjackson {\n\t\t\t\tindentOutput = true\n\t\t\t}\n\t\t}}}\n\ndata class Sample(val message: String)\n\nclass SampleService { fun generateMessage() = \"Hello world!\" }\n\nfun main() {\n\tapp.run()\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>val app = webApplication {\n\tlogging { level = LogLevel.DEBUG }\n\tbeans { bean&lt;SampleService&gt;()}\n\twebMvc {\n\t\tport = if (profiles.contains(\"test\")) 8181 else 8080\n\t\trouter {\n\t\t\tval service = ref&lt;SampleService&gt;()\n\t\t\tGET(\"\/api\") {\n\t\t\t\tok().body(Sample(service.generateMessage()))\n\t\t\t}\n\t\t}\n\t\tconverters {\n\t\t\tstring()\n\t\t\tjackson {\n\t\t\t\tindentOutput = true\n\t\t\t}\n\t\t}}}\n\ndata class Sample(val message: String)\n\nclass SampleService { fun generateMessage() = \"Hello world!\" }\n\nfun main() {\n\tapp.run()\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na koniec wspomn\u0119, \u017ce r\u00f3wnie\u017c Spring Native wspiera Kotlina (w jego edycji Native), pozwalaj\u0105c na generowanie obraz\u00f3w do uruchomienia w ramach maszyny GraalVM (stan obecnego wsparcia dla GraalVM to jest og\u00f3lnie frapuj\u0105cy temat, kt\u00f3ry kiedy\u015b nie omieszkam tu opisa\u0107).<\/p>\n","innerContent":["\n<p>Na koniec wspomn\u0119, \u017ce r\u00f3wnie\u017c Spring Native wspiera Kotlina (w jego edycji Native), pozwalaj\u0105c na generowanie obraz\u00f3w do uruchomienia w ramach maszyny GraalVM (stan obecnego wsparcia dla GraalVM to jest og\u00f3lnie frapuj\u0105cy temat, kt\u00f3ry kiedy\u015b nie omieszkam tu opisa\u0107).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Micronaut<\/h3>\n","innerContent":["\n<h3>Micronaut<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nast\u0119pca Grails\u00f3w od razu wskoczy\u0142 te\u017c na Kotlinowy wagonik, a tw\u00f3rcy chwal\u0105 si\u0119, \u017ce od pocz\u0105tku traktowali j\u0119zyk jako obywatela pierwszej kategorii - co akurat jest do nich podobne, zawsze lubili nowinki (Grails to w ko\u0144cu skr\u00f3t od Groovy on Grails). Wida\u0107, \u017ce wzi\u0119li sobie do serca wspieranie wszystkich koncept\u00f3w j\u0119zyka, poniewa\u017c pozwalaj\u0105 na u\u017cycie korutyn w zasadzie na przekr\u00f3j ca\u0142ego stacku aplikacji. Ich wsparcie opiera si\u0119 wprawdzie o nak\u0142adk\u0119 na Reactora poprzez u\u017cyciu biblioteki org.jetbrains.kotlinx:kotlinx-coroutines-reactor, ale w dalszym ci\u0105gu pozwala to na tworzenie np. bardzo eleganckich kontroler\u00f3w:<\/p>\n","innerContent":["\n<p>Nast\u0119pca Grails\u00f3w od razu wskoczy\u0142 te\u017c na Kotlinowy wagonik, a tw\u00f3rcy chwal\u0105 si\u0119, \u017ce od pocz\u0105tku traktowali j\u0119zyk jako obywatela pierwszej kategorii - co akurat jest do nich podobne, zawsze lubili nowinki (Grails to w ko\u0144cu skr\u00f3t od Groovy on Grails). Wida\u0107, \u017ce wzi\u0119li sobie do serca wspieranie wszystkich koncept\u00f3w j\u0119zyka, poniewa\u017c pozwalaj\u0105 na u\u017cycie korutyn w zasadzie na przekr\u00f3j ca\u0142ego stacku aplikacji. Ich wsparcie opiera si\u0119 wprawdzie o nak\u0142adk\u0119 na Reactora poprzez u\u017cyciu biblioteki org.jetbrains.kotlinx:kotlinx-coroutines-reactor, ale w dalszym ci\u0105gu pozwala to na tworzenie np. bardzo eleganckich kontroler\u00f3w:<\/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>@Get(\"\/simple\", produces = &#91;MediaType.TEXT_PLAIN])\nsuspend fun simple(): String { \n   return \"Hello\"\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>@Get(\"\/simple\", produces = &#91;MediaType.TEXT_PLAIN])\nsuspend fun simple(): String { \n   return \"Hello\"\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ca\u0142o\u015b\u0107 oczywi\u015bcie r\u00f3wnie\u017c wspiera Kotlinowy wariant GraalVM, a tak\u017ce bardzo dobrze integruje si\u0119 ze wspomnianym KTORem. Nie umniejszaj\u0105c Springowi, \u015bmiem twierdzi\u0107, \u017ce ze wszystkich narz\u0119dzi to w\u0142a\u015bnie Micronaut najlepiej sprawdza si\u0119 w u\u017cyciu z Kotlinem.<\/p>\n","innerContent":["\n<p>Ca\u0142o\u015b\u0107 oczywi\u015bcie r\u00f3wnie\u017c wspiera Kotlinowy wariant GraalVM, a tak\u017ce bardzo dobrze integruje si\u0119 ze wspomnianym KTORem. Nie umniejszaj\u0105c Springowi, \u015bmiem twierdzi\u0107, \u017ce ze wszystkich narz\u0119dzi to w\u0142a\u015bnie Micronaut najlepiej sprawdza si\u0119 w u\u017cyciu z Kotlinem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Quarkus<\/h3>\n","innerContent":["\n<h3>Quarkus<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ze wzgl\u0119du na specjalne miejsce w moim serduszku dla Jakarty EE, oparty o Microprofile Quarkus to m\u00f3j ulubiony z nowopowsta\u0142ych JVMowych framework\u00f3w. Niestety, je\u017celi chodzi o wsparcie Kotlina, wypada on chyba najs\u0142abiej. Oczywi\u015bcie, wi\u0119kszo\u015b\u0107 funkcjonalno\u015bci dzia\u0142a dobrze (tw\u00f3rcy Quarkusa chwal\u0105 si\u0119 min. \u015bwietnym wsparciem Kotlina przez ich \u201cdev mode\u201d, pozwalaj\u0105cy na szybkie prze\u0142adowanie klas w aplikacji), ale niestety wsparcie korutyn mocno kuleje. Microprofile - m\u0142odszy, zwinniejszy brat Jakarty EE jest tutaj pewn\u0105 kul\u0105 u nogi. Samych korutyn mo\u017cna u\u017cywa\u0107, ale w miejscach, gdzie wspierany jest standard Microprofile (czyli np. w endpointach Restowych), niezb\u0119dne jest opakowanie suspend\u00f3w za pomoc\u0105 biblioteki \u200b\u200b<a href=\"https:\/\/smallrye.io\/smallrye-mutiny\/guides\/kotlin\">SmallRye Mutiny<\/a>.&nbsp;<\/p>\n","innerContent":["\n<p>Ze wzgl\u0119du na specjalne miejsce w moim serduszku dla Jakarty EE, oparty o Microprofile Quarkus to m\u00f3j ulubiony z nowopowsta\u0142ych JVMowych framework\u00f3w. Niestety, je\u017celi chodzi o wsparcie Kotlina, wypada on chyba najs\u0142abiej. Oczywi\u015bcie, wi\u0119kszo\u015b\u0107 funkcjonalno\u015bci dzia\u0142a dobrze (tw\u00f3rcy Quarkusa chwal\u0105 si\u0119 min. \u015bwietnym wsparciem Kotlina przez ich \u201cdev mode\u201d, pozwalaj\u0105cy na szybkie prze\u0142adowanie klas w aplikacji), ale niestety wsparcie korutyn mocno kuleje. Microprofile - m\u0142odszy, zwinniejszy brat Jakarty EE jest tutaj pewn\u0105 kul\u0105 u nogi. Samych korutyn mo\u017cna u\u017cywa\u0107, ale w miejscach, gdzie wspierany jest standard Microprofile (czyli np. w endpointach Restowych), niezb\u0119dne jest opakowanie suspend\u00f3w za pomoc\u0105 biblioteki \u200b\u200b<a href=\"https:\/\/smallrye.io\/smallrye-mutiny\/guides\/kotlin\">SmallRye Mutiny<\/a>.&nbsp;<\/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 mutinyService(id: Long): Uni&lt;Fruit?&gt; {\n    GlobalScope.async {\n        findById(id)\n    }.asUni()\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>fun mutinyService(id: Long): Uni&lt;Fruit?&gt; {\n    GlobalScope.async {\n        findById(id)\n    }.asUni()\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jest to bardzo brzydkie, a efekt robi si\u0119 co najwy\u017cej \u015bredni. Dlatego o ile nie zniech\u0119cam zupe\u0142nie do u\u017cywania Quarkusa z Kotlinem, to jednak nie wykorzystacie w ten spos\u00f3b najpot\u0119\u017cniejszych mo\u017cliwo\u015bci j\u0119zyka je\u015bli chodzi o wsp\u00f3\u0142bie\u017cno\u015b\u0107\u2026 przynajmniej nie w elegancki spos\u00f3b.<\/p>\n","innerContent":["\n<p>Jest to bardzo brzydkie, a efekt robi si\u0119 co najwy\u017cej \u015bredni. Dlatego o ile nie zniech\u0119cam zupe\u0142nie do u\u017cywania Quarkusa z Kotlinem, to jednak nie wykorzystacie w ten spos\u00f3b najpot\u0119\u017cniejszych mo\u017cliwo\u015bci j\u0119zyka je\u015bli chodzi o wsp\u00f3\u0142bie\u017cno\u015b\u0107\u2026 przynajmniej nie w elegancki spos\u00f3b.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>I jeszcze lekcja na koniec:<br><\/h2>\n","innerContent":["\n<h2>I jeszcze lekcja na koniec:<br><\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":[],"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/buq1tgml8ea51.jpg\" alt=\"Haha Kotlin go brrr : r\/ProgrammerHumor\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/buq1tgml8ea51.jpg\" alt=\"Haha Kotlin go brrr : r\/ProgrammerHumor\"\/><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10037","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=10037"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10037\/revisions"}],"predecessor-version":[{"id":10544,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10037\/revisions\/10544"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}