Gomorron!
Morn morn!
Gomorron
Gomorron
God morgon
God morgon! Inspirerad av genomgången av Elixir på Func Prog Sthlm bad jag AI om hjälp att bygga en liten watchdog för HTTP-endpoints, typ som Pingdom. Jag bad den explicit om en applikation som kan hot-reloadas. Jag kan nu köra den på två olika Raspberry PI som står på olika ställen och då de saknar extern IP-adress låter de två BEAM-VM:arna kommunicera över https://www.dumbpipe.dev/. I Elixir/Erlang/OTP-plattformen finns en supervisor som har någon en slags leader election-mekanism inbyggd, så att om maskinen som råkar köra supervisorn går ner kommer den andra att ta över. För en watchdog-funktion är det förstås perfekt. Det är kanske lite orättvist att jämföra ett språk som är speciellt byggt för exakt den här typen av funktionalitet (ffa processmigrering, hotswap och distribuerade meddelandeköer) men i Clojure känns det verkligen som att byggstenarna ligger där utspridda och väntar på att sättas ihop. Naturligtvis vore det möjligt att koda något som noggrannt laddade om funktioner och namespaces utan att förstöra körande processer, och även se till att det går att roll-backa. Det är klart det skulle gå att få till även i Clojure/JVM! Jag fick också intrycket att vissa funktioner, tex skicka e-mail med SMTP, är betydligt mer rimligt implementerade än den uppsjö av olika och åldrande bibliotek java-ekosystemet har. Inspirerande! Och missa heller inte http://Dumbpipe.dev, det är egentligen ett rust-bibliotek, iroh, som till stora delar bygger på QUIC (HTTP/3) med NAT-punching och grejer som med hjälp av mycket enkla reläservrar gör att det går att upprätta förbindelser mellan maskiner som inte har öppna serverportar mot Internet. Dumb pipe är bara en socket, men det finns olika typer av pub-sub, kv-stores och allt möjligt.
Kollat något på EFL?
Tack för bra pekare! Ska prova om min fantastika app (tm) går att porta till clojerl! EFL - har förstås hört talas om men inte tänkt på förrän nu. Kanske inte är så dumt det heller. Men allra helst hade jag förstås velat komma lite närmre en OTP-konstruktion i vanlig JVM-clojure. Om man tittar på detta insomnade project: https://github.com/rixmann/clojure.otp/blob/master/src/clojure/otp/gen_fsm.clj ser man till exempel att själva funktionsdefinitionerna påminner mycket om konstruktionerna i core.async.flow, även om flow är mindre flexibelt än erlang (grafen är statisk när nätverket startas upp)
Liten uppdatering: clojerl stöder OTP 27, men senaste är OTP 29 som har förändrat hanteringen av regex, så det kompilerar inte på den senare plattformen. Dessutom saknar den pattern-matchning för funktionsdefinitionerna, vilket tappar lite syftet. Det finns en pattern-matchande funktionskonstruktion i clojure.core.match som man kanske kunde använda... LFE har stöd för pattern matching i sina funktionsdefinitioner så det är bra!
Hmm. Ändra regex så att gammal kod inte fungerar... Rich Hickey prata väl endel om att pattern matching är complecting i Simple made easy eller liknande. Klart man håller sig borta från pattern matching då 😆
pattern matching... att fläta samman destructuring och conditionals, tror jag det var
Testar att köra LFE på mitt vibe-konto. Ser ut som att det numera funkar rätt bra.
ja, LFE fungerar väldigt bra i Claude. Jag är fortfarande lite förvånad över hur enkla vissa problem blir med erlangs arkitektur.
Jag har inte provat på väldigt länge. Men Akka eller Pekko, ger kanske liknande känsla på JVM?
Dust och Actor4J kanske är modernare..
Behöver man inte mer än vara det för att matcha OTP?
Det är svårt att matcha... Jag tänkte mer om man sitter i Clojure... och helt plötsligt känner behov av actor... Det är ju fortfarande delat globalt minne osv. Virtual threads tar oss en bit.
virtual thread stannar bara på IO, inte preemptive osv såklart..
Morrn