Fork me on GitHub
#clojure-norway
<
2020-09-11
>
michele mendel09:09:03

En intressant sak i artikeln är prepare-funktionen. Detta påminner om semantisk model i DSL (Fowler), där man inte kodar i text som parsars, men mot en model. Fördelen med att ha en model istället för data, är att man kan ha andra prepare-funktioner mot samma model, t.ex. en som genererar PDF.

augustl10:09:18

ah, interessant!

augustl10:09:31

det viktigste er kanskje ikke at GUI-et har null kjennskap til domenet - men at domenet har null kjennskap til GUI-et!

augustl10:09:36

holder på og implementere denne arkitekturen i prosjektet mitt nå

augustl10:09:53

er mest usikker på det med navn, enn så lenge har GUI-et mitt navn fra domenet. Men strukturen på dataene er totalt annerledes i domene og GUI

michele mendel11:09:31

Teknisk sett är det prepare-funktionen som har kunskap till bägge sidor, men vi (programmerare) kan ju inte slänga vad som helst på domenet och GUIt, och hoppas att detta bara kommer att fungera, så vi har också den kunskapen.

mokr12:09:25

Ref den bloggen og generiske komponenter. Er det noen som har erfaringer med https://github.com/day8/re-com (https://re-com.day8.com.au/#/introduction)? Er litt skeptisk til lock-in-effekten (utvalget tilgjengelige komponenter + Bootstrap), men når det kommer ut av samme sfære som re-frame, så heller jeg mot å gi det en sjanse fremfor å fortsette å lage generiske komponenter fra scratch.

slipset13:09:29

Mener å huske at maintaineren av re-frame sa noe om dette på the clojurescript podcast (men husker ikke hva han sa 🙂

augustl13:09:50

@slipset something something balsansering av parenteser

slipset13:09:24

meep, jeg kan vel ikke noe for at slack velger å rendre :) som en emojii?

mokr13:09:25

Hørte på den. Om jeg ikke husker feil så brukte han det vel mest til bedriftsinterne GUIs der man fyller inn diverse info. Da er kanskje ikke fokus at det skal se så sexy ut :) Jeg får vel bare teste litt i et eget prosjekt og se om det gir mersmak.

ingesol14:09:55

I det minste er de veldig gode å bruke som referanse for best practice på komponenter. Tror flere av komponentene inneholder eksempler for å løse text input uten cursor-hopping og slikt

✔️ 3
slipset14:09:42

Mener å huske at han finnen sa på clojurescript podcast at det var en liten mengde hack som måtte til for å fikse hopping i text-input…

isak14:09:24

Ja, pga. async rendering

mokr14:09:34

Når er det man typisk støter på cursor-hopping? Er det f.eks. når man forsøker å “pretty printe” input ala kredittkortnr med mellomrom?

isak14:09:24

Sikkert da også, men enkleste repro er vel hvis brukeren piler tilbake, og prøver å skrive i midten av en tekst

augustl14:09:35

skjer når som helst når du ikke synkront oppdaterer verdien til et input-element

augustl14:09:57

eller, skjer vel når som helst når du med JS setter verdien til et input-element?

augustl14:09:08

asykront eller ikke

augustl14:09:17

sånn fra et rent DOM-api-perspektiv

isak15:09:17

Mulig du vet mere om dette, men jeg tror det er litt spesielt hvis man har en "Controlled Component": https://reactjs.org/docs/forms.html#controlled-components

mokr15:09:33

Min context er at jeg sitter og hamrer løs på et input felt i egen re-frame app, uten å klare å trigge noe som gir dårlig sluttbrukeropplevelse. Jeg filtrerer der bort ugyldig input, men forsøker ikke å pretty printe.

isak15:09:44

Og det får man ikke via reagent, AFAIK

mokr15:09:05

Har jo selv opplevd dette i diverse tjenster og det er jo helt håpløst.

augustl15:09:20

det React gjør er vel å ikke sette value hvis man synkront i en onChange setter value til det samme som den allerede er - for å unngå at cursoren hopper

augustl15:09:46

men gjør man noe asynkront mister react muligheten til å tracke det skikkelig

isak15:09:23

Vel hvis du lager komponenten via Reagent/re-frame har de jo den workaround. I dag tror jeg man bare opplever det hvis man bruker en js component som man ikke kan legge den hacken til.

mokr15:09:29

Er lett å ta for gitt alt man slipper å frustrere seg over når man lever i Clojure(script) land 🙂

