{"id":376798,"date":"2023-08-02T21:14:31","date_gmt":"2023-08-02T20:14:31","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=376798"},"modified":"2025-09-17T14:12:04","modified_gmt":"2025-09-17T13:12:04","slug":"apresentamos-o-kotlin-notebook","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2023\/08\/apresentamos-o-kotlin-notebook\/","title":{"rendered":"Apresentamos o Kotlin Notebook"},"content":{"rendered":"\n<p>J\u00e1 est\u00e1 dispon\u00edvel a primeira vers\u00e3o experimental do plug-in Kotlin Notebook para o IntelliJ IDEA! Esta postagem oferece um insight sobre a funcionalidade e os casos de uso do plug-in, mas antes de entrarmos nisso, gostar\u00edamos de deixar o plug-in falar por si mesmo:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Introducing Kotlin Notebook\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/2PLYlDJPelQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<div id=\"installButton\" style=\"margin: auto; width: 245px; margin-bottom: 30px;\">\n<script src=\"https:\/\/plugins.jetbrains.com\/assets\/scripts\/mp-widget.js\"><\/script>\n<script>\n  \/\/ Please, replace #yourelement with a real element id on your webpage\n  MarketplaceWidget.setupMarketplaceWidget('install', 16340, \"#installButton\");\n<\/script>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">O que \u00e9 o plug-in Kotlin Notebook?<\/h2>\n\n\n\n<p>Um notebook \u00e9 uma ferramenta interativa que permite a voc\u00ea combinar c\u00f3digo, visualiza\u00e7\u00f5es e texto em um \u00fanico documento. Em notebooks, voc\u00ea pode escrever e executar trechos de c\u00f3digo (c\u00e9lulas), visualizar os resultados e documentar o seu processo mental, tudo em um s\u00f3 lugar.<\/p>\n\n\n\n<p>Notebooks j\u00e1 s\u00e3o amplamente usados com confian\u00e7a para prototipagem r\u00e1pida, estat\u00edsticas e ci\u00eancia de dados. O plug-in Kotlin Notebook leva o poder do desenvolvimento interativo ao IntelliJ IDEA, suplementando todo o poder do suporte \u00e0 linguagem Kotlin nesse IDE com os recursos vers\u00e1teis de visualiza\u00e7\u00e3o dos navegadores.<\/p>\n\n\n\n<p>Vamos mergulhar nos detalhes t\u00e9cnicos para vermos o que este plug-in pode fazer e como ele funciona.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instala\u00e7\u00e3o<\/h2>\n\n\n\n<p>Para obter o plug-in, basta instal\u00e1-lo a partir do <strong>Marketplace<\/strong> na aba <strong>Settings | Plugins<\/strong> do IntelliJ IDEA Ultimate. Voc\u00ea precisa estar usando pelo menos a vers\u00e3o 2023.1.2 do IntelliJ IDEA. Talvez voc\u00ea at\u00e9 consiga instalar o plug-in em vers\u00f5es anteriores, mas ele ficar\u00e1 inst\u00e1vel.<\/p>\n\n\n\n<p>Durante o processo de instala\u00e7\u00e3o, voc\u00ea ver\u00e1 uma sugest\u00e3o para instalar o plug-in do Python e voc\u00ea deve aceit\u00e1-la. N\u00e3o se preocupe, isso n\u00e3o instalar\u00e1 o Python na sua esta\u00e7\u00e3o de trabalho. O Kotlin Notebook apenas tem algumas depend\u00eancias de componentes da interface de usu\u00e1rio que est\u00e3o localizados no plug-in do Python. Planejamos remover essas depend\u00eancias em breve.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/8MGry1ISTsJ3z4CiJbmL-qNIEnJ3gpG0D9wqWLdvIqo3d9Cou9s2yD9oVoQ_Blcy6fpS9INbcSdCGLk8AG6Xf52tk4MjmHS7W5a2t-_RTIPsIeEaVN-bmOiC19fluhCI9jPm3C-x5UUBmYWXuTMg-mY-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Observe que no momento, o plug-in Kotlin Notebook s\u00f3 funciona no IntelliJ IDEA Ultimate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Familiarizando-se com o Kotlin Notebook<\/strong><\/h2>\n\n\n\n<p>Depois de instalar o plug-in, voc\u00ea estar\u00e1 pronto para criar o seu primeiro notebook. Essencialmente, um notebook \u00e9 apenas um arquivo em um drive. Portanto, ele pode ser criado em qualquer lugar da visualiza\u00e7\u00e3o <strong>Project<\/strong> atrav\u00e9s da a\u00e7\u00e3o <strong>New | Kotlin Notebook<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/wai7oIn7lFGvKuRfOILwb2jio-DGgxzvbRV33FHI7sV0t8roO-YvTWYvaKro51XxnegZQ6hiNi_2u12nms8iGEwhw7bjuaqWPs9P97tnfwrQARgZCFLmnNmwke7V_j8gA9wOtOh5vyv2D60f1qyYJYQ-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ser\u00e1 criado um arquivo com a extens\u00e3o <strong>.ipynb<\/strong>. Se voc\u00ea j\u00e1 conhecer os notebooks do Jupyter, esta extens\u00e3o deve lhe ser familiar. Internamente, os notebooks do Kotlin seguem a mesma estrutura, formato e protocolo, o que significa que esses arquivos podem ser visualizados no GitHub ou em notebooks do Jupyter ou JupyterLab com o <a href=\"https:\/\/github.com\/Kotlin\/kotlin-jupyter\" target=\"_blank\" rel=\"noopener\">kernel do Kotlin<\/a> instalado.<\/p>\n\n\n\n<p>Depois de criado, o notebook conter\u00e1 apenas a primeira c\u00e9lula, vazia. C\u00e9lulas s\u00e3o os principais blocos sobre os quais os notebooks s\u00e3o constru\u00eddos e podem conter c\u00f3digo ou texto. Para executar uma c\u00e9lula de c\u00f3digo, voc\u00ea pode simplesmente selecion\u00e1-la e depois clicar no bot\u00e3o <strong>Run<\/strong>, ou usar o atalho <strong>Shift + Enter<\/strong>. O c\u00f3digo ser\u00e1 executado e qualquer sa\u00edda ou erros ser\u00e3o exibidos abaixo da c\u00e9lula.<\/p>\n\n\n\n<p>Voc\u00ea tamb\u00e9m pode escrever texto em Markdown nas c\u00e9lulas, o que dar\u00e1 suporte a op\u00e7\u00f5es de formata\u00e7\u00e3o como cabe\u00e7alhos, listas, links, LaTeX e imagens. Para processar uma c\u00e9lula em Markdown e visualizar o texto formatado, basta execut\u00e1-la da mesma maneira que voc\u00ea executaria uma c\u00e9lula de c\u00f3digo.<\/p>\n\n\n\n<p>Notebooks oferecem um fluxo de trabalho tanto interativo quanto iterativo. Voc\u00ea pode executar c\u00e9lulas em qualquer ordem, modificar o c\u00f3digo ou texto, declarar e redeclarar vari\u00e1veis e reexecutar as c\u00e9lulas para ver os resultados atualizados. Isso torna f\u00e1cil experimentar, prototipar e documentar o seu trabalho.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/HElZusfrsgfY4Ss87v34GSPfkfvI5N6TMyHJPhBFgPBgekCDvJ8o4SdCpCTmC2BYyXdZlTkf9n81q7srXB1Jy89ZiEtAIEsnAGGxPnqttPg4UX0uQweLMhYlAvGHAEqV8HOrWrY4K0nI40eqL8wkSug-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Para experimentar em primeira m\u00e3o as vantagens de se usar notebooks na explica\u00e7\u00e3o e documenta\u00e7\u00e3o de c\u00f3digo, recomendamos que voc\u00ea baixe e explore <a href=\"https:\/\/datalore.jetbrains.com\/view\/notebook\/DMtWM05XWOT2Oi6yxZjVkJ\" target=\"_blank\" rel=\"noreferrer noopener\">este notebook<\/a>. Ele demonstra todos os aspectos dos notebooks do Kotlin discutidos nesta postagem, permitindo que voc\u00ea una a teoria e a pr\u00e1tica.<\/p>\n\n\n\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/datalore.jetbrains.com\/view\/notebook\/DMtWM05XWOT2Oi6yxZjVkJ\" target=\"_blank\" rel=\"noopener\">Notebook de exemplo<\/a>\n<p>&nbsp;<\/p>\n<p>A melhor maneira de se familiarizar com notebooks \u00e9 atrav\u00e9s de um notebook! ;-)<\/p>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sa\u00eddas<\/strong><\/h2>\n\n\n\n<p>Um recurso-chave que faz os notebooks se destacarem \u00e9 a variedade de tipos de sa\u00edda que eles suportam:<\/p>\n\n\n\n<ul>\n<li><strong>Texto:<\/strong> Este \u00e9 o tipo mais simples de sa\u00edda e inclui declara\u00e7\u00f5es impressas, valores de vari\u00e1veis ou qualquer sa\u00edda do seu c\u00f3digo que seja baseada em texto. Se o resultado de uma c\u00e9lula n\u00e3o se enquadrar em nenhuma das categorias abaixo, ele ser\u00e1 impresso como texto, atrav\u00e9s do m\u00e9todo <code>toString()<\/code>.<\/li>\n\n\n\n<li><strong>HTML:<\/strong> os notebooks do Jupyter podem exibir HTML diretamente, permitindo formata\u00e7\u00e3o de texto, o uso de tabelas e at\u00e9 embutir Web sites.<\/li>\n\n\n\n<li><strong>Imagens:<\/strong> Imagens est\u00e1ticas podem ser exibidas em formatos como PNG, JPEG e SVG. Resultados do tipo <code>BufferedImage<\/code> tamb\u00e9m s\u00e3o suportados. Todas essas imagens podem vir de arquivos, gr\u00e1ficos gerados ou qualquer outro tipo de m\u00eddia visual.<\/li>\n\n\n\n<li><strong>Texto formatado:<\/strong> C\u00e9lulas em Markdown geram sa\u00edda em HTML formatado, com suporte a listas, estilos de fonte, blocos de c\u00f3digo e muito mais.<\/li>\n\n\n\n<li><strong>LaTeX:<\/strong> F\u00f3rmulas e equa\u00e7\u00f5es matem\u00e1ticas podem ser mostradas lindamente usando o LaTeX, um sistema de composi\u00e7\u00e3o de textos amplamente usado no meio acad\u00eamico.<\/li>\n\n\n\n<li><strong>Erros e traceback:<\/strong> Quando o c\u00f3digo cont\u00e9m erros, os notebooks mostram uma mensagem de erro e um traceback, oferecendo insights para a depura\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Depend\u00eancias do notebook<\/strong><\/h2>\n\n\n\n<p>Tamb\u00e9m \u00e9 importante considerar quais depend\u00eancias o seu notebook ter\u00e1. Obviamente, a biblioteca-padr\u00e3o pode ser usada desde a instala\u00e7\u00e3o, mas ela costuma n\u00e3o bastar. H\u00e1 v\u00e1rias op\u00e7\u00f5es dispon\u00edveis para voc\u00ea:<\/p>\n\n\n\n<ul>\n<li>Voc\u00ea pode usar as depend\u00eancias do seu projeto, garantindo que o notebook tenha acesso \u00e0s mesmas classes.<\/li>\n\n\n\n<li>\u00c9 poss\u00edvel usar classes e outras entidades do pr\u00f3prio projeto dentro do notebook. Por\u00e9m, nesses casos, ser\u00e1 verificado se houve altera\u00e7\u00f5es no projeto e, se necess\u00e1rio, este ser\u00e1 recompilado antes da execu\u00e7\u00e3o de cada c\u00e9lula.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/D9T1xIjCE4Mdys51QmD1aRfRUff5hLu4g2HLihzTbla1LU2TZ3dGzPk_s42ZtRDZrwtDyV9LVMG0kQnDLgR39cI_w0gDgZp-K3l0gEo4t9tIIyyMIh5a31L3gmKiN-ZK56YUiIBbd9-CkdXTtQ1aNTE-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul>\n<li>Voc\u00ea pode carregar qualquer biblioteca do reposit\u00f3rio Maven, especificando suas coordenadas atrav\u00e9s de um trecho de sintaxe ao estilo do Gradle em qualquer c\u00e9lula.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">USE {\n  repositories {\n  maven {\n    url = \"https:\/\/my.secret.repo\/maven\/\"\n    credentials {\n      username = USER\n      password = TOKEN\n    } \n  }\n  dependencies {\n    val ktorVersion = \"2.0.3\"\n    implementation(\"my.secret:artifact:1.0-beta\")\n    implementation(\"io.ktor:ktor-client-core-jvm:$ktorVersion\")\n    implementation(\"io.ktor:ktor-client-apache-jvm:$ktorVersion\")\n  }\n}<\/pre>\n\n\n\n<ul>\n<li>Ou voc\u00ea pode usar a vers\u00e3o mais curta, atrav\u00e9s da anota\u00e7\u00e3o <code>DependsOn<\/code>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@file:DependsOn(\u201cio.ktor:ktor-client-core-jvm:$ktorVersion\u201c)<\/pre>\n\n\n\n<ul>\n<li>Lembrar-se das coordenadas do Maven e localiz\u00e1-las pode ser uma tarefa trabalhosa. Para simplificar esse processo, introduzimos um m\u00e9todo mais inteligente e conveniente de carregar bibliotecas populares. Basta usar o comando m\u00e1gico <code>%use<\/code>, seguido do nome de uma ou mais bibliotecas.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/a8DtL8btAh5gNc2YjMeFuDij8lthwAF16WL2QapFjdvq3vnKHww3FJvs61ebCzY0qcBYR8Pr3LD5I4nQ2UP8uVRYVDY7sYvrr_11FxdsRMkY8q9fVdyqm8ujqd3c3jAbY5zaJ6I8yWqAHhL5mZDoObc-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ao ser executado, o comando <code>%use<\/code> n\u00e3o apenas baixa as depend\u00eancias de bibliotecas, como tamb\u00e9m adiciona importa\u00e7\u00f5es-padr\u00e3o ao notebook. Al\u00e9m disso, ele registra os renderizadores dos tipos da biblioteca e inclui v\u00e1rias outras fun\u00e7\u00f5es, discutidas na pr\u00f3xima se\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Integra\u00e7\u00e3o de bibliotecas<\/strong><\/h2>\n\n\n\n<p>Os notebooks do Kotlin oferecem uma grande variedade de op\u00e7\u00f5es de integra\u00e7\u00e3o de bibliotecas.<\/p>\n\n\n\n<p>Para os usu\u00e1rios aproveitarem essas integra\u00e7\u00f5es, \u00e9 simples; basta adicionar uma \u00fanica linha de c\u00f3digo:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">%use libraryName<\/pre>\n\n\n\n<p>Para os autores de bibliotecas, este mesmo comando serve como trampolim, permitindo que eles:<\/p>\n\n\n\n<ul>\n<li>Baixem arquivos bin\u00e1rios de bibliotecas de qualquer reposit\u00f3rio Maven.<\/li>\n\n\n\n<li>Incluam importa\u00e7\u00f5es iniciais.<\/li>\n\n\n\n<li>Executem c\u00f3digo durante a inicializa\u00e7\u00e3o.<\/li>\n\n\n\n<li>Executem c\u00f3digo antes e depois de cada execu\u00e7\u00e3o de c\u00e9lula.<\/li>\n\n\n\n<li>Pr\u00e9-processem o c\u00f3digo de cada c\u00e9lula.<\/li>\n\n\n\n<li>Acionem um callback na cria\u00e7\u00e3o de vari\u00e1veis de certos tipos.<\/li>\n\n\n\n<li>Criem renderizadores personalizados para uma variedade de tipos definidos na biblioteca.<\/li>\n\n\n\n<li>E muito mais.<\/li>\n<\/ul>\n\n\n\n<p>Tomados em conjunto, estes recursos oferecem possibilidades quase infinitas para criar uma experi\u00eancia interativa de usu\u00e1rio. Considerando os tipos est\u00e1ticos e AOT do Kotlin, a capacidade de gera\u00e7\u00e3o autom\u00e1tica de c\u00f3digo em tempo real oferece um n\u00edvel a mais de flexibilidade e expansibilidade.<\/p>\n\n\n\n<p>Uma documenta\u00e7\u00e3o abrangente pode ser acessada <a href=\"https:\/\/github.com\/Kotlin\/kotlin-jupyter\/blob\/master\/docs\/libraries.md\" target=\"_blank\" rel=\"noopener\">aqui<\/a>. Encorajamos todos os autores de bibliotecas a compartilharem suas integra\u00e7\u00f5es no <a href=\"https:\/\/github.com\/Kotlin\/kotlin-jupyter-libraries\" target=\"_blank\" rel=\"noopener\">registro<\/a> comum, para que elas fiquem dispon\u00edveis a todos os usu\u00e1rios do Kotlin Notebook. Em especial, estamos empolgados de vermos que algumas bibliotecas (como <a href=\"https:\/\/youtu.be\/wT31FB5t-UU\" target=\"_blank\" rel=\"noopener\">WebTau<\/a>, <a href=\"https:\/\/roboquant.org\" target=\"_blank\" rel=\"noopener\">Roboquant<\/a>, <a href=\"https:\/\/github.com\/breandan\/galoisenne\" target=\"_blank\" rel=\"noopener\">Kaliningraph<\/a> e outras) j\u00e1 est\u00e3o se beneficiando desta abordagem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Compartilhamento<\/strong><\/h3>\n\n\n\n<p>\u00c9 comum querer compartilhar os seus notebooks com outras pessoas, tanto dentro quanto fora da sua equipe. Como os notebooks do Kotlin seguem o formato universal do Jupyter, eles podem ser facilmente distribu\u00eddos atrav\u00e9s de qualquer visualizador de notebooks na Web. Em especial, o GitHub tem a capacidade de exibi-los nativamente.<\/p>\n\n\n\n<p>Al\u00e9m disso, a JetBrains tem a plataforma <a href=\"https:\/\/datalore.jetbrains.com\" target=\"_blank\" rel=\"noopener\">Datalore<\/a>, que tem suporte transparente aos notebooks do Kotlin. O Datalore oferece mais que apenas recursos de compartilhamento; ele tamb\u00e9m permite que voc\u00ea execute e edite notebooks e inclui recursos avan\u00e7ados, como relat\u00f3rios interativos, al\u00e9m da op\u00e7\u00e3o de agendar a execu\u00e7\u00e3o de notebooks, para ainda mais conveni\u00eancia e flexibilidade.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Em resumo<\/strong><\/h3>\n\n\n\n<p>A primeira vers\u00e3o experimental do plug-in Kotlin Notebook est\u00e1 pronta para voc\u00ea test\u00e1-la no seu projeto no IntelliJ IDEA Ultimate!<\/p>\n\n\n\n<div id=\"installButton1\" style=\"margin: auto; width:245px; margin-bottom: 30px;\">\n<script src=\"https:\/\/plugins.jetbrains.com\/assets\/scripts\/mp-widget.js\"><\/script>\n<script>\n  \/\/ Please, replace #yourelement with a real element id on your webpage\n  MarketplaceWidget.setupMarketplaceWidget('install', 16340, \"#installButton1\");\n<\/script>\n<\/div>\n\n\n\n<p>Aqui est\u00e1 um notebook de exemplo que voc\u00ea pode baixar e, atrav\u00e9s dele, aprender na pr\u00e1tica os conceitos b\u00e1sicos dos notebooks do Kotlin:<\/p>\n\n\n\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/datalore.jetbrains.com\/view\/notebook\/DMtWM05XWOT2Oi6yxZjVkJ\" target=\"_blank\" rel=\"noopener\">Explorar notebook de exemplo<\/a><\/div>\n<\/div>\n\n\n\n<p>Se voc\u00ea for um autor de bibliotecas, considere <a href=\"https:\/\/github.com\/Kotlin\/kotlin-jupyter\/blob\/master\/docs\/libraries.md\" target=\"_blank\" rel=\"noopener\">adicionar uma integra\u00e7\u00e3o<\/a> com notebooks do Kotlin.<\/p>\n\n\n\n<p>Se voc\u00ea encontrar quaisquer problemas ou bugs, informe-nos criando um ticket no <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KTNB\" target=\"_blank\" rel=\"noopener\">rastreador de issues do projeto<\/a>. Tamb\u00e9m teremos prazer em ouvir o seu feedback no canal <a href=\"https:\/\/kotlinlang.slack.com\/archives\/C05333T208Y\" target=\"_blank\" rel=\"noopener\">#notebook<\/a> do Slack do Kotlin.<\/p>\n\n\n\n<p><em>Tenha um bom Kotlin Notebook!<\/em><\/p>\n\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":369223,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,826,4759,907],"tags":[],"cross-post-tag":[6284],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/376798"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=376798"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/376798\/revisions"}],"predecessor-version":[{"id":624147,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/376798\/revisions\/624147"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/369223"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=376798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=376798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=376798"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=376798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}