Fork me on GitHub
#clojure-norway
<
2023-11-09
>
leifericf04:11:49

God morgen! 🥓 🍳

leifericf06:11:47

Dagens spørsmål: Det er din første dag på jobb hos en ny arbeidsgiver og du må gjøre deg kjent med en større Clojure kodebase som du skal videreutvikle. Alle de andre utviklerne har dessverre blitt kidnappet av romvesener over natta, så ingen kan hjelpe deg. Hvordan går du frem? Hva er det første du gjør? Fyrer opp REPL? Leter etter comment blokker med eksekverbare eksempler i kildefilene? Kikker på testene? Går over namespaces på overordnet nivå? Tegner en oversikt over "de store delene" med penn og papir? Hvordan fordøyer du det hele?

magnars06:11:05

Alt det der ser bra ut. Også: Leser README. Klikker meg rundt i appen. Kjører den opp lokalt.

👍 1
slipset07:11:36

Jeg ville kanskje også gjort en

slipset07:11:39

find . -name "*.clj" | xargs wc -l | sort | tail

💡 3
leifericf08:11:02

Det var et kjekt tips, @U04V5VAUN! Og nå fikk jeg en idé: Kanskje man kan bruke https://clojuredocs.org/clojure.reflect/reflect eller https://clojuredocs.org/clojure.datafy/datafy sammen med https://github.com/scicloj/tablecloth og https://scicloj.github.io/docs/resources/libs/#data-visualization-librarieshttps://scicloj.github.io/docs/resources/libs/#data-visualization-libraries via REPL for å få en rask oversikt over hvilke namespaces som er størst, inneholder flest funksjoner, gjør mest bivirkningsgreier, etc. På den måten kanskje man kan visualisere hvordan koden henger sammen, hvilke deler som prater med eksterne API-er, osv.

magnars08:11:28

Ja, kanskje det? Selv hadde jeg nok lent mot å bare lese koden sånn i første omgang. 😅

👍 1
leifericf08:11:10

Ja, det er klart 🙂 Men jeg kan se for meg en situasjon hvor det er svært mye kode og mange filer, og nybegynner-Leif ikke helt vet hvor han bør begynne å lese.

leifericf08:11:47

For eksempel: I et C++ prosjekt hadde jeg begynt med å se på klassetreet og hvordan ulike delene henger sammen, og hva som blir brukt mest. Deretter hadde jeg kastet et blikk på .h filene der de mest brukte klassene er spesifisert, før jeg kikker på .cpp filene hvor klassene er implementert.

leifericf08:11:35

I et Python prosjekt til sammenligning er det mindre formell struktur som er påtvunget av språket, så da er det litt vanskeligere å vite hvor en skal begynne å lese. Da hadde jeg antagelig begynt i entry-point og jobbet meg nedover. Kanskje puttet inn noen print statements, etc. Clojure, som et dynamisk språk uten typer, ligner kanskje litt mer på Python enn C++ sånn sett, men er allikevel forskjellig på mange måter.

Zeniten10:11:18

Jeg er meget giret på http://www.flow-storm.org/ for tiden, så tror jeg ville ha utforsket mye gjennom det.

👀 1
teodorlu11:11:21

Nysgjerrig på hvordan du bruker FlowStorm i praksis. Det har havnet i "ser veldig kult ut men jeg aner ikke når jeg trenger det"-boksen min.

Zeniten11:11:10

