Fork me on GitHub
#clojure-norway
<
2024-03-26
>
cjohansen07:03:31

Dagens bloggpost slår nok ned åpne dører (evt slår en død hest) her inne, men jeg drister meg til å dele lenka allikevel: https://parenteser.mattilsynet.io/historiske-data/

datomic 5
🚪 3
💯 3
👀 1
teodorlu07:03:14

Setter veldig pris på de håndfaste eksemplene på bruk av d/q med (d/history ,,,) som argument. Synes ofte det er litt vanskelig å skjønne sånt fra å lese datomic-dokumentasjonen.

teodorlu07:03:15

Liker også at du/dere faktisk tar med dere motivasjon om hvorfor!

augustl08:03:39

verden trenger en datomic-talk som itererer seg frem til forståelse via en som gjør seg vanskelig med vilje

augustl08:03:27

“men det går jo ikke an å si hvordan databasen så ut på et gitt tidspunkt, siden det skjer masse ting samtidig i databasen”

teodorlu08:03:19

det jeg synes er skikkelig rart oppi det hele er at caching blir mye lettere når man har en dartabaseversjon. Så i mange tilfeller, (A) sparer man på historikken, og (B) får bedre ytelse.

Ivar Refsdal09:03:44

Korleis løyser de GDPR / personvern / sletting av sensitive data? Eg synest Datomic ikkje har eit veldeg godt "svar" på det (eg kjenner til excision og https://github.com/ivarref/rewriting-history#rationale)

augustl09:03:29

haha jøss, den var ny. Enig at det ser ut som en bug, ja

augustl09:03:43

ser kanskje ut som buggen ligger i en potensiell misforståelse av sync-excise. Den returnerer en db som ser ut som den ville gjort som om alle excisions har kjørt, sier dokumentasjonen

augustl09:03:03

altså garanterer den ikke at storage faktisk er opppdatert osv

augustl09:03:59

> Retrieve a database value that is aware of all https://docs.datomic.com/pro/reference/excision.html up to a https://docs.datomic.com/pro/glossary.html#t. > Does not communicate with the transactor, so the future may be available immediately. The future can take arbitrarily long to complete. Waiters should specify a timeout.

cjohansen09:03:04

Vi lagrer sensitive data i en egen database og joiner på tvers av databaser. Vi har lite sensitive data.

cjohansen09:03:49

Excision vil være godt nok for oss, det har fungert for meg før. Alternativt kan man gjøre en decant.

Ivar Refsdal09:03:04

> Alternativt kan man gjøre en decant. Kva tyder dette? At ein "køyrer" heile Datomic på nytt (historikken)? Korleis gjer ein det?

cjohansen09:03:44

Du oppretter en ny database, og så kopierer du over transaksjonsloggen fra en gammel database, men filtrerer ut data du ikke lenger ønsker å ha.

cjohansen09:03:05

Du kan tilbakedatere transaksjoner når du har en ny database, så du kan beholde alle timestamps osv

Ivar Refsdal09:03:04

Okey, eg meiner å ha sett eit script for noko slikt ei gong (og det var ikkje trivielt fritt etter hugsen), men finn det ikkje att. Har de eit slikt script?

cjohansen09:03:07

Har ikke noe for hånden akkurat nå. Hvor vanskelig det er kommer an på hvor sammenvevd dataene du vil fjerne er. Prosessen er som følger: Loop gjennom transaksjonsloggen fra første transaksjon. Sjekk om transaksjonen skal være med eller ikke. Skriv til ny database. Sjekken på om noe skal med eller ikke er den som kan være knotete, altså mulig du må se på referanser osv. Men veldig vanskelig har jeg vanskelig for å se for meg at det skal være. Dette kan du sågar gjøre mens den gamle databasen står og går. Når du er ferdig stopper du den gamle, kjører prosessen en gang til for å få med transaksjoner som har kommet inn i mellomtiden, og så starter du opp med ny database.

Ivar Refsdal10:03:37

Einig i at det høyrest ganske rett fram ut. (Og så når eg tenker noko kjem til å ta 5 minutt, så tek det typisk 35 minutt minst. Orsak om eg ranter litt...)

cjohansen10:03:57

Jeg sier ikke at det nødvendigvis tar 5 minutter, men det er helt gjennomførbart.

cjohansen10:03:17

På forrige prosjektet gjorde vi excision ca en gang i måneden, det fungerte også greit.

Ivar Refsdal10:03:11

Eg meinte heller ikkje å seia at det tek nøyaktig 5 minutt eg heller, berre at eg har ein tendens til å tekna at "kor vanskeleg kan dette vera?" og så viser det seg at det er ein heil del ting eg ikkje hadde tenkt på som tek tid (og difor eg etterspurde eit script om de har gjort dette før). Irriterer meg at eg ikkje finn det skriptet eg meiner å ha sett for lenge sidan ...

augustl15:03:40

jeg ble litt nysgjerrig på dette med at excision har en bug som gjør at retractions blir hengende igjen - stemmer det faktisk?

augustl19:03:14

den ser ut til å lene seg på at sync-excise snakker med transactoren, som den ikke gjør

augustl19:03:55

den returnerer en db som ser ut sånn db ser ut når excise har kjørt ferdig, men den venter ikke til den faktisk er kjørt ferdig. Og db-verdien som returneres fra den brukes ikke i sjekkene som etterfølger

augustl19:03:58

kjapp skisse på hva jeg mener 🙂

Ivar Refsdal19:03:26

Okei, takk. Du meiner den testen der kan ha annleis oppførsel enn ekisterande kode? Ikkje heilt ueinig i det. Skal me sjå ...

augustl19:03:44

stemmer, ved første øyekast ser jo sync-excise ut til å vente til en sync faktisk er gjennomført i transactor/storage, men det er egentlig en “fake” as if som gir deg et db-view som om det har skjedd. Så når koden under henter ut en ny conn, og ikke bruker db returnert av sync-excise, blir ikke testen “reell”

augustl19:03:54

aka datomic har ingen funksjon for “vent til excise har kjørt 100% ferdig”

Ivar Refsdal19:03:36

Eg forstår poenget ditt. Merk at testen både sjekker at data forsvinn og at data "heng igjen". Den testen har ikkje feila for meg, men det er vel ein sjanse for at den kunne ha gjort ja. Same resultat forøvrig med dine endringar: https://github.com/ivarref/rewriting-history/blob/main/test/no/nsd/rationale_test.clj (den nyttar datomic-testcontainers, så den spinner opp ein faktisk transactor + pgsql for testen) Edit: ny commit no altså: https://github.com/ivarref/rewriting-history/commit/0d397f4dbe3f569e76debe5c2e955af4ae7e641b

Ivar Refsdal19:03:51

mao. buggen finst framleis i 1.0.7075

augustl19:03:55

ville ikke overrasket meg med “random” oppførsel etter en excision. Men se der ja, lik oppførsel, ville hørt med Datomic-folket og sjekket at det ikke er en bug

Ivar Refsdal19:03:32

Eg skreiv om det på #C03RZMDSH ei gong i tida

augustl08:03:08

tok en råsjans på å spørre en gang til 🙂

Ivar Refsdal14:03:57

Flott. Takk! 🧡

jonas08:03:02

Disclaimer(har aldri brukt datomic). Men i og med at man bruker andre databaser som backend for datomic, vil det være veldig vanskelig å snike seg inn bakveien å slette data rett i backenden? Tror jeg skal leke litt med datomic i påsken ❤️

augustl08:03:51

datomic lagrer komprimerte blobs med data i storage, ikke strukturerte tabeller osv

jonas08:03:56

Kan man organisere dataene på en slik måte at hver blob bare vil ha informasjon om en spesifikk prosess/bruker?

augustl08:03:31

usikker, man kan spesifisere partitions når man lagrer facts for å få relaterte data til å lagres nære hverandre i storage, men inntrykket mitt er at det er for domene-nivå og ikke data-nivå

cjohansen08:03:54

Datomic bruker “storage”-databasen som et filsystem. Det blir som å begynne å rote rundt og trikse med filene under .git/objects Ja, kanskje er du heldig og treffer noe riktig, men det er garantert å gi deg sorg i lengden.

😄 1
jonas08:03:55

blir litt kåbbåy

1
cjohansen08:03:59

Det er ikke engang anbefalt å ta backup av den underliggende databasen

cjohansen08:03:14

(Altså, de anbefaler sterkt å bruke datomic sitt backup-verktøy)

jonas08:03:20

i systemet jeg jobber på nå hadde det vært veldig fordelaktig med historikk, isteden ender vi opp med masse kode og skrot for å støtte det

cjohansen08:03:38

Det blir gjerne sånn. Veldig fint med historikk i dataene 🙂

teodorlu07:03:02

Jeg er generelt imot å slette fortiden. Enten det dreier seg om retroaktiv omskriving av andres tekster, brenning av bøker, eller kasting av historikk! 😁

😁 1
teodorlu07:03:33

Selv om jeg fremdeles synes at PostgreSQL og SQLite er skikkelig kul og imponerende teknologi.

Zeniten09:03:38

:saluting_face:

cjohansen11:03:56

I dag har jeg brukt et par timer på å kalle én enkelt Java-funksjon. Life is good!

leifericf19:03:48

Jeg brukte minst to dager på å kalle iteration korrekt 😂

leifericf19:03:12

Men nå er det lett å gjøre det igjen!

mariuene11:03:18

Høres godt ut som du jobber i det offentlige ja trollface

😂 2
cjohansen11:03:47

Det er få ting som føles så "jobbe i det offentlige" som å interagere med Java API-er!

mariuene11:03:39

men hvor mange møter har du hatt om hvordan du skal integrere med Java APIet?

cjohansen11:03:16

Ingen. Med mindre du teller praten med thheller på #C03S1KBA2 i stad 😄

cjohansen11:03:41

Det var forøvrig Google som leverte API-et. De lager de mest byråkratiske API-ene av dem alle

mariuene11:03:40

Velkommen til @habtegabrermias!

❤️ 3
mariuene11:03:41

Ermias er nyansatt hos Ardoq

Ermias Habtegabr11:03:49

Hei, hyggelig å være en del 😁

👋 12
cjohansen11:03:46

Velkommen! Og gratulerer med jobb hos Ardoq 😊 Har du erfaring med Clojure fra før, eller skal du igang å lære?

Ermias Habtegabr11:03:28

Jeg har jobbet hos Ardoq for en liten stund som intern så jeg har litt erfaring

Ermias Habtegabr11:03:06

Har også gjort Racket før

cjohansen11:03:28

Hva brukte du Racket til?

Ermias Habtegabr11:03:42

Tok en klasse om funksjonelt programmering på UiO

teodorlu12:03:40

Velkommen! :hugging_face:

😃 1
boosja12:03:53

Jeg sitter med et React project nå med masse rot, state og hooks. Vi har funnet ut at det er trøbbel med ytelsen hvis man har lastet opp mange bilder (~100). Lurer på å kanskje refaktorere siden (eller undersiden) til top down "stateless" ui. Har dere noen tanker eller fiff til hvordan dette kunne gjøres trinnvist? Tenker på å trekke ut alle hooks og states fra barna til foreldre-noden og så endre barna til ui-komponenter. Og da lage en prepare-funksjon (hvis jeg trenger det) som sender videre props til ui-komponentene. Det er mange hooks som da kan merges og slettes, og da får vi all staten og logikken samlet i én komponent. Hva tenker dere? Er dette helt på sida?

slipset12:03:48

Som du sier: 1. flytt state mot roten av komponent treet. 2. Fjern hooks evt flytt dem også til roten av komponent treet.

☝️ 2
slipset12:03:47

Så ja!

💯 1
Zeniten13:03:43

Jeg bifaller. 👍

😁 2
cjohansen13:03:54

Dette har atpåtil @U04V5VAUN mye erfaring med å gjøre! 🙂

slipset13:03:49

Det er (minst) et tilfelle der jeg mener det er greit å bruke useState og det er hvis du har en form som du skal samle inn verdier før du trykker Submit

slipset13:03:38

Det er også (tror jeg) fordelaktig å utvikle ens komponenter i portfolio eller storybook sånn at det er begrenset hvor mye feil man kan gjøre.

slipset13:03:09

Og, hvis jeg hadde vært konsulent, så hadde jeg gjerne gitt deg en time eller to for å se på koden 🙂

slipset13:03:15

men nå må jeg tilbake til resultUtilssom jeg akkurat konverterte fra js til ts og ser at den ikke i det hele tatt snakker godt sammen med de typene som jeg allerede visste var løgnere!

boosja13:03:37

Tusen takk, jeg får se hvor omfattende jobb det blir 😄

boosja13:03:23

Jeg prøvde meg fram med å wrappe noen komponenter i memo, men det hjelper ikke når hooksene inni komponenten er skurken picard-facepalm :face_exhaling:

slipset13:03:27

Jeg har litt inntrykk av at det fort baller på seg med hooks…

boosja13:03:43

De er overalt, mye av det selvforskyldt 😳 😬

💪 1