Fork me on GitHub
#clojure-norway
<
2024-02-22
>
augustl07:02:16

god morgen!

slipset09:02:17

Morn :rain_cloud: her nede, ❄️ der oppe.

teodorlu09:02:21

God morn 🙂

teodorlu09:02:36

Ønsker en stor velkommen til @olav.moseng til #C061XGG1W! Jeg har hatt gleden av å jobbe med Olav et par ganger det siste året, og han har valgt å bli med inn i Clojure-slacken!

👋 5
1
Olav09:02:32

Hei og morn! Og takk til @U3X7174KS for å vise veien!

❤️ 1
slipset09:02:32

Velkommen!

Olav Fosse09:02:56

Velkommen @olav.moseng! Kaste mynt om hvem som bytter navn til Olaf?

😆 3
🪙 1
oddsor09:02:48

God morn! 👋 I dag skal jeg ha en kort Clojure-presentasjon for backendere i Nav clojure-spin Jeg tenkte en del på hva jeg vil vise som er relativt unikt med Clojure, og landet på repl-drevet interaktiv utvikling. Så i den forbindelse har jeg deployet en webserver som leverer en enkel html-side som inkluderer Htmx. Deployen inneholder også en nrepl-server; så jeg har liksom en slu plan om at jeg demonstrerer at jeg endrer en webapp via repl-utvikling, hvor jeg deretter avslører at jeg faktisk driver og endrer en deployet app som folk kan gå inn på og se endre seg 🥷 Htmx har også grei støtte for websocket, så jeg bruker websocket-koblingen til å tvinge browseren til å reloade, og har opprettet et “chatroom” hvor man kan prate ved å trykke på et par emojier. Wish me luck!

👏 9
🤞 11
🔥 3
clojure 1
infosophy09:02:57

Tvi-tvi!

🙏 1
oddsor09:02:08

Appen er deployet og jeg har allerede testet at det virker, men med min flaks tipper jeg at kubernetes-clusteret velger å restarte appen midt i presentasjonen 😅

oddsor09:02:44

Forøvrig en morsom øvelse å deploye denne applikasjonen; jeg lærte at når man lager en uberjar av en app som bruker ring-jetty-adapter så er det ikke gitt at namespacet som legger til websocket-handlere blir bygd/lastet, så websocket-endepunktet bare fungerte ikke via jar’en 🤷

teodorlu09:02:35

Tøft, gøy! > Deployen inneholder også en nrepl-server; så jeg har liksom en slu plan om at jeg demonstrerer at jeg endrer en webapp via repl-utvikling, hvor jeg deretter avslører at jeg faktisk driver og endrer en deployet app som folk kan gå inn på og se endre seg 🥷 Har skikkelig lyst til å prøve noe liknende selv. Spent på å høre hvordan det går med deg. Lykke til! 🤞

👍 1
oddsor09:02:18

Jeg ble iallefall inspirert til å finne en smartere “hot reload”-mekanisme enn å manuelt kjøre en “reload-websocket-subscribers”-funksjon via repl’et hver gang jeg gjør en annen endring 😅

🤌 1
😄 1
oddsor13:02:48

Presentasjonen gikk veldig bra 🎉 Vi har en faggruppe som driver med (whitehat) hacking som uanmeldt begynte å hacke på demo-appen min rett etter demoen, så jeg hotfixet den via nrepl’et også. Veldig moro!

🎉 3
💯 1
Zeniten19:02:12

Nice! 😄

slipset14:02:03

