Fork me on GitHub
#clojure-norway
<
2024-04-11
>
tord07:04:16

God morgen!

slipset07:04:06

Morn, endte opp med å boote emacsd-reboot og mekke min egen basert på den og min gamle https://github.com/slipset/emacsd

💪 1
teodorlu07:04:04

Jeg synes den er veldig bra. Skrev en super-kort oppsummering i #clojure-europe nettopp (hvis dere absolutt ikke ønsker å bruke 4 minutter på å lese originalen): https://clojurians.slack.com/archives/CBJ5CGE0G/p1712820756033009

cjohansen07:04:25

> These are the olives of technology. Olives aren’t candy, and tasting them the first time isn’t always pleasant, but soon you will develop a taste for them. 😂 ❤️

👌 2
🫒 3
😸 1
catjam 1
🍸 1
chef_kiss 1
cjohansen08:04:28

Verdiskapning på høyt nivå

😂 4
🔥 3
Zeniten08:04:30

I don't get this. :drum_with_drumsticks:

mariuene08:04:53

det er da ikke nok enterprise, må gå dypere! https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition

🤯 1
😄 1
🔥 1
📉 1
cjohansen08:04:30

Kodeeksempelet mitt stammer ikke fra en vits, bare så det er sagt 😄

mariuene08:04:30

men jeg syntes du burde lage en annotering istedet for Builder objektet. En @this

mariuene08:04:00

Mye bedre å ha annoteringer enn å skrive funksjoner IMO.

cjohansen08:04:28

La meg legge til at det er heller ikke jeg som skriver denne koden 😅

mariuene08:04:39

hva er extreme ownership ?

slipset08:04:17

Det ser jo ut (fra annotasjonen) som at dette er en override fra superklassen. Jeg undrer veldig på hvordan superklassens impl av getThis ser ut?

cjohansen08:04:38

Den finnes ikke, det er en abstrakt klasse

augustl08:04:55

veldig kjekt å kunne overskrive oppførselen til getThis ja, og ikke bare ha en default-implementasjon som returnerer this

magnars09:04:34

Min OO-fu har blitt så dårlig at jeg nå sitter her og er usikker på om @U0MKRS1FX er sarkastisk eller ikke, og om @U7DT92B9R mener at Jocko syns Christian burde ta ansvar for all open source Java-kode han ramler over. 🙈

😄 2
teodorlu09:04:07

For å kaste enda mer forvirring på bålet, jeg likte Extreme Ownership av Jocko Willink veldig godt da jeg først leste den. “Ikke skyfle ansvaret over på andre, ta ansvar for å fikse det du kan selv”. Men jeg skjønner heller ikke helt parallellen inn i kode? Hvis vi skal koble “jocko-ownership” med feks “rust-ownership”, blir det bare krøll i hodet mitt thinking-face

cjohansen09:04:14

Jeg har nok selvsikre amerikanere i monitor, orker ikke å oppsøke sånne folk eller skriveriene deres 😅

mariuene09:04:38

jeg trodde et øyeblikk at dette var fra mattilsynet sin kodebase. derfor kalte jeg Jocko. 😅

teodorlu14:04:46

Jeg leste Extreme Ownership ei en periode da jeg var veldig interessert i å forstå hva jobben til en leder egentlig er, føler jeg fikk mye ut av det da. Jeg har ikke lest så mye av Jocko siden. Han har en podcast som har et par interessante episoder, feks én der han får besøk av en tidligere spesialsoldat som tjente under Vietnam-krigen. Mistet troppen sin, måtte hugge seg ut av jungelen på egen hånd, overlevde. Jeg vil kanskje si at den beste introduksjonen til Jocko er historien hans fra Ramadi: han hadde ansvar for en operasjon under https://en.wikipedia.org/wiki/Battle_of_Ramadi_(2006). Der ble en irakisk soldat skutt og drept av en alliert amerikansk soldat. Hvem tar da skylda? Det finnes en TEDx-talk hvor han snakker om den opplevelsen: https://www.youtube.com/watch?v=ljqra3BcqWM Jeg synes han snakker ganske godt om ydmykhet i Extreme Ownership og The Dichotomy of Leadership. Men jeg tror målgruppen hans er yngre folk som er usikre på hva det vil si å ha lederansvar.

teodorlu14:04:49

Builder getThis()
men … finnes det egentlig noen tilfeller er man trenger dette i praksis? Unntatt å kalle
builder.getThis().getThis().getThis().getThis()
så mange ganger man vil for gøy? (hvis jeg skal kverulere med meg selv finnes det jo steder der vi har bruk for clojure.core/identity. Men vi slipper i det minste å skrive en ny versjon av identity hver gang vi trenger en ny klasse. I så fall bør vi vel putte getThisObject, så alle objekter får den! 😁)

cjohansen14:04:29

Jeg forstår ikke hva man skal med getThis, nei. Kanskje det er noe arv-fuckery? For å få rett type eller noe sånt?

thinking-face 2
boosja19:04:12

while (true) {
  builder.getThis()
}

msolli13:04:06

Datomic-spørsmål: Hvis jeg skal sette opp en Valcache eller Memcached for caching, hvordan finner jeg ut hvor stor kapasitet den bør ha? Er det så enkelt som "helst så stor at du får plass til alle segmentene i storage"?

cjohansen13:04:04

Vil tro det er det som gir deg best ytelse. Hvis det er for mye så vil jeg tro at "jo mer jo bedre" opptil det punktet.

msolli13:04:20

Er ikke så mye, viser det seg:

datomic=> select pg_size_pretty(pg_relation_size('datomic_kvs'));
 pg_size_pretty
----------------
 1758 MB

