Fork me on GitHub
#clojure-norway
<
2023-08-31
>
augustl05:08:55

nei, med re-frame blir det vel bare sånn, med mindre man innfører noe disiplin-basert opplegg

slipset06:08:06

Det der et noe av det mest tafatte og ansvarsfraskrivende jeg har lest på lenge. Nei, kodebasen ble bare sånn. Va’kke min feil lissom.

augustl07:08:08

hihi, det henger sikkert litt sammen, det er ikke noen uttalt arkitektur på hvordan ting skal henge sammen, veien blir litt til mens man går osv

augustl07:08:40

poenget mitt er vel mere at re-frame ikke sier noe om arkitektur, og at re-frame sin default er “bare gjør subscribe hvor du vil”

slipset07:08:01

Så basically frontend, altså.

slipset07:08:37

Poenget mitt er vel at man kan ikke bare legge seg ned og dø bare fordi rammeverket/biblioteket ikke forteller deg hvordan du skal leve.

mariuene06:08:55

Trenger hjelp. Skal intervjue studenter om halvtime til sent på dagen, trenger en fin måte å forklare clojure på kort tid. Jeg pleier å si «det er en Lisp som kjører på jvm». Har noen en bedre måte å beskrive det på?

slipset06:08:15

Jeg tenker at du burde se dette fra den du intervjuer sin side: 1. Er det vanskelig for meg å lære (siden jeg ikke kan det fra før) 2. Blir jeg helt akterutseilt mhp andre jobber siden det er et ukjent språk og alle vil ha utviklere med 10 års erfaring i java.

cjohansen06:08:58

Tankegodset i Clojure vil ihvertfall være gull verdt uansett hvilket annet språk folk skal videre til. Bøker som “Data-oriented programming” (og til en viss grad “Grokking simplicity”) er bevis på det 🙂

cjohansen06:08:46

Clojure er en Lisp som kjører på JVM-en. Det er et dynamisk typet funksjonelt språk med et veldig stabilt og positivt/støttende økosystem (lite breakage, lite drama, god hjelp). Tankegodset fra språket har influert mange mer mainstream teknologier så som Redux.

teodorlu06:08:26

Mine tanker: 1. Som du ser, er syntaksen forskjellig fra språk som Javascript og Java. Dette gir en del fordeler man ser ved bruk, men det kan se uvant ut ved første øyekast. (elefanten i rommet) 2. Clojure har svært god støtte for funksjoner og data, og de fleste problemer kan løses med funksjoner og data. 3. Clojure er laget så man kan få feedback på hvordan ting funker og om det funker svært fort (vise en REPL) Og være tydelig på forventninger. Hvis dere ikke forventer at folk kan Clojure, si det, og fortell hvordan de kan se for seg å bruke de første månedene. Om de blir kastet ut i kode selv, eller om de får hjelp.

2
teodorlu06:08:12

Lykke til! Håper du får laget litt Clojure-entusiasme 😊

cjohansen06:08:29

Man vil ikke ha jobber som krever 10 års java-erfaring 😅

😂 6
😄 2
mariuene06:08:14

Og god morgen

slipset06:08:27

og god morgen, ja.

cjohansen06:08:26

Så med re-frame skriver man ikke rene funksjoner? :thinking_face: Skriver dere tester på disse tingene @augustl?

augustl07:08:24

stemmer, i re-frame er det fritt frem for subscriptions (aka atomer som hentes ut via navngitte “subscriptions”). Vi har vel ca. null gui-tester, usikker på hvor mye det har med re-frame å gjøre

slipset07:08:54

Gitt holdningen i originalinnlegget, ville jeg tenke at det har svært lite med reframe å gjøre 😛 Dog ville jeg tro at det ikke er trivielt å skrive meningsfulle tester for reframe slik dere ikke har valgt å kode det.

teodorlu07:08:59

Av diverse grunner, skal jeg se litt på Kotlin framover. Da er det naturlig å tenke - må jeg lære meg Spring? Eller finnes det lettere løsninger? Hvis om atte noen hadde gravd litt i om det var mulig å skrive webapplikasjoner i Kotlin uten masse herk. Vent nå litt! :thinking_face::thinking_face: https://www.adlibris.com/no/bok/pro-kotlin-web-apps-from-scratch-9781484290569 :hugging_face: (det skjedde nettopp i hodet mitt akkurat nå!)

leifericf07:08:00

@augustl har sikkert mye å si om dette! Som kanskje står i https://www.amazon.com/dp/1484290569/ allerede 😅

😄 2
teodorlu07:08:29

Bøker er veldig fine hvis man har mye man ønsker å dele og skrive ned!

augustl07:08:45

hvis noen tvinger deg til å bruke Spring, så kan du bruke Spring Security bare, som et bibliotek. There’s a chapter for that!