Sånn halvveis interessant greie. Vi bruker RxJs til state management på frontenden vår. Hvis man myser litt så er ikke det så ulikt måten man progger på i Clojure, man lager ofte pipelines med ulike transformasjoner av data. Det jeg merker meg er at også der er man veldig glad i anonyme funksjoner, så man har ting som ser ut som (i clojure) (->> some-data (map #(… stor anon fn)) (filter #(…stor anon fn)) (reduce #(…stor anon fn))) Jeg får helt mark av sånne store anonyme funksjoner fordi jeg mener at det er der domenet vårt ligger. Hvis man leser dette litt fort, så får man inntrykk av at koden vår kun handler om map, filter og reduce. Skriver man dette om: (->> some-data (map turn-into-something-in-our-domain) (filter domain-specific-pred?) (reduce blabla)) Så kan man liksom lese litt mer hva som skjer og og man får kode som er enklere (etter mitt skjønn) å teste i replet (og unit-tester)

🎯 3
chef_kiss 1
magnars14:02:42

I høyeste grad. Store anonyme funksjoner er ikke noe særlig. Å trekke ut i nyttige funksjoner man kan bruke med map, filter, remove hjelper også med å finne gode skillelinjer - særlig sammen med tester. Er ellers så lett for at man bare klatter på mer og mer drit i de samme store funksjonene.

slipset14:02:35

Det som gjør det litt ekstra interessant i RxJs verdenen er at ulik vår threading operator, så er RxJs litt mer sånn monadeaktig i at verdiene “bor” inne i RxJs streams og blir tilgjengelige i map/filter/reduce, sånn at de funksjonene man kaller i map/filter/reduce er RxJs uavhengige og jobber kun på “data”. Så i Clojureland kan man liksom si at det å teste

(->> some-data (map #(… stor anon fn)) (filter #(…stor anon fn)) (reduce #(…stor anon fn)))
er like trivielt som å teste enkelt funksjonene, men i en
someObservable.pipe(map((whatever)=>...),filter((bla)=>....), ...)
er litt mer krøbelt fordi man da må mekke seg en observable som man så må få til å emitte.

magnars14:02:57

Du kan bare kalle det "like trivielt" å teste de forskjellene hvis du tar feil. 😅

magnars14:02:45

Men høres ut som man har enda større grunn til å dra det fra hverandre i RxJs.

slipset14:02:23

Eller man kan bygge masse tooling rundt for å lage mockObservables og greier 🙂

🙈 1
😬 1
slipset14:02:54

Sier ikke at vi har gjort det…

cjohansen15:02:09

Løsningen må vel da være å ha en liten anon-funksjon som kaller en navngitt funksjon med noe ikke-rammeverks-drit?

slipset15:02:51

Eller bare ha en rammeverksfri navngitt funksjon som tar de argumentene som trengs.

cjohansen15:02:58

someObservable.pipe(map(ickyThing => extractGold(unick(ickyThing))))

slipset15:02:20

Trengs ikke fordi ickyThing er rammeverksfri

cjohansen15:02:36

Å, da misforsto jeg deg over

cjohansen15:02:39

Ser nå at jeg tok feil

cjohansen15:02:09

Da er den ikke icky 😄

slipset15:02:23

Så du trenger altså bare:

someObservable.pipe(map(extractGold))

slipset15:02:34

Og det synes jeg faktisk er ganske pent

cjohansen15:02:02

Fint, det 🙂

leifericf19:02:56

Jeg har snubla med hue først inn i #jank og brobygging mellom Clojure og C++, og dermed Common Lisp og C++ via LLVM. Der snublet jeg over https://www.youtube.com/watch?v=mbdXeRBbgDM. Fyttirakkern så mye jobb han har gjort fra first principles! Biten om å compile sin compiler med en annen compiler er bare lættis awesome. Jeg kan sette pris på den typen galskap. Nå ble jeg plutselig litt nysgjerrig på Common Lisp igjen også. Leste http://landoflisp.com for en del år siden. Det er visst ikke helt dødt det heller.

🤯 1
👑 1
leifericf19:02:18

https://www.youtube.com/watch?v=8X69_42Mj-g som går enda dypere hvis den første gav mersmak.

augustl07:02:01

Conrad Barski (forfatteren av Land of Lisp) står bak verdens beste slide og (fra Clojure/conj 2012)

😂 2