cjohansen13:04:59

Dette begynner å ta form: https://github.com/cjohansen/clj-nats Du kan nærmest høre tenners gnissel i denne koden 😅

👏 4
😸 1
🎉 2
🤯 1
😎 2
Zeniten14:04:59

Er grunnen til at du i navnet til biblioteket prefikser med "clj", å sitte igjen med cl*j-nats*? 😄 Er det egentlig noen konvensjon for "clj" som prefiks eller postfiks? Jeg merket meg at du har har andre biblioteker med postfiks, som fontawesome-clj og phosphor-clj.

cjohansen14:04:10

Nei, her har jeg ikke noe godt svar

cjohansen14:04:22

Kan ikke egentlig forklare hvorfor det ble sånn 🙈 😂

Zeniten14:04:41

Ok, det passet jo fint slik det ble. 🙂

slipset18:04:42

Noen grunn til at du ikke bruker ns-kws for :stream-name og :consumer-name

slipset18:04:26

Jeg tenkte egentlig på at alt dette kunne vært prefixa med ::nats/ men, så kunne man jo også tenkt seg :stream/name og :consumer/name

slipset18:04:59

Denne skjønte jeg ikke:

(def ack-policy->k
  (into {} (map (juxt second first) ack-policies)))
Ække det bare ack-policies da?

Fredrik18:04:14

Det er mer som map-invert, den lager inversen

slipset19:04:14

Ah, men da kan man jo bruke clojure.set/map-invert så slipper jeg å bli forvirra?

cjohansen19:04:49

Ah, da har jeg lært noe nytt. Fikser 👍

Fredrik19:04:57

clojure.set har en del sånne "åh så kjekt" funksjoner

cjohansen19:04:20

Jepp, jeg har ikke alle i fingra

cjohansen19:04:37

Har ikke tenkt så nøye over namespaca keys, men det burde jeg nok, bra innspill

cjohansen19:04:50

Dette prosjektet har vært preget av mye mekanisk mapping og unwrapping

slipset19:04:39

Skjønner. Jeg driver og lurer på om jeg kanskje synes at ns’a keys gjør seg bra i sånne data-dsl’er

slipset19:04:57

Så skjønner man kanskje hvor disse kw’ene kommer fra (og brukes)

cjohansen19:04:05

Ja, det er fint det

cjohansen19:04:22

Må balanseres litt mot "praktisk å bruke" også

cjohansen19:04:36

Men tror det vil gjøre ting tydeligere, så jeg prøver litt for å se hvordan det blir

cjohansen19:04:07

Sånn, nå er map-invert på plass. Bra tips 😄

cjohansen19:04:26

Namespaca keys blir bra

cjohansen19:04:48

(def conn (nats/connect ""))

(stream/create-consumer conn
  {:nats.consumer/stream-name "test-stream"
   :nats.consumer/name "test-consumer"
   :nats.consumer/durable? true
   :nats.consumer/filter-subject "test.work.>"})
Litt mer verbost, men samtidig helt åpenbart hva som hører til biblioteket

cjohansen19:04:36

(ns nats.stream
  (:require [clojure.set :as set]
            [nats.core :as nats])
  (:import (io.nats.client ConsumeOptions ConsumeOptions$Builder IterableConsumer
                           JetStream Message PublishOptions PublishOptions$Builder
                           PurgeOptions PurgeOptions$Builder)
           (io.nats.client.api AccountLimits AccountStatistics AccountTier AckPolicy
                               ApiStats ClusterInfo CompressionOption ConsumerConfiguration
                               ConsumerConfiguration$Builder ConsumerInfo ConsumerLimits
                               DeliverPolicy DiscardPolicy External PeerInfo Placement
                               ReplayPolicy Republish RetentionPolicy SourceBase
                               SourceInfoBase StorageType StreamConfiguration StreamInfo
                               StreamInfoOptions StreamInfoOptions$Builder StreamState
                               Subject SubjectTransform)
           (io.nats.client.impl AckType)
           (java.time Instant ZoneId)))
Hva er det som har to tomler og befinner seg langt inn i "kingdom of the nouns"? 😅

😄 1
slipset19:04:35

Mulig at dette blir helt feil, men hva om du hadde hatt et ns nats.consumer, så kunne du:

(consumer/create conn
  {::consumer/stream-name "test-stream"
   ::consumer/name "test-consumer"
   ::consumer/durable? true
   ::consumer/filter-subject "test.work.>"})

cjohansen19:04:34

Ja, det er nok noe

cjohansen19:04:45

Ettersom jnats har så hælvetes mange klasser har jeg forsøkt å lage det så flatt som mulig. Men et consumer-namespace er i tråd med ambisjonen om at det skal ligne mer på nats CLI-et

teodorlu14:04:15

Hvis UI-komponenter bør returnere data, bør de da returnere Hiccup eller et Ring-map med :headers, :status og :body?

cjohansen14:04:26

Min første tanke er at det er to forskjellige nivåer

cjohansen14:04:42

Du beskriver en side, som består av en komponent og mer til

teodorlu14:04:30

sant, begge kan jo returnere data. Og en side kan bruke flere komponenter. Og så lenge begge er rene funksjoner, er det vel ikke noe problem om en side kaller på funksjoner for å bygge opp HTML-en sin?

cjohansen14:04:45

Absolutt ikke

teodorlu15:04:41

Jeg gikk for rene funksjoner for sider som bruker rene funksjoner for komponenter. Må si at jeg liker dette veldig godt! Tidligere har jeg skrevet “sider” (handlere) som gjør sine egne sideeffekter. Det har jeg ikke lyst til å gjøre mer!

pez15:04:02

Aldrig mer!

😸 1