👍 4
augustl07:08:58

kunne faktisk nesten ha re-brandet boka til “How to survive a Kotlin project as a Clojure programmer”

😂 4
slipset07:08:22

Siden vi er inne på reframe og sånt. Jeg må si jeg er skeptisk til at komponenter kan abonnere på updates fra (en global) store. Jeg tror at det gjør det vanskelig å ha noen formening om hva som skjer i app’en samt at det gjør ting vanskelig å teste. Når frontendkode skrives riktig i ardoq (vi bruker react og rxjs) så skriver vi sånn omtrent følgende:

const PureComponent = (props) => <SomeJsx .... />;

const viewModelStream = someStream.reduce(...); // dette er litt som å lytte på changes på et atom, men gjøre data transformering utenfor komponenten. Dette er rene funksjoner som man kan skrive tester for (om man gjør ting riktig)

const ConnectedImpurefComponent = connect(PureComponent, viewModelStream);
Jeg ser fordeler og ulemper med denne framgangsmåten. Å skulle sende hele global state ned i komponenttreet gjør at man får et komponenttre uten bivirkninger, men (jeg tror at man lett) kobler data layout med komponent layout. Fordelen med “connected components” er at de kan flyttes rundt i komponent-treet uten at man behøver å bry seg om at fedrene nå må vite om hva slags barn og barnebarn de har for å kunne sende riktige props

teodorlu07:08:11

Hva med navnerom på event id? Du får kanskje uansett problemet med å sende rundt props. :thinking_face:

cjohansen08:08:18

Jeg opplever ikke det å sende props rundt som et stort problem. Hvis du har et steg som oversetter domenedata til UI-data så har du fristilt domenedataene dine fra layouten - eller i det minste isolert den i en transformasjon.

👍 2
emil0r07:08:24

God morgon

leifericf07:08:48

God morgen! Da er abonnementet til meet-up gruppa vår betalt for nok et år, frem til 31. august, 2024. Beklager hvis dere fikk spam om at arrangøren hadde forlatt gruppa; jeg byttet bank og kredittkort (pga. Sbanken suger nå), og glemte å oppdatere info på meet-up kontoen, så den ble automatisk kansellert for et par dager siden.

2
gratitude 8
❤️ 6
👍 4
leifericf08:08:16

Det er Ardoq via @slipset som skal ha all takk og ære! De siste årene har de refundert meg for abonnementet, så det er de som sponser oss. Jeg er bare en mellommann 🙂

🥳 8
🅰️ 2
emil0r09:08:12

Stort tack @slipset med 🙂

💜 2
slipset12:08:43

Hey @rahul080327 and @anupriyajo, I hear you’re presenting on Javazone. I’m away, but perhaps there are some people from here that would like to hook up or say hi?

teodorlu18:08:49

$ echo 'Great success!'
Great success!
$ echo $?              
0
Hvordan ville du oversatt “Exit code” til norsk? “Sluttkode”? “Returkode”? “Utgangskode”? Alle høres litt rare ut i mine ører, men det kan hende jeg bare synes det høres rart ut siden jeg aldri har hørt noen snakke om sluttkoder/returkoder/utgangskoder på norsk.

augustl18:08:43

resultatkode 😬

augustl18:08:32

likte returkode best, samsvarer med returverdi

👍 2
slipset05:09:29

Det er vel egentlig en returverdi?

slipset05:09:52

Det du ser i konsollet er jo sideeffekten.

slipset05:09:50

Helt analogt med (println «Great success») som har returverdi nil

emil0r05:09:11

exit code är ju för program som avslutas och koden som ges säger något om hur det gick när programmet avslutades

emil0r05:09:35

Så returkode tycker jag är mest logiskt. En exit code är också ett return value

slipset05:09:40

Det er jo bare returverdien til funksjonen main?

slipset05:09:52

$? er jo i så måte helt analogt med *1 i et Clojure repl?

emil0r05:09:53

Ja, men du har returneringsvärden för andra funktioner med, och du kallar inte dem för exit code

slipset05:09:05

Og uten at jeg er villig til dø på akkurat den åsen, så mener jeg at exit code er et lite gjennomtenkt begrep

😂 2
emil0r05:09:14

Det kommer väl egentligen ifrån C om jag minns rätt

emil0r05:09:35

Möjligen ifrån innan dess

slipset05:09:55

Man kunne lett ha tenkt seg et program fakultet som

$ fakultet 3
$ $?
6
$

emil0r05:09:05

Och C är ju lite löst definerat 😉

emil0r05:09:15

Är väl den vi pratar om?

slipset05:09:23

Det er jo ingen standard for hva returverdier fra program betyr, annet enn at 0 som regel betyr at ting gikk bra.

emil0r05:09:53

Det är upp till var program att definera det

