Trenger du å teste ut noe kode uten masse oppsett? Har du et datasett du skulle analysert og visualisert? Eller kanskje du bare trenger å dokumentere en API-klient med kjørbare kodeeksempler? Da kan Kotlin Notebook være akkurat det verktøyet du trenger.

Kotlin Notebook er en plugin til IntelliJ som gir deg en editor som kan kombinere kjørbar kode, tekst og visuelle elementer som grafer og bilder. Se på det som en blanding av REPL og notatblokk. Notebooks er fine til å eksperimentere med kode og data, men også til å visualisere og dele resultatene med andre. Kotlin Notebooks ble annonsert på årets KotlinConf i April.

Bygger på velprøvd teknologi

Selv om Kotlin Notebook ble annonsert i våres så har det eksistert en stund i form av en Kotlin kernel til Jupyter Notebook. Jupyter Notebook ble opprinnelig skrevet for Julia, Python og R og derav navnet Ju-Pyt-R. Jupyter Notebook har et stort community og er spesielt populært innen data science. Hvert programmeringsspråk som støttes i Jupyter Notebook må ha en egen kernel og det finnes i dag støtte for over 100 språk.

Kom i gang

For å ta i bruk Kotlin Notebook må du installere en plugin til IntelliJ. Når det er gjort er det bare å velge New -> Kotlin Notebook og gi den et navn.

Ny Notebeook

En notebook består av celler og en celle kan inneholde enten kjørbar Kotlinkode eller markdown. En celle kjøres ved å trykke Shift+Enter. For kodeceller kjøres koden og resultatet skrives ut under cellen. Markdownceller endres til formatert visning når de kjøres. Man kan navigere frem og tilbake mellom celler med piltastene og en celle kan når som helst kjøres på nytt med Shift-Enter.

Eksempel

Mer enn bare tekst

Kotlin Notebook støtter en rekke ulike visningsformater for resultatet fra en celle:

  • Tekst: Den enkleste typen resultat som omfatter all tekstlig output fra koden. Hvis returtypen fra en celle ikke er en av de nedenfor konverteres verdien til tekst ved hjelp av objektets toString()-metode.
  • HTML: Notebooks støtter å vise HTML med tilhørende CSS for mer avansert formatering.
  • Bilder: Både PNG, JPG og SVG støttes, men også returverdier av typen BufferedImage kan vises.
  • Markdown: Markdownceller produserer HTML med støtte for bl.a. overskrifter, lister og lenker.
  • LaTeX: For elegant visning av matematiske funksjoner og formler.
  • Feilmeldinger og stacktrace: Hvis koden i en celle ikke kompilerer eller kaster en exception vises feilmeldingen under cellen.

For å vise noe annet enn tekst kreves det en renderer for datatypen som cellen returnerer. I tillegg til de innebygde rendrerne kan man registrere rendrere for egendefinerte typer. Returverdier av typen BufferedImage vises slik som dette:

Bilde

Avhengigheter

En Notebook kan ha avhengigheter både til koden i det gjeldende prosjektet og til eksterne bibliotek. Hvis du skal hente noe data fra et API for så å analysere det og tegne en graf så trenger du kanskje en http-klient og et grafbibliotek i det minste. Det finnes en rekke bibliotek som er spesielt tilpasset Kotlin Notebook og disse kan enkelt importeres ved hjelp av en spesiell kommando: %use <bibliotek>

Avhengigheter

Strømpriser

Siden både Odin og Nils har vist hvordan man kan hente strømpriser fra Tibber sitt API med sine favorittspråk så tenkte jeg at det var på sin plass å vise hvordan det samme kan gjøres i Kotlin Notebook:

Hente priser fra API

Først og fremst trenger vi tre avhengigheter:

  • Fuel som er en hendig http-klient
  • Kandy for å plotte grafer
  • Dataframe for å jobbe med strukturerte data

Når avhengighetene er på plass trenger vi bare å gjøre en enkel POST med en graphql-query for å hente dagens priser fra Tibber-apiet:

Hente strømpriser

Tilpass data med Dataframe

Nå som vi har dataene som JSON så kan vi lese disse direkte inn i en dataframe som automatisk vil organisere dataene i kolonner og rader. For å gjøre det litt enklere å plotte dataene konverterer vi tidspunktene til time i døgnet og prisverdien fra kroner til øre. Legg merke til at Dataframe gir oss code completion på verdiene i json-strukturen. Dette gjør det enklere å utforske datasettet. Når vi så returnerer en dataframe fra en celle får vi en fin tabellvisning:

Analysere data

Graf over dagens priser

Da gjenstår det bare å presentere dataene på en fin måte. Kandy, som bruker lets-plot under panseret, er en fin DSL for enkle grafer.

Plotte graf

Deling

Notebooks er skapt for å deles. Det fine er at ikke bare tekst og kode lagres, men også resultatene etter kjøring av hver celle. På den måten kan man både dokumentere det man selv har gjort, men også la mottaker gjøre endringer og kjøre koden på sin maskin.

Kotlin Notebooks er kompatible med Jupyter Notebooks og kan derfor vises på GitHub og andre kompatible webtjenester. Strømpriseksemplet ovenfor kan du se her.

Konklusjon

Kotlin Notebooks er et nyttig verktøy for å utforske kode og data på en visuell måte. Det er veldig smidig å hele tiden kunne gå tilbake til en tidligere celle, gjøre små endringer og se resultatet oppdatere seg umiddelbart. Det var overraskende enkelt å hente ut strømpriser fra Tibber sitt API og plotte en graf over disse. Jeg anbefaler å prøve det.