UX-inspirasjon fra din egen verktøykasse
14.11.2024
14.11.2024
Vi utviklere lager våre egne verktøy, og har funnet noen veldig gode metoder for å gjøre oss selv produktive. Men implementerer vi dette i produktene vi lager? La oss se på konsepter vi allerede deler med brukerne våre, og idéer jeg syns vi bør dele mer av.
Begrepet teknisk gjeld er mye brukt innenfor systemutvikling. De fleste har en forståelse av hva det vil si å ha gjeld, også personer som ikke jobber med IT. Derfor er det enkelt å omtale diverse utfordringer man har i prosjektet sitt som teknisk gjeld overfor resten av organisasjonen, men gir det egentlig mening at vi utviklere bruker begrepet oss i mellom?
Hvordan sørger du for at alle utviklerne i et team bruker den samme språkversjonen, byggeverktøyet, databasenn osv.? Hvordan holder du CI miljøet synkronisert? Hvordan oppdaterer du avhengigheter slik at det blir likt hos alle? Idag skal vi se nærmere på Devbox. Et verktøy som løser dette problemet uten Docker eller virtuelle maskiner.
Man blir ofte fortalt at det er smart å lære seg flere programmeringsspråk. Alle er enige i det, men få snakker om størrelsen på språket du skal lære. Jeg mener små språk har stor verdi, til tross for at du kanskje aldri vil bruke det i jobbsammenheng. Men hvorfor? Det skjønner du etter å ha lest denne bloggposten.
09.10.2024
Liker du høye skuldre, stress og potensiale for store økonomiske tap og runder med slakt i media før du får sparken? Da er det bare å kjøre på med å lage- eller kjøpe inn nye store IT-systemer for så å rulle ut alt sammen samtidig. Har du heller lyst til å migrere til nyere systemer uten stress og mas? Ja, da har jeg noen tips her.
Jujutsu er et nytt versjonskontrollsystem som forenkler og snur opp-ned på gamle sannheter. Det kan også by på sømløs Git interoperabilitet. Er dette det neste store innenfor versjonskontroll?
Du trenger mer enn bare versjonskontroll for å utvikle programvare. Oppgavehåndtering, dokumentasjon, kommunikasjon osv. Hvordan hadde det sett ut hvis du hadde alt du trengte i ett enkelt system? Det er på tide å se nærmere på Fossil.
24.09.2024
En av Git’s største fordeler er at det er distribuert, men ofte bruker vi det opp mot en sentralisert tjeneste for å få tilgang til alle vertkøyene vi trenger i daglig utvikling. Hva om vi kunne utvidde Git med de verktøyene vi mangler? La oss ta en titt på Radicle.
27.08.2024
Av og til støter du borti programmeringsoppgaver der det gir mening å bruke tre-strukturer for å komme opp med en elegant løsning. I denne bloggposten ser vi på hvordan man kan bruke en tre-struktur for å implementere et hierarkisk søkefilter med noen fiffige krav. For å krydre det litt ekstra, skal vi gjøre det med et funksjonelt språk (Elm) hvor mutering er umulig!
Abonnerer du på en Large Language Model eller “AI Assistant” som ChatGPT, Claude eller Copilot? Eller sitter du på gjerdet for hele greia, med litt FOMO i magen kanskje? Uansett så kan du kjøre LLM-er helt lokalt på maskinen din som et alternativ. Det er enkelt, gratis og dataene dine sendes ikke til BigTech.
03.07.2024
Barn har ingen grenser for hva slags galskap de kan finne på, til foreldrenes store forferdelse. Det samme gjelder for nettlesere, de kan finne på mye rart som brukerne ikke liker eller vet om. Dette er et forsøk på å forklare Content Security Policy som en slags barnevakt for nettlesere.
Tid i PostgreSQL har noen fallgruver her og der. La oss se på de vanligste tingene man gjør feil, hvordan man unngår dem, og hvorfor i alle dager året er så kort i denne databasen.
Utforsk hvordan Flyway, et pålitelig og gjennomprøvd Java-basert verktøy siden 2010, fortsatt kan bistå med din databasehåndtering i 2024. Denne bloggposten vil lede deg gjennom hvordan du raskt setter opp en datasource og håndterer databasemigrasjoner i Kotlin, og oppnår versjonskontroll. Ideelt for Kotlin-utviklere som ønsker å automatisere og sikre databasetilstanden!
12.06.2024
Den enkleste måten å lage en nettside på er ved å bruke ren HTML og CSS. Dette vil fort komme til kort hvis du ønsker noen form for interaktivitet. HTMX er et bibliotek som lar deg fortsette med HTML og CSS og samtidig oppnå interaktivitet. La oss se hvordan.
06.06.2024
Kodemaker pleier å ha noen turer i året for å utvikle vårt sosiale miljø, lære litt og rett og slett bare ha det hyggelig sammen. Årets vårtur ble lagt til Tretopphyttene Oslofjord og Tufte Gård nær Horten i slutten av mai.
23.05.2024
Helt fra starten av har automatisert minnehåndtering vært en viktig brikke i Java-verden. JVM sørger for å allokere minne når man trenger det - og frigjør når det ikke brukes lengre - uten at vi utviklere trenger å tenke så mye på det. I denne artikkelen ser vi på hva som har skjedd på GC-fronten de siste årene og hvordan vi kan tilpasse og overvåke systemet.
16.05.2024
Kjernen i smidig utviklingen er å danne en hypotese om hvordan vi kan løse et gitt problem, for så å ta små, verifiserbare, skritt i den retningen. Som utviklere er vi dårlige til å følge den metodikken i valg av verktøy og rammeverk. For å ta et eksempel: React brukes av så-og-si alle. Er det egentlig så positivt?
08.05.2024
Spillet Minecraft har enorm popularitet - enda det er et gammelt spill som kanskje kan se litt banalt ut ved første øyekast. Mye av nøkkelen ligger i åpenheten og mulighetene for å lage utvidelser og tema-baserte varianter av spillet. I denne artikkelen ser vi på hvordan man kommer i gang med å lage egne utvidelser eller “mods” til Minecraft.
06.05.2024
Eivind prøver seg på en oppfriskning av Java-kunnskaper. Har det skjedd noe spennende med språket siden sist han brukte det aktivt?
I Kodemaker har vi en litt spesiell lønnsmodell - som gjør at vi må fikse på tallene vi sender inn i Tripletex for at alt skal bli rett. De siste 2 årene har vi dessuten fått en liten ekstra utfordring - siden Stortinget har “utøvet hjemmel til å fastsette ekstra arbeidsgiveravgift for ytelser utover bestemte beløpsgrenser”. I denne lille posten forklarer vi hvordan dette fungerer og hvordan vi har valgt å løse det.
Så og si alle språk implementerer feilhåndtering på en av to måter: Enten kaster man unntak oppover, eller returnerer feil som verdier. Men visste du at det finnes en tredje feilhåndteringsmåte som håndterer feilen der den oppstår?
24.04.2024
Poenget med all software vi skriver, er at det leveres en eller annen menneskelig verdi i andre enden. Men hvem er det som skaper verdien? Software eller brukeren?
03.04.2024
Når vi først skal stille klokka en time fremover, er nok B-mennesker glade at det skjer natt til søndag. Det gir dem mulighet å redusere hodepinen som dukker opp på første arbeidsdag med sommertid. Men hodepine på grunn av sommertid kan også A-mennesker få, spesielt om de er utviklere og er ansvarlige for programmer som skal kjøre på spesifikke tidspunkt. La oss se litt på hva som skjer (eller ikke skjer) når maskinen stiller klokka fram en time.
07.03.2024
Selv om kjøretidsanalyser av algoritmer er estimater, har estimatene blitt dårligere og dårligere opp gjennom åra. Nå kan O(n log n) være raskere enn O(n), uansett hvor stort datasettet ditt er.
I denne bloggposten ser vi på hvorfor det har blitt sånn, hvordan man prøver å fikse opp i dette, og hva du som utvikler bør gjøre for å finne ut av hvilken algoritme som er raskest for ditt formål.
Coroutines i Kotlin er bygd rundt konseptet strukturert samtidighet hvor asynkrone prosesser struktureres i et hieraraki med definerte regler for oppførsel.
Hva om vi løfter denne tanken til et høyere nivå og strukturerer applikasjonene vi bygger på samme måte ? Betyr dette at alle avhengigheter grupperes og inkluderes i en livssyklys som tar høyde for feil-scenarioer ? Og hvordan fungerer dette i en skykontekst hvor vi er innefor rammene av Kubernetes sitt økosystem ?
31.01.2024
Hva er best - lage noe raskt eller lage noe som tåler tidens tann?
… eller ja takk begge deler?
17.01.2024
Har du noen gang opplevd frustrasjonen av en ustabil internettforbindelse når du prøver å bestille noe online, bare for å ende opp med flere kopier av det samme produktet? I en verden hvor nettet er ustabilt og feil kan oppstå når som helst, er det viktig å ha robuste APIer.
I denne bloggposten dykker vi ned i konseptet med idempotente APIer - en nøkkel til å bygge mer robuste og brukervennlige systemer. Vi utforsker hva idempotens betyr, hvorfor det er viktig, og hvordan det kan implementeres i dine API’er. Bli med oss og lær hvordan du kan forbedre brukeropplevelsen og unngå unødvendige feil i dine systemer.
10.01.2024
Bluetooth Low Energy (BLE) høres kanskje ut som noe klurete lavnivå-greier for dingser. Jeg synes absolutt ikke det. BLE har en ganske enkel og elegant måte implementerterer data-endepunkter på, og har inspirert meg i tanker rundt superenkelt API design generelt.
Dette utarbeida og utbredte API-designet brukes på milliarder av ting, og du bruker det sannsynligvis daglig enten du er klar over det eller ikke.
27.12.2023
Da var årets Advent of Code akkurat over. For noen er denne programmeringskonkurransen et viktig aspekt av adventstiden. Les om hvordan man kan lage en bot som poster topplisten til Slack hver dag!
Kildekode uten versjonskontroll er utenkelig, men hvordan forvalter du ideer, beslutninger, erfaringer eller andre gullkorn i applikasjonen din?
Er du avhengig av noen nøkkelpersoner som husker alt? Ligger gullet begravet i hundrevis av jira-saker som snart er glemt? Eller har du som mange andre en overflod av Confluencesider med en salig blanding av AS-IS, TO-BE, WAS eller MAYBE beskrivelser?
Jeg vil slå ett slag for at gullet bør følge kildekoden. La all applikasjonskunnskap som kan gjøres utdatert med en commit ligge sammen med kildekoden.
13.12.2023
Programmeringsspråk, biblioteker og rammeverk preger stillingsannonser, artikler og konferanser i bransjen vår. Forståelig nok – vi er tross alt utviklere. Likevel, om jeg får ønske meg én ting til jul, er det at vi vier litt mer oppmerksomhet til det vi faktisk bruker teknologien til.
06.12.2023
Java er et konservativt språk som verdsetter bakoverkompatibilitet over fancy ny syntaks. Vi programmerere elsker å velte oss i skinnende nye features, men om du har drevet med utvikling en stund, så vet du også å sette pris på stabilitet. Java 21 ble akkurat sluppet, og da er det verdt å ta en kikk på hvordan språket har utviklet seg i det siste.
Kan du få rutehåndteringskoden din til å ha robust feilhåndtering og være lettlest/lett å vedlikeholde? Kanskje?! Vi tar en titt på hvordan man kan bruke Arrow.kt som et hjelpeverktøy når man implementerer rutehåndtering i Kotlin.
22.11.2023
En ting vi liker å diskutere på frontend-utvikling er hvordan tilstand (state) skal behandles. Skal man ha all tilstand lagret globalt på et slags toppnivå? Skal man transformere noe før det sendes til UI-komponentene? Når er det greit med lokal tilstand i en komponent? I denne posten forklares et slags mønster som jeg synes fungerer veldig bra for søkesider.
15.11.2023
De aller fleste av oss som bruker postgres bruker det som en vanlig relasjonell database med skjemaer for det vi vil lagre. Men visste du at du kan slippe unna de strenge skjemaene ved å bruke den innebygde støtten for JSON i postgres? Og det er ikke så dumt som det kanskje høres ut heller!
Om PostgreSQL og JSON
08.11.2023
Distribuerte løsninger basert på åpne standarder vs sentraliserte og proprietære løsninger - hva er fordelene og ulempene? I Norsk helsevesen har de prøvd det meste - la oss se litt på effekten av forskjellige strategier
25.10.2023
Jeg antar at du har hørt skrekkhistorier om makroer? De påstås å være kryptiske, vanskelige å forstå og de er lett å misbruke.
Jeg tenkte jeg skulle vise et eksempel på en makro jeg har skrevet og brukt i ett prosjekt for å se hvordan en makro kan se ut i Rust. Etterpå kan vi revurdere om denne påstanden holder vann.
20.10.2023
Kodemaker har ofte fagdager, hvor vi samles, lærer nye ting og har det gøy sammen. Denne gangen tar vi dere med på en typisk fagdag, for å gi innblikk i hvordan vi gjør det hos oss.
04.10.2023
Clojure, og lisp har en forbannelse; parantesene skremmer bort folk
(((bø(((((((((((( 😱)))))))))hoho))))))
Dette blir en kort post, men la oss se på litt kode som gjør det mer behagelig å skrive og å lese kode i Clojure.
27.09.2023
Hobbyprosjektene mine har en tendens til å være tett koblet med binære dataformater. Bli med å se hva som skjer under panseret når bytearrays leses til meningsfulle datastrukturer.
20.09.2023
Her går jeg gjennom hvordan jeg har benyttet serverløs teknologi til å vise data fra solcelleanlegget mitt
13.09.2023
30.08.2023
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.
17.08.2023
Offisielt har jeg vært ansatt i Kodemaker i 6 måneder, men jeg føler selv det er lengre. Hvorfor? Fordi i Kodemaker blir man en av gjengen i det øyeblikket kontrakten er signert.
04.08.2023
12.07.2023
Trenger du å lage et kommandolinjeverktøy, men er lei av grisete bash-script som er umulige å lese? Kanskje det går raskere å skrive det med et dynamisk språk som Python, men hva med å prøve et sterkt typet språk som Rust?
06.07.2023
Web-analyse for 100% av brukerne uten begredelige samtykke-dialoger er mulig — her er hvordan.
28.06.2023
Moderne nettlesere har fått veldig gode verktøy for å måle ytelse. I denne artikkelen ser vi på hvordan vi kan bruke Server Timing for å få mer innsikt i hvordan serveren vår oppfører seg.
21.06.2023
Etter å ha hoppet inn og ut av Clojure-prosjekter i de siste årene så har det blitt åpenbart for meg at det er særlig en ting jeg setter stor pris på i min arbeidshverdag med Clojure.
Hint; det er hverken lisp, funksjonell programmering eller immutability.
16.06.2023
Personvernforordningen (GDPR) begynner å få noen rettskraftige dommer. Jeg snuser i trafikken fra noen vanlige apper på telefonen min for å se om jeg finner noen potensielle syndere og kommer med tips for å unngå fallgruver.
07.06.2023
Alle moderne nettlesere har nå en innebygget byggekloss som hjelper oss å lage gode dialoger og modaler. Hvis du, som meg, slettes ikke var klar over det, så er dette innlegget for deg.
Om HTML, JavaScript og CSS
31.05.2023
Et produktutviklings-team trenger utviklere, testere, driftere, arkitekter, UX,
sikkerhetsrådgivere, prosess-fasilitatorer, prosjektledere, business-strateger…
Hvor mange mennesker blir det til sammen?
Ideelt? Kanskje 5 stk.
24.05.2023
Det er viktig med sosiale sammenkomster i en tid med stadig mer bruk av hjemmekontor, og minst halvparten av befolkningen lever med telefonen tett klistret til ansiktet store deler av tiden. Vi i Kodemaker er en gjeng som er glade i sosiale lag. Jeg har tidligere skrevet en blogg om vår “Lunsjroulette” og nå skal jeg fortelle om et annet påfunn i Kodemaker.
10.05.2023
Alle elsker emojier 👻
Alle elsker video 🎥
Her får du begge deler, på en gang 🤯
Lær hvordan du kan kombinere webcam-APIet i nettleseren med emojier på en kreativ måte.
03.05.2023
Hvorfor lære seg et nytt spørrespråk og innføre en umoden tidsserie-database bare fordi du har tidsseriedata? TimescaleDB er en extension til PostgreSQL som gir god støtte og ytelse for tidsseriedata.
26.04.2023
Har du noen gang blitt bedt om å lage en knapp?
Jeg også.
Selv om det kan være fristende å bare implementere knappen, vil det som regel lønne seg å først ta et steg tilbake.
19.04.2023
I forrige uke var vi 10 Kodemakere som dro til KotlinConf’23 i Amsterdam, Nederland. Jeg glad for at jeg var en av de som dro.
Det oser av ambisjoner i Kotlin-community og det er vanskelig å ikke bli smittet. Her kommer min take-away og høydepunkter slik jeg opplevde det.
14.04.2023
Det er mye å glede seg over i Clojure: pure functions, immutability, og REPL, for å nevne noen store ting. I dag skal vi heller se på to bittesmå, men svært nyttige funksjoner.
Nå blir det påskestemning her på Kodemaker-bloggen, med kvikklunsj, appelsiner og brettspill. Så spørs det om du får med familien på det hjemmesnekra brettspillet om software-utvikling jeg har laget.
29.03.2023
Påsken står for døren, og flere Kodemakere er snart i mål med abstract for JavaZone 2023. Hva skal du med påskekrim når vi har tilbakeblikk på JavaZone 2022?
18.03.2023
Jeg elsker å løse oppgaver. Det gir meg mestringsfølelse og skaperglede. Når du må sette deg inn i en problemstilling og så eksponere det du har forstått (og misforstått) gjennom den koden du skriver, så lærer du fort.
… men det er ikke alltid effektiv bruk av tid.
Jeg har min egen modell som hjelper meg til å forstå viktige sammenhenger og effektivisere skapergleden min.
Du validerer vel json fra rest-kallene dine før du slipper dem løs i den nydelige typesikre domenemodellen din? Kanskje du ikke gjør det, eller bare delvis, fordi det er skikkelig tungvint?
I denne bloggposten ser vi på hvordan biblioteket Zod kan hjelpe deg over kneika, slik at du virkelig kan begynne å stole på typene dine.
08.03.2023
01.03.2023
22.02.2023
Dette ser ut til å ha blitt et kåseri om data og dumme klienter. Ikke dumme oppdragsgivere, altså, men noen veldig dumme web-klienter.
Om Arkitektur, Design og Clojure
15.02.2023
For mange norske datasystemer virker det som helligdager og høytidsdager kommer som en overraskelse. Hvor vanskelig kan det egentlig være å lage et system som ikke setter betalingsfrist på en dag hvor bankene er stengt? Eller venter med å sende purring på tilbakelevering av ting til en dag man faktisk har åpent? Vi dykker ned i matte fra 1800-tallet og lurer på hvorfor dette ikke er implementert i alle norske datasystem…
08.02.2023
Du har endelig kommet i gang med Rust, og du har fått tak på hvordan Borrow Checker fungerer. Nå kan du virkelig sette i gang å kode! Men hva er det som møter deg? En ny kompilatorfeil som sier:
'x' does not live long enough
Det du nå har stiftet bekjentskap med er Rust Lifetimes, så da passer det fint at det er nettopp det vi skal se nærmere på i denne bloggposten.
01.02.2023
Kafka er et mangehodet beist med mange konfigurasjoner å skru på for å få det slik som vi vil.
Jeg bruker kafka som cache-lager for å raskt kunne varme opp cachen. I et sånt scenario må tjenestene selv sende oppdaterte data til kafka og la andre konsumenter bruke disse dataene asynkront. På den måten unngår jeg også å overbelaste tjenester ved start av applikasjonen min når jeg trenger en full cache.
Her er hvordan jeg bruker Kafka for å vedlikeholde cacher.
25.01.2023
Vi trenger en ny plattform!
Men hvem er “vi”?
Og hva er det “vi” trenger egentlig?
Hvordan passer vi på at den nye plattformen blir en suksess? (For hvem?)
18.01.2023
Det er ikke ofte at en database gjør meg direkte begeistret, men Datomic har klart kunststykket. Til tross for at det er proprietær software man må betale for, har databasen så mange fete fordeler at det er vanskelig å velge bare fem av dem … men fem må det bli. Hvordan skulle jeg ellers fått fikset en så feiende flott tittel?
Om Database, Datomic, DataScript og Clojure
11.01.2023
En forutsetning for å treffe med softwaredesign er at vi har god kontroll på domenet vi opererer i. Men hva er egentlig domenet til frontendkoden din?
04.01.2023
21.12.2022
Det har den siste tiden blitt svært tydelig at AI har kommet langt på tekstlig dialog. Men det er snart jul, og ikke tiden for eksistensielle spørsmål. Nå er det tid for kos. Nærmere bestemt å produsere latterlig svada med Markov-kjeder.
14.12.2022
Ser du verdien av en asynkron dataflyt og ønsker å implementere dette i Kotlin ? Kanskje har du blitt eksponert for begreper som coroutines, suspend-funksjoner og flows uten at du ble spesielt klokere av den grunn ? Da er denne bloggposten for deg.
08.12.2022
Rust er det mest populære programmeringsspråket i følge Stack Overflow, men hva er det som er så spesielt med det? Det som først fikk min oppmerksomhet var hvordan man håndterer minne.
07.12.2022
Mesteparten av whitespace i HTML er irrelevant og fjernes av browseren. Så lenge vi lager HTML-koden selv fungerer dette flott. Men hva skjer om man for eksempel lager en editor som skal støtte HTML både inn og ut - og noen limer inn HTML-kode med forskjellig typer spaces?
30.11.2022
Hvordan kan en enkel sletting som delete from users where id = :id bruke mange minutter på å fullføre på en kraftig Postgres-database i produksjon? Denne utfordringen støtte jeg på nylig og det ga meg en liten aha-opplevelse.
Om PostgreSQL og SQL
Statiske typesystemer er åpenbart bra greier. Ikke bare får man uttrykt intensjon og form på dataene veldig eksplisitt, men det muliggjør også masse deilig editor-støtte som auto completion og refaktorering. Likevel er det Clojure – et særdeles dynamisk språk – som er min favoritt. Jeg har tenkt litt i det siste … Hvorfor savner jeg ikke statiske typer?
09.11.2022
Vi har det veldig bra i Kodemaker, men vi sikter alltid mot nye høyder. Hva kan vi gjøre for å bli enda bedre kjent med hverandre på en sosial og morsom måte?
Unreal Engine 5 er et beist! I denne blogposten skal vi temme beistet litt ved å manuelt lage et prosjekt med filene som den trenger, kompilere dem og starte opp det nye prosjektet fra kommandolinja.
25.10.2022
Et godt REPL blåser liv i programmet ditt og lar deg utvikle det fra innsiden av den kjørende prosessen. Bli med, så skal jeg forsøke å forklare akkurat hvorfor et REPL er det essensielle verktøyet du kanskje ikke visste at du mangler i (arbeids)livet ditt.
Lurer du på hva appen din egentlig gjør av nettverkstrafikk? Mitm-proxy gir deg det eksakte svaret.
Bruk datamaskinen effektivt, så får du mer tid til å løse faktiske programmeringsproblemer.
10.08.2022
Uansett hvilket språk du bruker, så trenger man testdata når man skriver tester. Her kommer noen tips til hvordan man kan gjøre det lettere for seg selv, med eksempler i TypeScript.
02.08.2022
Gitt utgangspunktet “la oss type JS” så er TypeScript ganske supert. Dette er ikke nødvendigvis et premiss vi trenger godta, men når man først besøker TS-land hjelper det å ha noen triks for hånden.
Har du omfavnet funksjonell programmering ? Savner du en effektiv måte å manipulere ikke-muterbare datastrukturer på ? Hva om det faktisk finnes et bibliotek som løser dette på en elegant måte ?
02.02.2022
Kjører du samme versjon av Java, Node, Erlang, .NET Core (etc) lokalt som i prod? Hvis ikke, hvordan kan du da vite at appen din oppfører på samme måte over alt?
15.12.2021
Er du lei av å skrive tester? Hva om jeg fortalte deg at det finnes verktøy som genererer testene for deg? For godt til å være sant?
08.12.2021
Hva om den eksterne tjenesten vi er avhengig av går ned? Hvordan sikrer vi en robust tjeneste med eksterne avhengigheter?
01.12.2021
Hvorfor i alle dager sjekker vi på radio button checked id for å finne ut av hvordan verdien av den skal representeres i koden? Det virker litt for manuelt og tungvint. Er det mulig å få til at radioknapper holder på den informasjonen selv, slik for eksempel en HTML radio button gjør?
Jeg arrangerte Kodekamp i helga, en hjemmesnekret konkurranse i kodeskriving. Det var intenst og gøy. Her er en liten samling fikse finurligheter og lett underholdende anekdoter derfra.
17.11.2021
Når man lager frontend applikasjoner er det fint om man unngår duplisering av sentrale elementer i designet. Her går vi gjennom noen forskjellige alternativer man kan bruke for å organisere CSS og komponenter.
09.11.2021
En liten historie om hvordan en ny feature i et open source-bibliotek ble nedskalert og samtidig mer nyttig.
01.11.2021
Ofte så lager vi løsninger med en fast visuell struktur. Du har for eksempel en header med en meny, en sidespesifikk kropp og en footer. Hva gjør vi hvis noen sider trenger en annen struktur?
13.10.2021
Hvordan håndterer du konfigurasjon i prosjektet ditt? Er alle verdier satt? Er verdiene av riktig type? Hadde det ikke vært fint å vite at alt dette er oppfylt og håndtert for deg?
22.09.2021
Hva gjør du når du sitter bak en proxy og verktøyet ditt ikke spiller på lag med proxyer?
15.09.2021
21.04.2021
Ja, det er en oppfordring. Jeg mener for guds skyld ikke at du skal lage et nytt rammeverk som andre kan bruke, men lag et til deg selv. Sett opp et stilas som passer til det du bygger.
Men ikke med en gang.
Om Arkitektur og Design
I jula som var satt jeg og nerdet litt innimellom all julekosen. Jeg prøvde å finne et lite bibliotek for enkel håndtering av websockets i en nettleserapplikasjon. Nå følger det jo med en standard WebSocket implementasjon i alle nettlesere, men jeg ville også at den skulle ha støtte for automatisk gjenoppkobling og pulskontroll mot server. Etter å ha søkt litt på npm som seg hør og bør, fant jeg ikke noen som helt fristet å dra inn. Kanskje jeg skal lage et lite bibliotek selv da? Hva om jeg implementer det ved å basere meg på en Finite State Machine i bunn? Det hadde vært digg om biblioteket hadde en funksjonell kjerne og at sideeffekter håndteres separat. Her er det bare å brette opp armene å se hva vi kan få til.
Når datamengdene vi henter ut fra databasen øker i både mengde og omfang kan vi ikke alltid servere alt til frontenden, slik vi gjorde i starten av prosjektet. Skal man lage en pagineringsløsning er det fort gjort å ta i bruk OFFSET og LIMIT, men hvordan fungerer det og hvorfor bør vi være forsiktige med det? Vi går gjennom hvordan OFFSET fungerer, hvorfor vi bør være forsiktige med bruken og prøver å komme med et forslag til hvordan vi heller skal løse pagineringen vår.
Det er 2020, og nettleseren har fortsatt ikke UITableView. Det er ikke fordi de som lager nettlesere er inkompetente, men fordi WC3-spesifikasjonene gjør det umulig å lage kjappe implementasjoner av GUI-rendring på web.
Derfor lever vi med at Slack bruker 2gb minne for å vise et lite knippe tekstlinjer. (Desktop-appen til Slack er et webview.)
Men vi har to store unntak: både Google Docs og Visual Studio Code klarer å rendre enorme dokumenter på null komma svisj, med lav minnebruk og greier. Hvordan klarer de det?
11.11.2020
I denne bloggposten ser vi på hvordan du kan bruke standardiserte HTTP-headere til å heve sikkerheten i applikasjonen din.
04.11.2020
Indeksering er den aller viktigste måten vi kan sikre god ytelse fra en SQL-database på. Det er vårt ansvar som utviklere å lage gode indekser fordi vi kjenner applikasjonens behov og aksessmønster best. Vi skal derfor ta for oss litt grunnleggende om indekser og hvordan vi bruker dem.
28.10.2020
I forbindelse med bloggposten om en enkel frontendarkitektur som funker, spurte Ove: “Hvis du har en tekstboks og en knapp, hvem har ansvaret for å ta verdien fra tekstboksen og sende den til eventbussen når man trykker på knappen?” Det er et betimelig spørsmål med noen interessante detaljer.
21.10.2020
Git-secret er en liten perle som gjøre det enkelt å la konfigurasjonsfiler versjonshåndteres sammen med kildekoden, selv om de inneholder hemmeligheter.
14.10.2020
Som utvikler med mye erfaring fra backend så vet jeg akkurat hvordan jeg liker å konfigurere applikasjonene mine. Men hva er alternativene for mobile apper som er skrevet med flutter?
UI-testing har fått dårlig omtale. Testene kritiseres for å være trege, de tar lang tid å skrive, de er ofte ikke spesielt lesbare, brukergrensesnittet endrer seg kontinuerlig og sist, men ikke minst så er inkonsistente testdata og mangel på kontroll over responsen fra server en stor utfordring.
Det siste punktet mener jeg er den største utfordringen, men jeg mener å ha funnet en veldig bra løsning på dette. Les videre, så skal du få se hvordan.
Logger du config i oppstart av appen din? Nei? Det gjøres heller ikke i Elixir/Phoenix. Dette er rett og slett ikke godt nok. Her er en oppskrift på hvordan gjøre dette.
23.09.2020
Paul Graham sin klassiker Beating The Averages forteller at Lisp er et hemmelig våpen, hvor konkurrentene dine blir stående igjen i støvet som legger seg etter din enorme effektivitet og produktivitet.
Kanskje tidlig på 2000-tallet. Men i dag må språkene se seg slått av plattformene.
Koden vår renner nå over med tredjeparts avhengigheter, fra et gedigent økosystem av tidsbesparende hjelpemidler.
Men er disse avhengighetene egenkapital, eller er de gjeld?
16.09.2020
Kode skal være lett å lese. Men hva betyr dette i praksis? Hva er lett å lese og hva er det koden skal formidle til leseren? Hvorfor leser vi kode i det hele tatt?
Når man er ny til Clojure er macro-ene ->
og ->>
temmelig forvirrende. Ikke
bare er de vanskelige å søke etter på nett, men koden ser også helt mystisk ut.
Heldigvis er det ikke lenge til du blir nyforelska og bruker dem overalt.
Kanskje etter denne bloggposten?
20.05.2020
Jeg husker det som om det var i går. Dagen da Commodore ble byttet ut med en Amiga 500. Det var første gang jeg så en sinusbølge flyte over skjermen. Hvordan lager man egentlig det?
Om CSS, Web og ClojureScript
Har du hørt om zippers før? Ikke glidlåser altså, men en teknikk for å representere aggregerte datastrukturer slik at de kan enkelt traverseres og manipuleres nærmest vilkårlig. La oss utforske zippers litt nærmere og se hvordan du kan bruke de i Clojure.
06.05.2020
MQTT er et lettvekts publish-subscribe meldingssystem. Men hva i alle dager står forkortelsen for? Hva kan man bruke det til? Og hvordan fungerer det, egentlig?
29.04.2020
map
, filter
og reduce
er nyttige verktøy som mange har i verktøykassa si. Oppi der burde også partition
være, og jeg skal vise deg hvorfor.
15.04.2020
Domene-kode kan med rette kalles kjernen i applikasjonene vi utvikler, men den gjør ikke mye nytte for seg uten støttende infrastruktur, som lagring av data og kommunikasjon med andre systemer.
Men hva skjer når infrastrukturen er med på å forme domene-koden?
08.04.2020
Cookies lar oss ta vare på informasjon mellom ulike forespørsler over ellers tilstandsløs HTTP, og brukes ofte til å implementere sikkerheten i webløsninger. Det er imidlertid noen ting som er viktig å være klar over ved bruk av cookies. I denne bloggposten skal vi se mer på bruk av SameSite-attributtet.
01.04.2020
Har du også irritert deg over Slack sin trege redirect-funksjon? Her her en oppskrift for å redusere irritasjonen med din egen URL-redirecter.
Hvorfor jeg foretrekker å utvikle iOS- og macOS-brukergrensesnitt i kode fremfor å bruke Interface Builder
18.03.2020
Noen ganger er ytelse kritisk for at ting skal fungere ordentlig. Et bibliotek for parsing av binære værdata er en av de gangene. Med Go har vi mulighet til å kunne si akkurat hvilken kodelinje som tar tid eller som allokerer minne.
11.03.2020
Elixir er et relativt nytt språk som kjører på Erlang VM’en BEAM. Dette er en annerledes plattform, som har vist seg å være svært robust, skalerbar og tillater høy oppetid. En av årsakene til dette er minnehåndteringen, som er svært annerledes fra mange andre plattformer.
Du har en Single Page Application (SPA). Brukerne har typisk appen åpen i nettleseren lenge - mange dager, eller til og med uker. Samtidig sitter du og dytter ut nye versjoner opptil flere ganger om dagen. Hvordan i alle dager skal du sørge for at folk ikke blir sittende på en gammel frontend som kanskje har bugs du allerede har fiksa, eller bruker en utdatert API-klient? Vel, her får du ett forslag.
26.02.2020
Det finnes veldig mange teknologier der ute, og det kan fort bli vanskelig å navigere i jungelen når man skal velge hva man skal gå for. Hvilken teknologi passer min app best?
19.02.2020
De siste årene har jeg brukt Python sammen med OpenCV til å implementere en del bildeanalyse. Prosessering av bilder kan fort bli litt krevende for datamaskinen - og når man vil behandle mange bilder på kort tid er det viktig å skrive effektiv kode. Her beskriver jeg en teknikk jeg har brukt for å se på Python-kode og effektivitet.
12.02.2020
Kontinuerlig integrasjon, javel. Hva med kontinuerlig bygging når du allerede bruker make(fordi du leste min forrige bloggpost)?
05.02.2020
CSS slutter aldri å overraske. Noen ganger ramler man over noe som man i utgangspunktet ikke ser nytteverdien av, men som kombinert med litt kreativitet produserer et interessant resultat.
29.01.2020
Det er mange store stilaser å velge blant for din frontendarkitektur, men trenger du all leamikken? Her er en enkel arkitektur som jeg har hatt mye glede av.
Den første tingen jeg leter etter når jeg skal lære meg et nytt programmeringsspråk, er immutable og persistente datastrukturer. Dette er en yrkesskade jeg har fått fra Clojure. Jeg har en tendens til å strukturere hele systemet mitt rundt disse datastrukturene. De er smarte, kjappe, effektive, immutable og fremragende.
I denne bloggposten skal jeg gi deg den samme skavanken.
15.01.2020
Her kommer del 3 i bloggserien min om bildeanalyse. Denne gangen er det deteksjon av objekter i et bilde som er temaet. Først bruker vi noen geometri-triks for å finne rett utsnitt av bildet - så plukker vi ut objektene, og finner egenskaper ved disse som lar oss si noe om hva det er vi ser på.
08.01.2020
Når du deployer appen din til det romskipet av en rigg som er Kubernetes så skjer det uten noen form for nedetid, ikkesant? Dårlige nyheter: med mindre du har gått veldig aktivt inn for det har tjenestene dine svært sannsynlig litt nedetid under deployment. Men hvorfor?
17.12.2019
Det skorter for tiden ikke på bedrifter i IT-sfæren som skryter av at de driver med Devops. Men gjør de egentlig det? Hvis løsningen er et “devops-team” eller stillingsutlysninger for “en devopser”, er sjansen dessverre liten for at vi henter ut det beste devops har å by på.
11.12.2019
QUIC er en protokoll med opprinnelse fra Google som første gang så dagens lys i 2012. Navnet ble foreslått som et akronym for “Quick UDP Internet Connections”, men QUIC er i dag alene ansett som navnet på protokollen. Det er en ung protokoll sammenlignet med mange andre som benyttes på internett i dag. Eksempelvis er TCP, som i sin helhet erstattes av QUIC, opprinnelig fra 1974.
04.12.2019
Arrow er et nyttig bibliotek som er ment som en utvidelse av Kotlins standardbibliotek med fokus på funksjonell programmering. I dette innlegget skal vi se på hvordan vi kan bruke datatypen Validated
til å gjøre inputvalidering morsommere, mer effektivt og ikke minst funksjonelt.
27.11.2019
Det er lite vi utviklere elsker mer enn å peke på galskap i JavaScript, så som
[] + 2 === "2"
, men dersom jobben din er å skrive kode i dette språket, eller
språk som kompilerer til JavaScript uten å skjule denne oppførselen (eksempelvis
TypeScript og ClojureScript) vil du spare mye tid i feilsøking og koding ved å
forstå hvorfor ting er som de er.
20.11.2019
Etter å ha slåss mot og med maven, gradle, grunt og diverse moderne byggeverktøy så er det deilig å se at den gamle traveren make
ofte er et bedre og enklere alternativ.
13.11.2019
30.10.2019
Clojure sine åpne datastrukturer er utrolig deilig å jobbe med, de brukes til alt, også config. Men ikke all config er lik, f.eks. bør ikke secrets logges. I oppstart av enhver app er det fordelaktig at config logges, så hvordan håndtere dette problemet? Her er et triks for å maskere secrets i config.
23.10.2019
Du har kanskje sett at når du browser nettbanken din så står hele navnet på banken ved siden av URL-en. Hva er dette for noe?
I 2018 fikk jeg sjansen til å jobbe i et spillprosjekt. Da ble det etterhvert mange og sammensatte animasjoner som bød på flere spennende utfordringer. I dette innlegget skriver jeg litt om hvordan vi løste CSS in JS for ClojureScript og hvordan vi brukte det til animasjoner.
09.10.2019
02.10.2019
Det viktigste og beste med Clojure er pure functions og immutability, men i dag skal jeg skrive om noe ganske annet. Jeg skal skrive om en småting som gjør meg glad når jeg koder.
25.09.2019
Det er fort gjort å komme opp og gå i skyen, men før du får sukk for deg har du en løsning der du nærmest skuffer penger i retning Amazon. Hva gjør du den dagen du oppdager at AWS-regninga er mye høyere enn du hadde forventet?
18.09.2019
Dette er del 2 i min lille bloggserie om bildeanalyse. Her ser vi videre på en vanlig utfordring - hvordan man finner linjer i et bilde. Dette er nyttig på en rekke områder. Vi går gjennom grunnprinsippene for å finne linjer, og så viser jeg frem en del små triks jeg har funnet ut at kan være fine når man driver med OpenCV og linjer i bilder.
11.09.2019
Bildeanalyse, kunsten å lese informasjon fra bilder, er en artig og utfordrende del av IT-faget. Man kan gjøre tekstgjenkjenning, bygge automatiserte industriprosesser, lage nymotens dartspill og en hel del andre greier. Her beskriver vi en måte man kan komme i gang på og forklarer noen av de enkleste prinsippene som kan være kjekke å kunne.
04.09.2019
Snart er det JavaZone, og da blir det kosetime med Christian og meg. Vi skal lage et nytt zombiespill - denne gangen med terninger.
Terningspill er langt morsommere hvis man kan se terningene rulle, så jeg brettet opp ermene (ikke armene) og skrev litt CSS i forberedelse til presentasjonen. Her er det jeg lærte om å kaste terninger med CSS.
28.08.2019
Som utvikler trenger du å vite hva public keys og private keys er, og hva du kan bruke de til. I denne artikkelen lærer du alt du trenger å vite - uten noe matematikk!
I del én lærte vi hvilke datatyper vi trenger i kode for å håndtere tid, men hvordan er det vi lagrer dem i en database?
14.08.2019
Jeg har drevet med programmering i snart 20 år, og i nesten hvert eneste prosjekt jeg har vært med i har vi endt opp med problemer, misforståelser og diskusjoner rundt tid. Er det mulig? Hvor vanskelig kan det være?
24.07.2019
En liten historie om hvordan EFS nærmest tok livet av Kubernetes-clusteret vårt, og hvordan du kan unngå å havne i samme knipa — selvom du ikke bruker EFS.
17.07.2019
Det er lett å ta gamle triks med seg inn i en ny hverdag. Den første Clojure-koden jeg skrev ligner ikke spesielt mye på den jeg skriver i dag. I denne bloggposten skriver jeg kort om én av tingene jeg har gradvis lært meg av med.
Du kan sikre deg mot å miste kritiske meldinger når kafka er nede ved å bruke “store-and-forward” i de applikasjonene dine som produserer meldinger til kafka.
03.07.2019
CSS grids har endelig gitt oss en enkel og fleksibel modell for layout på nett.
Med bare noen få properties kan du stort sett pakke float
helt bort, få full
kontroll over kilde-rekkefølge og et kraftig verktøy for responsiv design på
kjøpet.
26.06.2019
I 2018 fikk SAS tvangsbøter fra Difi på 150 000 per dag for brudd på likestillings- og diskrimineringsloven. Er dette noe som kan ramme andre? (Spoiler - JA!)
Putt tilstand i ClojureScript-appen din i en DataScript-database for å få kontroll på tilstanden på framsiden.
Jeg har vært med Kodemaker sitt team på 4 hos Bring og laget en native mobilapp som sjåførene bruker mens de er ute og plukker opp og leverer pakker. Vi bruker React Native. Her er en liten samling med ting jeg skulle ønske jeg visste før vi startet prosjektet.