emil0r05:09:26

Är i princip ett binärprotokoll

slipset05:09:40

Poenget mitt er vel at jeg synes at exit code er en beskrivelse av hvordan man bruker denne verdien idag, men at det generelt er en returverdi fra programmet som idag konvensjonelt brukes til å flagge om ting gikk bra eller ei, men som kunne blitt brukt til andre ting hvis man ønsket det.

2
slipset06:09:54

Det store problemet med dagens konvensjon er at det er kun en verdi som signaliserer at ting gikk bra, men det er 2^32 eller no verdier man kan bruke for å signalisere at noe gikk til helvete.

👍 2
emil0r06:09:25

Enig i det, men jag skulle nog sagt också istället för egentligen, då det låter som att du menar att det är en motsättning i att det är båda

slipset06:09:36

Nei, ikke motsetning, men heller for snevert.

emil0r06:09:45

Har du något alternativ i åtanke? Nyfiken 🙂

slipset06:09:41

Hvis du tenkte deg at shell’et (altså replet til os’et) oppførte seg som et Clojure repl, så ville jo :

> ls .
returnere et map med filene i $PWD og shellet ville printet ut den returverdien. Så man ville la shellet ta hånd om å printe ut resultatet heller enn at ls gjorde det. Man ender da sikkert fort opp i sånn powershell ting hvor kommandoene kommuniserer med objekter og ikke med tekst. Man kunne da også tenkt at kommandoene/programmene kunne kaste exceptions til os’et og at det ble håndtert av shellet, akkurat som i et CLojure repl.

slipset06:09:00

Jeg ser at det ligger en haug med djevler i detaljene her.

teodorlu06:09:33

@slipset ser argumentet! Alikevel - feks matte-programmene dc, bc og expr bruker alle stdout til å skrive svaret, i stedet for returkoder. Jeg vil argumentere for at konvensjonen er å returnere på stdout, som sikkert har praktiske årsaker (typen til exit code er int, som er litt begrensende). Når du ser på C-funksjoner (`int main...`) blir det jo derimot veldig som du sier.

teodorlu06:09:52

Egentlig et interessant spørsmål om dette er en designsvakhet i skallene vi bruker - og om alt hadde vært bedre med funksjoner og returverdier. Jeg klarer ikke si ja eller nei på den, blir mye å se for seg. Kanskje noe ala Content-Type for å si om man vil ha data eller om man vil ha en menneskelesbar variant. Da er man kanskje fort i powershell-land.

teodorlu06:09:23

Jeg skriver om til "returkode" for nå. 🙏 Takk for innspill! Det hjalp.

teodorlu06:09:56

(tror ikke jeg skal lage et nytt skall som gjør dette korrekt i dag 😅)

cjohansen06:09:27

"REPL-et til OS-et", det var fint @slipset 😊

slipset06:09:10

Styrkene til dagens «Vi kommuniserer via tekst på stdout og stdin via pipes» er vel godt beskrevet i litteraturen.

slipset06:09:11

Husk at | i Shell ender opp i systemkallet pipe som tar to file descriptorer om jeg ikke husker helt feil.

leifericf06:09:44

Termineringskode? Termineringsreturverdi? 😅

slipset06:09:40

Jeg synes alt det blir feil fordi det blir magisk. Det er ikke magi. Det er en int som returneres fra et program. Det er konvensjonene rundt det som gjør at det blir magisk eller vanskelig.

💯 2
slipset06:09:07

Lag fakultet programmet som returnerer resultatet via returverdien formå illustrere poenget. Og så kan man fortelle om konvensjonene og hvorfor det heter noe med kode og ikke verdi.

slipset06:09:52

Og grunnen til at det heter noe med kode og ikke verdi er fordi man må dekode verdien for at den skal gi mening.

slipset06:09:48

At echo returnerer 0 etter at den har klart å skrive noe gir egentlig ingen mening uten konvensjoner eller kunnskap om hvordan det skal dekodes.

slipset06:09:06

Sånn oppi hodet mitt har returverdi og exit code vært to helt forskjellige konsepter i alt for lang tid, men når jeg endelig forstår at det egentlig er det samme er det en ting mindre å huske på, og verden blir litt enklere for meg.

slipset07:09:07

Det blir morro når du ser på programmer som https://www.man7.org/linux/man-pages/man1/test.1.html og https://man7.org/linux/man-pages/man1/grep.1.html#EXIT_STATUS. Når man snakker om grep, så kan man argumentere for at den «gjør for mye» siden den vet hvordan man skal forholde seg til både filer, fildescriptorer og greier. Man kan si at grep er easy, men ikke simple. Simple ville vært et program som gitt en streng med tekst og en regex ville returnert om teksten matchet eller ikke.

augustl07:09:09

noen må ta grep!

😂 2