mokr15:09:06

Noe helt annet. Får dere brukt Datomic på en fornuftig måte uten å måtte betale lisens? Datomic gir så fullstendig mening når jeg leser doc, ser videoer osv, men jeg sitter igjen med følelsen av at man enten må betale, gå for betalingsutsettelse (starter lisens) eller bruke extra-light versjonen (in memory). Jeg skulle ideelt sett hatt en on-prem versjon som krever betaling ved gitte backends, redundans, scale eller annet som kommer etterhvert, men som lar meg bruke alle konseptene fra dag én for å kunne introdusere teknologien og vise at den har noe for seg, før man så evt betaler. Er jeg helt på viddene, eller gir dette et greit bilde av situasjonen (gitt at de ikke har oppdatert lisensbetingelsene i det siste)?

augustl15:09:54

har laget ett system som fortsatt kjører på free 🙂

augustl15:09:59

en ulempe nå er at pro har flere features

augustl15:09:10

husker ikke på stående fot hva det er, men free virker ikke å bli oppdatert lengere

mokr15:09:26

Oh, det gjør det jo enda verre.

augustl15:09:32

datomic sin lisensmodell har blitt ganske grei nå da, du betaler vel bare "per system" eller noe sånt, ikke per CPU/instans

augustl15:09:05

og så har de jo starter edition som er gratis for alltid, men bare får oppdateringer det første året

mokr15:09:31

Mulig jeg må oppdatere meg på lisensene.

augustl15:09:38

de gjorde en større revamp for noen år siden 🙂

mokr15:09:53

Da er jeg nok oppdatert 🙂

mokr15:09:34

Problemet slik jeg ser det er at “Starter” ikke er “no cost”.

mokr15:09:57

Du investerer nå, men utsetter betalingsforpliktelsene et år

augustl15:09:09

ish, det er jo "bare" å la være å oppdatere til siste versjon

augustl15:09:23

og så kan du betale 50k når du oppdatere

augustl15:09:47

kommer veldig an på prosjektet selvfølgelig, om 50k er en stor eller liten kostnad

mokr15:09:58

Tenker at jeg i hvert fall må forankre det med sjefen før jeg går for den løsningen 🙂

mokr15:09:54

Har du forresten noen gang “manipulert” tiden (i mangel av et bedre ord) i Datomic slik at “T” ikke er tiden man la inn data i Datomic, men timestamp fra en logfil? Datomic sine features må kunne løse enkelte problemer veldig elegant om man får til det på en god måte.

augustl15:09:13

nei, domenetid er ikke en greie med datomic desverre

augustl15:09:22

utover at du kan gjøre backup/restore osv, altså lage en helt ny database

augustl15:09:43

dvs, du kan sette T selv, men den må være større enn forrige tx

augustl15:09:58

så du kan ikke sette inn "gammel" data hvis du får noe fra en sensor med litt latency elns

emil0r15:09:35

Är väl en av orsakerna till att crux blev skrivet

emil0r15:09:11

@mokr Har använt re-com till tidigare projekt. Funkar OK, men jag är inte så förtjust i att de inte har en map för properties, utan istället dynamiskt sätter samman det. Det gör det svårare att sätta ihop vad du vill ha programmatiskt när du behöver det. Utöver det så är det lite begränsat med komponenter

emil0r15:09:31

Just nu så använder vi https://ant.design vilket funkar någorlunda

emil0r15:09:59

Största problemet där att det är svårt att ändra på stylingen då de mixar styling med javascript i en salig soppa 😞

emil0r15:09:17

ref Cursor hopping. Stötte på problemet när jag skrev https://github.com/emil0r/ez-wire

emil0r15:09:56

Säg att du har en komponent som är en textarea, och du uppdaterar mitt i. Då hoppar cursorn till, vilket är extremt irriterande om du sitter och skriver på en längre mening

emil0r15:09:27

Sättet du kan ungå det är via att använda :default-value som grundläggande värde

emil0r15:09:09

Funkar rätt bra, till dess att du behöver tvinga en revert till ursprungligt state. Tittade på problemet, men kom inte fram till en lösning pga tidsbrist

emil0r15:09:48

Tror jag kommer behöva göra en helt ny form för att tvinga en re-render som börjar ifrån origin state

emil0r16:09:04

Cursor hopping är också ett problem om du använder react komponenter

mokr16:09:13