Jeg har så langt brukt det til å debugge kode og til å se nærmere på større verdier som dukker opp her og der (her tester jeg også https://github.com/djblue/portal for tiden).

👍 1
teodorlu11:11:21

Så flow storm har også en object browser av noe slag du kan se på store verdier i?

👌 1
Zeniten11:11:42

Jeg bruker ClojureStorm, så instrumenteres koden automatisk. Når jeg er ordentlig forvirret av noe, undersøker jeg prosessen i FlowStorm. Når en datastruktur er for stor for editoren, sender jeg den til FlowStorm. (Noe annet som er fint med ClojureStorm, er at jeg sliper å sette opp tap>-systemet selv: Når jeg har det kjørende, evaluerer jeg bare (tap> exp), og det dukker opp i FlowStorm.)

👍 2
teodorlu11:11:13

Spennende! Mulig jeg må prøve 😊

magnars06:11:19

☀️ 👋

Hagenek07:11:47

God morgen gratitude

slipset07:11:52

Uansett om jeg har sagt det før, og uansett om datalog er enda kulere, duverden så mye bedre det er med sql enn med mongos duste queryspråk.

slipset07:11:30

Og in other news, jeg har forsøkt meg med å bruke copilot i Clojure. Det må jeg bare slutte med.

😀 1
😄 2
cjohansen12:11:35

Er den for dårlig? Eller er det ikke nok boilerplate i Clojure til å få noe hjelp av den?

slipset12:11:09

Det blir til at jeg konstant må sitte å lese kode for å se om det er meningsbærende.

slipset12:11:59

Og Clojure kode er faktisk sånn at når det sitter en ADHD kar på en dårlig syretrip og hiver ut kode, så må man faktisk lese koden ganske grundig for å se om den er korrekt.

😂 1
slipset12:11:31

Jeg syntes det virket som jeg gjorde flere dustefeil enn vanlig med copilot på.

slipset12:11:12

Og den sparer deg kanskje fra å skrive et par linjer kode, men jeg synes jeg skriver ganske fort, så vinninga går opp i spinninga.

slipset12:11:51

Det ville sikkert vært litt for deg som om du skulle parprogrammere med Magnar og han var litt drita?

cjohansen12:11:14

Jeg syns liksom ikke at tempoet på å skrive kode er en begrensende faktor i arbeidet

🎯 1
cjohansen12:11:53

Jeg bruker av og til ChatGPT til å spille ball for å finne ut om det finnes navngitte algoritmer e.l. som kan brukes til å løse problemet jeg jobber med. Det har gitt meg noen gode, tidsbesparende løsninger noen ganger.

cjohansen12:11:02

Men jeg ender opp med å skrive selve koden selv.

slipset12:11:46

Det hadde jo på en måte vært kult hvis jeg kunne skrive eks:

(defn kahn-topo-sort [g] )
Og så ville den skrive en impl for meg. 1. Det klarer den ikke 2. Hvis den hadde klart det, så hadde jeg brukt like lang tid på å lese koden for å forstå at den var korrekt som jeg ville brukt på å implementere den selv (tror jeg )

cjohansen12:11:31

Jeg har lykkes med det der et par ganger på java time-konverteringer 😄

cjohansen12:11:51

(defn inst->local-date [inst time-zone]

cjohansen12:11:14

Og hvor ofte implementerer du sorteringsalgoritmer?

slipset12:11:05

Ikke så ofte, derfor hadde det vært fett å få det impementert for meg 🙂

slipset12:11:38

Her er et forslag fra akkurat nå.

slipset12:11:33

Som ser korrekt ut, men som jeg absolutt ikke trenger.

slipset12:11:49

Her har vi forslaget til ditt problem

slipset12:11:28

Jeg har jo ingen aning om dette er korrekt eller ei. Og det passer dårlig med kodebasen vår fordi vi bruker clj-time

slipset12:11:01

Og jeg tror at jeg ville foretrukket å thread’e det.

cjohansen12:11:01

Ja, jeg har brukt det mest for å finne ut av hvilke API-er jeg må koble sammen hvordan. Så pirker jeg til koden sjæl.

cjohansen12:11:24

Den to-fix-2 er sånn type forslag som gjør at jeg får lyst til å pælme laptopen ut av vinduet

2food08:11:12

God morgen

cjohansen08:11:13

Gjorde en fetch og kikker gjennom endringene. Det angrer jeg ikke på 😆 > org.apache.logging.log4j/log4j-core {:mvn/version "2.17.1"} ;; kjeften på rei, du maser jo som et lokomotiv

😆 5
emil0r11:11:25

Någon som vet något mer om detta?

msolli11:11:02

Tull og tøys ser det ut som: https://news.ycombinator.com/item?id=38127660 Hvis det hadde vært sant ville vi ligget syltynt an som sivilisasjon.

Zeniten12:11:03

Jeg lærte nettopp om zipmap og kunne gå fra dette:

(into {}
      (map vector
           tokens
           (repeat (count tokens) (set [line-n]))))
til dette:
(zipmap tokens (repeat (count tokens) (set [line-n])))
😍

2
magnars12:11:47

Du kan også bare ditche tellingen av tokens i repeat'en. 😊

😮 1
🙏 1
Hagenek13:11:54

Ang. namespacing og design av data spørsmål: Jeg skal sette opp datastrukturen fra db -> frontend, bruker xtdb som database + clojurescript i frontend. Nå har jeg dette som et eksempel top level document: {:xt/id 1 :person/name "Harald" :person/email "[email protected]"}, hadde det vært nyttig å ha et nivå over her med :person, slik at man lettere kan jobbe med alle persons? Også lurer jeg på om jeg skal beholde den flate :person/email strukturen helt ut, er jo vant til at ts hvor det hadde automatisk blitt {person: {email: "etc",}}. Noen meninger rundt dette?

slipset14:11:32

Jeg ville nok holdt dette så flatt som mulig, tror jeg. Det er jo slik hvis jeg husker riktig at clojure printer dette som #:person{:email "" :name "Harald"} eller deromkring.

slipset14:11:03

Det er litt mer interessant i hvilken grad du blander inn eksempelvis adresser inni alt dette, dvs der du har en til mange mellom entitetene dine.

augustl14:11:15

i API-er er man vel ofte interessert i navngitte aggregater, ikke maps med arbitrære nøkler

magnars15:11:32

@georghagen Jeg drar igjen fram en av mine favorittbloggposter, av @odinodin https://www.kodemaker.no/blogg/2019-06-datascript/ Kanskje DataScript kan være en idé?

👀 2
odinodin15:11:29

Jeg prøver å glemme den bloggposten, det gjør for vondt å tenke på når man vasser rundt i javascript-kode :face_palm:

😂 2
magnars15:11:51

Jeg kan slutte å tagge deg hver gang jeg lenker til den 🙈 😅

😄 2
odinodin15:11:37

neida, fint med en påminnelse også om at det finnes en bedre verden. Det varmer på gråterommet

magnars15:11:51

:hugging_face:

leifericf16:11:20

Ganske kult at dette er mulig! babashka

👌 2
🙌 1
🔥 1