@augustl Jeg var ikke spesifikk nok. Jeg tenkte på scenario der man har en tom database og populerer den med kronologiske loggdata i en gjennomkjøring. Jeg forstår det som at Datomic kan takle. Loggene jeg forholder meg til er typisk sprett på flere noder, så jeg må i tilfelle flette de før innlegging. @emil0r Takk, både begrensing mht antall komponenter og args (map destructuring) fremfor faktisk map i input plaget meg litt. Han skrev vel litt om hvorfor det siste ble valgt, uten at jeg husker hvorfor eller om jeg i det hele tatt leste den delen. Jeg tenker det er lett for at det blir en salig suppe når man prøver å lage generiske komponenter som skal passe for mange. Spesielt når det skal styles mye eller bygge på f.eks. Bootstrap. For meg synes det som en suksessfaktor at det er lett å definere overrides eller tillegg. Eksempelvis legge til eksta klasser eller overstyre de helt og tilsvarende for tooltips og annet.

slipset16:09:19

Hans Hübner hadde en bra talk (kritisk) on Datomic for noen år siden. https://youtu.be/0y6QK813new

mokr16:09:03

@slipset Takk, seiler fort opp som dagen fredagsunderholding. 🙂

slipset16:09:37

En ting (som @augustl og @emil0r ) har tatt opp m Datomic er at du får tx-time, men må selv modelere domene-tid.

mokr16:09:51

Nå er det litt for lenge siden jeg leste Datomic docs og kjapp googling gav ikke umiddelbart svaret. Det jeg håper å få “gratis” fra Datomic er svaret på slikt som “hva var min favorittrett 2020.09.11 12:00:02" uten å måtte finne siste endring av attributtet før det tidspunktet. Verdiene attributtet har har hatt i et tidsrom er også av interesse.

mokr16:09:50

Så er jeg usikker på om jeg er avhengig av tx-tid eller domene-tid for å kunne svare på det

augustl17:09:14

det du beskriver høres ut som database-tid, ja

augustl17:09:22

Datomic kan svare på "når sa du X til databasen"

augustl17:09:32

og "i hvilken rekkefølge skjedde ting i databasen"

augustl17:09:01

er jo et klassisk "time series"-problem dette her. Skulle Datomic støttet noe annet, måtte man ha bygget databasen på nytt fra punktet du ønsker å sette inn, ingen vei utenom

augustl17:09:19

nå husker jeg ikke hva jeg skjønte var ulempen med Crux.... hadde en a-ha-opplevelse en gang som jeg har glemt

augustl17:09:26

ah, nemlig. Crux er ikke relasjonell 🙂

augustl17:09:47

eller, relasjonell er feil ord, for datomic er vel ikke relasjonell.. Men, crux har ikke noe for "ting som peker på annen ting"

😱 3
emil0r17:09:54

Dokument db

augustl17:09:54

det må du fikse sjæl eventuelt (integritet, ...)

emil0r17:09:15

Den har inte schema

augustl17:09:19

nei, nemlig

emil0r17:09:42

Ibland vad man vill ha, ofta inte

emil0r17:09:05

Graph db med. Vilket är intressent

augustl17:09:02

hmm, var ikke klar over det - så du har muligheten for "ting som peker på ting"?

emil0r17:09:23

Du kan ha refs till ett annat dokument, och det kan sökas i en oändlig kedja ner som en graf

augustl17:09:36

ah, nemlig, men du kan ikke referere til verdier i et dokument?

emil0r17:09:51

Men du har inte relations som exempelvis neo4j

emil0r17:09:27

Jo. Värden, men ett värde kan också vara en ref

emil0r17:09:11

Så du kan köra en query som letar sig neråt i grafen av dokument

augustl17:09:23

ah, så da er det noe "peker-greier" ihvertfall

augustl17:09:32

men du kan sikkert peke på ting som ikke finnes og sånn, da?

emil0r17:09:05

Hmmm... Lite osäker på vad du menar med pekar på

augustl17:09:37

i Datomic så kan en fact peke på en annen fact - og du får ikke lov til å peke på en fact som ikke finnes

augustl17:09:46

og fjerner du den ene, fjerner du den andre

emil0r17:09:06

Tror nog inte det är så strikt

emil0r17:09:09

Crux is a document-oriented database that makes your data available for graph-like Datalog queries without the need for an upfront schema.

emil0r17:09:40

Från vad juxt skriver

emil0r17:09:58

Så I huvudsak dokument

augustl18:09:19

ja, ikke sant

augustl18:09:26

du gjør vel typisk en "PUT" på hele dokumentet?