2026/06/28

2026-06-28 00:00:17 +0000tv(~tv@user/tv) tv
2026-06-28 00:01:46 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
2026-06-28 00:01:53 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 271 seconds)
2026-06-28 00:06:43 +0000 <jreicher> schuelermine: my preferred alternative to any given terminal emulator is to not use a terminal emulator at all.
2026-06-28 00:12:20 +0000lisbeths(uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2026-06-28 00:12:22 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 00:17:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-06-28 00:24:20 +0000fgarcia(~lei@user/fgarcia) (Ping timeout: 245 seconds)
2026-06-28 00:24:52 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-06-28 00:24:52 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection)
2026-06-28 00:25:17 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-06-28 00:26:25 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-06-28 00:26:51 +0000fgarcia(~lei@user/fgarcia) (Max SendQ exceeded)
2026-06-28 00:27:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 00:32:59 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-06-28 00:33:19 +0000fgarcia(~lei@user/fgarcia) (Max SendQ exceeded)
2026-06-28 00:34:36 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 00:39:23 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-06-28 00:45:45 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 00:50:17 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-06-28 01:01:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 01:03:27 +0000nattkyrro(~serenity@user/nattkyrro) (Ping timeout: 258 seconds)
2026-06-28 01:05:24 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
2026-06-28 01:05:33 +0000nattkyrro(~serenity@user/nattkyrro) nattkyrro
2026-06-28 01:09:50 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection)
2026-06-28 01:14:00 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-06-28 01:16:30 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 01:18:33 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) (Ping timeout: 248 seconds)
2026-06-28 01:21:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 266 seconds)
2026-06-28 01:21:36 +0000peterbecich(~Thunderbi@71.84.33.135) peterbecich
2026-06-28 01:26:11 +0000 <schuelermine> jreicher: by that, do you mean a linux VT console?
2026-06-28 01:28:48 +0000 <monochrom> I'm "progressive" and I say that if you don't use terminal emulators then you use pure GUI. >:)
2026-06-28 01:29:21 +0000 <monochrom> Even "I use smart phones, what is terminal emulator? what even is computer?" >:)
2026-06-28 01:31:05 +0000 <geekosaur> apple beat you to that one
2026-06-28 01:31:41 +0000 <monochrom> Yeah I am plagiarizing from that Apple ad!
2026-06-28 01:31:52 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 01:33:55 +0000acidjnk_new(~acidjnk@p200300d6e74def0343353b3983e3e743.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2026-06-28 01:34:33 +0000acidjnk(~acidjnk@p200300d6e74def0343353b3983e3e743.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
2026-06-28 01:36:25 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-06-28 01:39:10 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-06-28 01:44:09 +0000 <fgarcia> i've met windows and macos users who think linux is terminal only ._.
2026-06-28 01:44:49 +0000DetourNetworkUK(DetourNetw@user/DetourNetworkUK) (Read error: Connection reset by peer)
2026-06-28 01:46:31 +0000DetourNetworkUK(DetourNetw@user/DetourNetworkUK) DetourNetworkUK
2026-06-28 01:47:08 +0000 <monochrom> Not surprised. Extremists are the most vocal and representative, as always.
2026-06-28 01:47:14 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 01:47:40 +0000 <monochrom> Conversely linux users think windows and mac users are fisher toy players.
2026-06-28 01:48:17 +0000 <monochrom> There was a time I thought that GUI users were illiterate. >:)
2026-06-28 01:51:42 +0000ft(~ft@p3e9bc08f.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
2026-06-28 01:51:55 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-06-28 01:53:32 +0000ft(~ft@p4fc2a1a4.dip0.t-ipconnect.de) ft
2026-06-28 02:02:37 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 02:05:04 +0000op_4(~tslil@user/op-4/x-9116473) (Remote host closed the connection)
2026-06-28 02:05:42 +0000op_4(~tslil@user/op-4/x-9116473) op_4
2026-06-28 02:08:44 +0000 <jreicher> schuelermine: No, I use an Emacs buffer
2026-06-28 02:09:20 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-06-28 02:09:54 +0000 <jreicher> Basically it becomes just plain text there and back. No fancy display instructions.
2026-06-28 02:14:25 +0000 <EvanR> I knew people who think linux is terminal only and thus "DOS"
2026-06-28 02:14:31 +0000ft(~ft@p4fc2a1a4.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2026-06-28 02:18:02 +0000 <fgarcia> though if i do start carrying a laptop around, i kind of want to install Q4OS on it. i think that's the one that has the windows theme haha
2026-06-28 02:19:33 +0000 <EvanR> I vaguely recall a win95 theme for icewm
2026-06-28 02:19:56 +0000 <EvanR> a minor riot
2026-06-28 02:20:39 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 02:21:11 +0000 <monochrom> icewm and a couple of others IIRC
2026-06-28 02:25:25 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 02:25:31 +0000ft(~ft@p3e9bcc41.dip0.t-ipconnect.de) ft
2026-06-28 02:26:15 +0000schuelermine(~Thunderbi@user/schuelermine) (Remote host closed the connection)
2026-06-28 02:29:29 +0000td_(~td@2001:9e8:19c4:7400:bf7f:cb56:94b:5d2b) (Ping timeout: 244 seconds)
2026-06-28 02:30:19 +0000ft(~ft@p3e9bcc41.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2026-06-28 02:31:13 +0000td_(~td@i53870910.versanet.de)
2026-06-28 02:31:20 +0000 <monochrom> But no DeriveBiFunctor :(
2026-06-28 02:33:16 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 02:33:16 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) (Quit: Leaving...)
2026-06-28 02:36:02 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 02:37:24 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-06-28 02:40:41 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-06-28 02:42:06 +0000 <EvanR> DeriveEveryImaginableFunctorVariant
2026-06-28 02:45:51 +0000m(~travltux@user/travltux) (Ping timeout: 246 seconds)
2026-06-28 02:51:25 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 02:56:06 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 03:06:13 +0000ft(~ft@p3e9bc5a3.dip0.t-ipconnect.de) ft
2026-06-28 03:06:48 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 03:07:00 +0000tusko(~uwu@user/tusko) (Remote host closed the connection)
2026-06-28 03:07:17 +0000tusko(~uwu@user/tusko) tusko
2026-06-28 03:07:29 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) (Remote host closed the connection)
2026-06-28 03:07:40 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) yanmaani
2026-06-28 03:07:51 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) (Remote host closed the connection)
2026-06-28 03:08:01 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) yanmaani
2026-06-28 03:09:14 +0000ttybitnik(~ttybitnik@user/wolper) (Quit: Fading out...)
2026-06-28 03:11:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-06-28 03:12:53 +0000ft(~ft@p3e9bc5a3.dip0.t-ipconnect.de) (Ping timeout: 244 seconds)
2026-06-28 03:15:04 +0000ft(~ft@p3e9bcc2e.dip0.t-ipconnect.de) ft
2026-06-28 03:21:28 +0000ft(~ft@p3e9bcc2e.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2026-06-28 03:21:48 +0000ft(~ft@p3e9bc453.dip0.t-ipconnect.de) ft
2026-06-28 03:22:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 03:26:27 +0000ft(~ft@p3e9bc453.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2026-06-28 03:26:31 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 03:26:54 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 03:27:34 +0000ft(~ft@p3e9bcc51.dip0.t-ipconnect.de) ft
2026-06-28 03:33:27 +0000ft(~ft@p3e9bcc51.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2026-06-28 03:35:19 +0000ft(~ft@p3e9bc90f.dip0.t-ipconnect.de) ft
2026-06-28 03:37:32 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 03:38:49 +0000m(~travltux@user/travltux) travltux
2026-06-28 03:40:06 +0000ft(~ft@p3e9bc90f.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2026-06-28 03:40:52 +0000ft(~ft@p4fc2a1bf.dip0.t-ipconnect.de) ft
2026-06-28 03:44:20 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-06-28 03:53:39 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 03:56:35 +0000 <janus> how many haskell compilers are currently under development besides ghc?
2026-06-28 03:57:21 +0000 <janus> i can think of superstar64/Hazy, microHS, secret fork of jhc, bhc (the ai slop one)
2026-06-28 03:57:56 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 247 seconds)
2026-06-28 03:58:35 +0000 <janus> the prorprietary bank one doesn't count because it is strict :P
2026-06-28 04:01:33 +0000 <janus> oh and then there is Ben Lynn's, and orionsj's fork of it
2026-06-28 04:01:42 +0000 <janus> and roconnor also is working on something similar
2026-06-28 04:09:03 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 04:11:51 +0000Guest29(~Guest29@8.130.95.189)
2026-06-28 04:13:03 +0000Guest91(~Guest91@8.130.84.107)
2026-06-28 04:13:14 +0000Guest57(~Guest57@8.130.95.189)
2026-06-28 04:13:39 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-06-28 04:13:39 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 04:15:18 +0000Guest57(~Guest57@8.130.95.189) (Client Quit)
2026-06-28 04:15:29 +0000Guest29(~Guest29@8.130.95.189) (Client Quit)
2026-06-28 04:15:30 +0000Guest91(~Guest91@8.130.84.107) (Client Quit)
2026-06-28 04:16:38 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 04:16:39 +0000spew(~spew@user/spew) (Quit: nyaa~)
2026-06-28 04:24:26 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 04:29:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-06-28 04:34:35 +0000[dpk](~dpk@jains.nonceword.org)
2026-06-28 04:34:38 +0000mstruebing_(~mstruebin@ns343649.ip-188-165-193.eu)
2026-06-28 04:35:38 +0000noctux1(~noctux@user/noctux) noctux
2026-06-28 04:35:39 +0000Arsen(16abab341f@gentoo/developer/managarm.dev.Arsen) (Ping timeout: 265 seconds)
2026-06-28 04:35:39 +0000lxsameer(~lxsameer@Serene/lxsameer) (Ping timeout: 265 seconds)
2026-06-28 04:35:39 +0000ent(entgod@kapsi.fi) (Ping timeout: 265 seconds)
2026-06-28 04:35:40 +0000noctuks(IbgdqiR86O@user/noctux) (Ping timeout: 265 seconds)
2026-06-28 04:35:40 +0000mstruebing(~mstruebin@ns343649.ip-188-165-193.eu) (Ping timeout: 265 seconds)
2026-06-28 04:35:40 +0000dpk(~dpk@jains.nonceword.org) (Ping timeout: 265 seconds)
2026-06-28 04:36:17 +0000lxsameer(~lxsameer@Serene/lxsameer) lxsameer
2026-06-28 04:39:26 +0000ent(entgod@kapsi.fi) ent
2026-06-28 04:39:48 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 04:42:26 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 248 seconds)
2026-06-28 04:44:29 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 04:48:55 +0000dolio(~dolio@130.44.140.168) (Ping timeout: 245 seconds)
2026-06-28 04:49:58 +0000dolio(~dolio@130.44.140.168) dolio
2026-06-28 04:50:29 +0000Arsen(16abab341f@gentoo/developer/managarm.dev.Arsen) Arsen
2026-06-28 04:52:43 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 04:55:11 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 04:59:23 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 243 seconds)
2026-06-28 05:02:52 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 276 seconds)
2026-06-28 05:10:35 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 05:17:49 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 276 seconds)
2026-06-28 05:27:28 +0000Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2026-06-28 05:27:53 +0000Sgeo(~Sgeo@user/sgeo) Sgeo
2026-06-28 05:28:45 +0000merijn(~merijn@62.45.136.136) merijn
2026-06-28 05:33:18 +0000merijn(~merijn@62.45.136.136) (Ping timeout: 265 seconds)
2026-06-28 05:38:00 +0000karenw(~karenw@user/karenw) (Remote host closed the connection)
2026-06-28 05:39:56 +0000karenw(~karenw@user/karenw) karenw
2026-06-28 05:44:04 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 05:48:48 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 05:52:46 +0000pyooque(~puke@user/puke) puke
2026-06-28 05:52:46 +0000pukeGuest7225
2026-06-28 05:52:46 +0000pyooquepuke
2026-06-28 05:53:34 +0000Guest7225(~puke@user/puke) (Read error: Connection reset by peer)
2026-06-28 05:54:40 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 05:57:28 +0000 <jaror> janus: Helium still got some commits two years ago.
2026-06-28 05:59:02 +0000tromp(~textual@2001:1c00:340e:2700:dd19:dfa1:d2a9:f5b7)
2026-06-28 05:59:35 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 275 seconds)
2026-06-28 06:10:03 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 06:14:52 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 06:17:33 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 06:18:37 +0000haritz(~hrtz@user/haritz) (Quit: ZNC 1.8.2+deb3.1+deb12u1 - https://znc.in)
2026-06-28 06:25:25 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 06:26:17 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 248 seconds)
2026-06-28 06:29:14 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 06:29:56 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
2026-06-28 06:33:54 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 256 seconds)
2026-06-28 06:36:22 +0000tusko(~uwu@user/tusko) (Remote host closed the connection)
2026-06-28 06:40:46 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 06:41:37 +0000tusko(~uwu@user/tusko) tusko
2026-06-28 06:45:18 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 243 seconds)
2026-06-28 06:47:05 +0000machinedgod(~machinedg@d108-173-95-19.abhsia.telus.net) (Ping timeout: 248 seconds)
2026-06-28 06:47:56 +0000tromp(~textual@2001:1c00:340e:2700:dd19:dfa1:d2a9:f5b7) (Quit: My iMac has gone to sleep. ZZZzzz…)
2026-06-28 06:50:41 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Remote host closed the connection)
2026-06-28 06:50:57 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 06:51:55 +0000traxex(traxex@user/traxex) traxex
2026-06-28 06:55:40 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 07:01:01 +0000tt12316070197800(~tt1231@2603:6010:8700:4a81:a4f6:acff:fe95:3803) (Quit: The Lounge - https://thelounge.chat)
2026-06-28 07:02:15 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-06-28 07:03:03 +0000tt12316070197800(~tt1231@2603:6010:8700:4a81:a4f6:acff:fe95:3803) tt1231
2026-06-28 07:09:09 +0000wootehfoot(~wootehfoo@user/wootehfoot) wootehfoot
2026-06-28 07:11:15 +0000berke93_(~default@193.108.195.249)
2026-06-28 07:14:11 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 07:15:00 +0000tromp(~textual@2001:1c00:340e:2700:dd19:dfa1:d2a9:f5b7)
2026-06-28 07:15:49 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 07:16:46 +0000takuan(~takuan@d8D86B9E9.access.telenet.be)
2026-06-28 07:18:05 +0000peterbecich(~Thunderbi@71.84.33.135) (Ping timeout: 245 seconds)
2026-06-28 07:21:34 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 07:24:37 +0000tzh(~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz)
2026-06-28 07:32:13 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 07:32:43 +0000ski(~ski@31-208-30-55.cust.bredband2.com) (Ping timeout: 264 seconds)
2026-06-28 07:33:35 +0000ski(~ski@31-208-30-55.cust.bredband2.com)
2026-06-28 07:36:10 +0000[dpk]dpk
2026-06-28 07:36:41 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-06-28 07:47:35 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 07:49:42 +0000ss4(~wootehfoo@user/wootehfoot) wootehfoot
2026-06-28 07:51:59 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-06-28 07:52:48 +0000ss4(~wootehfoo@user/wootehfoot) (Client Quit)
2026-06-28 07:53:30 +0000wootehfoot(~wootehfoo@user/wootehfoot) (Ping timeout: 245 seconds)
2026-06-28 07:56:42 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 08:02:39 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 08:04:08 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 08:07:18 +0000wootehfoot(~wootehfoo@user/wootehfoot) wootehfoot
2026-06-28 08:11:23 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 252 seconds)
2026-06-28 08:13:17 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 08:14:46 +0000divlamir(~divlamir@user/divlamir) (Read error: Connection reset by peer)
2026-06-28 08:14:52 +0000divlamir_(~divlamir@user/divlamir) divlamir
2026-06-28 08:15:32 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 08:15:43 +0000divlamir_divlamir
2026-06-28 08:17:42 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
2026-06-28 08:28:40 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 08:30:33 +0000Digit(~user@user/digit) (Read error: Connection reset by peer)
2026-06-28 08:33:15 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-06-28 08:38:12 +0000karenw(~karenw@user/karenw) (Ping timeout: 252 seconds)
2026-06-28 08:43:57 +0000hayhaystack(~husshpupp@user/husshpuppy) husshpuppy
2026-06-28 08:44:02 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 08:48:34 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-06-28 08:51:02 +0000acidjnk_new(~acidjnk@p200300d6e74def039d5a069af2df0e93.dip0.t-ipconnect.de)
2026-06-28 08:51:12 +0000acidjnk(~acidjnk@p200300d6e74def039d5a069af2df0e93.dip0.t-ipconnect.de) acidjnk
2026-06-28 08:51:35 +0000Googulator52(~Googulato@80-95-87-76.pool.digikabel.hu) (Quit: Client closed)
2026-06-28 08:51:37 +0000rubin55(sid666180@id-666180.ilkley.irccloud.com) rubin55
2026-06-28 08:52:00 +0000Googulator52(~Googulato@80-95-87-76.pool.digikabel.hu)
2026-06-28 08:54:55 +0000Digit(~user@user/digit) Digit
2026-06-28 08:55:16 +0000lynxx_(~lynxx_@2001:9e8:3bf4:6d00:7c69:8855:c9f5:ce3b)
2026-06-28 08:55:46 +0000lynxx_(~lynxx_@2001:9e8:3bf4:6d00:7c69:8855:c9f5:ce3b) (Client Quit)
2026-06-28 08:56:52 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 276 seconds)
2026-06-28 08:57:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-06-28 08:58:17 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 09:03:15 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 272 seconds)
2026-06-28 09:04:41 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-06-28 09:28:33 +0000Digit(~user@user/digit) (Read error: Connection reset by peer)
2026-06-28 09:29:21 +0000Digit`(~user@195.144.208.46.dyn.plus.net)
2026-06-28 09:33:55 +0000poscat(~poscat@user/poscat) (Remote host closed the connection)
2026-06-28 09:34:34 +0000ski(~ski@31-208-30-55.cust.bredband2.com) (Ping timeout: 276 seconds)
2026-06-28 09:34:58 +0000traxex(traxex@user/traxex) (Ping timeout: 265 seconds)
2026-06-28 09:36:58 +0000poscat(~poscat@user/poscat) poscat
2026-06-28 09:37:54 +0000berke93_(~default@193.108.195.249) (Remote host closed the connection)
2026-06-28 09:38:19 +0000berke93_(~default@193.108.195.249)
2026-06-28 09:40:41 +0000ski(~ski@31-208-30-55.cust.bredband2.com)
2026-06-28 09:41:15 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Ping timeout: 265 seconds)
2026-06-28 09:45:23 +0000__monty__(~toonn@user/toonn) toonn
2026-06-28 09:45:26 +0000ski(~ski@31-208-30-55.cust.bredband2.com) (Ping timeout: 256 seconds)
2026-06-28 09:46:43 +0000 <unworriedsafari> is it me or is hackage.haskell.org slow at the moment?
2026-06-28 09:47:32 +0000 <jaror> It's fine for me now (just browsing the packages)
2026-06-28 09:48:00 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 09:48:09 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 09:50:17 +0000 <unworriedsafari> ok it's alright again here as well
2026-06-28 10:09:30 +0000tcard__(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Quit: Leaving)
2026-06-28 10:21:24 +0000ski(~ski@31-208-30-244.cust.bredband2.com)
2026-06-28 10:30:59 +0000wootehfoot(~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
2026-06-28 10:32:04 +0000karenw(~karenw@user/karenw) karenw
2026-06-28 10:34:23 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 252 seconds)
2026-06-28 10:34:27 +0000berke93__(~default@82.166.36.177)
2026-06-28 10:36:37 +0000berke93_(~default@193.108.195.249) (Read error: Connection reset by peer)
2026-06-28 10:37:38 +0000berke93___(~default@193.108.195.249)
2026-06-28 10:39:20 +0000ft(~ft@p4fc2a1bf.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2026-06-28 10:41:18 +0000berke93__(~default@82.166.36.177) (Ping timeout: 244 seconds)
2026-06-28 10:41:48 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 10:51:12 +0000Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2026-06-28 10:51:27 +0000ft(~ft@p508db997.dip0.t-ipconnect.de) ft
2026-06-28 10:56:39 +0000ft(~ft@p508db997.dip0.t-ipconnect.de) (Ping timeout: 265 seconds)
2026-06-28 10:57:20 +0000ft(~ft@p3e9bc25c.dip0.t-ipconnect.de) ft
2026-06-28 11:02:51 +0000ft(~ft@p3e9bc25c.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2026-06-28 11:08:52 +0000ft(~ft@p3e9bccce.dip0.t-ipconnect.de) ft
2026-06-28 11:09:04 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-06-28 11:10:45 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 11:11:05 +0000puke(~puke@user/puke) (Read error: Connection reset by peer)
2026-06-28 11:11:22 +0000puke(~puke@user/puke) puke
2026-06-28 11:26:00 +0000skum(~skum@user/skum) skum
2026-06-28 11:31:14 +0000Lord_of_Life_(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 11:32:07 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 264 seconds)
2026-06-28 11:33:13 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
2026-06-28 11:34:06 +0000Lord_of_Life_Lord_of_Life
2026-06-28 11:35:01 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 11:35:56 +0000Digit`(~user@195.144.208.46.dyn.plus.net) (Ping timeout: 256 seconds)
2026-06-28 11:43:55 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 276 seconds)
2026-06-28 11:44:45 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 11:50:15 +0000Digit(~user@user/digit) Digit
2026-06-28 11:58:08 +0000tremon(~tremon@83-80-159-219.cable.dynamic.v4.ziggo.nl) tremon
2026-06-28 12:11:53 +0000weary-traveler(~user@user/user363627) user363627
2026-06-28 12:14:54 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 12:16:23 +0000fp(~Thunderbi@178-133-117-157.mobile.vf-ua.net) fp
2026-06-28 12:18:58 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Read error: Connection reset by peer)
2026-06-28 12:20:28 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 12:21:26 +0000 <fp> So I've been trying to get my head around how =IO= works, so I decided that I would try making a basic implementation of it with Rust. How far, at the high level, is what I'm doing from what Haskell does? https://paste.rs/SIL3v.rs
2026-06-28 12:22:31 +0000 <fp> Of course, mine uses Rust std to do I/O instead of syscalls, but I'm interested in if the interface I've made is basically similar
2026-06-28 12:23:12 +0000 <mauke> can't be right
2026-06-28 12:23:51 +0000 <mauke> IO::ret(s).bind(|s| { ... }) is pointless; could just { ... } directly
2026-06-28 12:24:15 +0000 <mauke> (because 'return x >>= f' is 'f x')
2026-06-28 12:25:37 +0000 <fp> Sure, but I have to fake it a bit since I'm not interested in implementing the low level IO
2026-06-28 12:25:49 +0000 <mauke> fp: main = let { x :: IO (); x = putStrLn "hi" } in print (length [x, x, x, x, x]) >> x >> x
2026-06-28 12:26:08 +0000 <mauke> if you do the equivalent thing in rust, what does it output?
2026-06-28 12:26:38 +0000 <mauke> let me guess at the syntax
2026-06-28 12:28:06 +0000 <mauke> fn main() { let x = put_str_ln("hi"); print(???).bind(|_| { x.bind(|_| { x }) }); }
2026-06-28 12:28:10 +0000 <mauke> not sure about lists
2026-06-28 12:28:48 +0000 <mauke> actually, we can do better
2026-06-28 12:29:22 +0000 <mauke> main = let { x :: IO (); x = putStrLn "hi" } in print (length [putStrLn "a", putStrLn "b", putStrLn "c"]) >> x >> x
2026-06-28 12:30:02 +0000 <mauke> the correct output is "3\nhi\nhi\n"
2026-06-28 12:30:23 +0000 <fp> For the first one, it's "hi\n5hi\nhi"
2026-06-28 12:30:24 +0000 <mauke> I suspect yours would give "hi\na\nb\nc\n"
2026-06-28 12:31:33 +0000 <fp> But actually I had to cheat with the first one. I couldn't reuse the x variable for the two >>s, so I rewrote put_str_ln("hi")
2026-06-28 12:32:31 +0000rensenwxre(~fwam@user/fwam) fwam
2026-06-28 12:33:03 +0000 <fp> So without the cheat, it would've said "hi\n5\n"
2026-06-28 12:35:12 +0000weary-traveler(~user@user/user363627) (Quit: Konversation terminated!)
2026-06-28 12:35:48 +0000weary-traveler(~user@user/user363627) user363627
2026-06-28 12:39:34 +0000 <fp> > I suspect yours would give "hi\na\nb\nc\n"
2026-06-28 12:39:34 +0000 <fp> Yeah, or "hi\na\nb\nc3", but close enough
2026-06-28 12:39:35 +0000 <lambdabot> Data constructor not in scope:
2026-06-28 12:39:35 +0000 <lambdabot> I :: t0 -> t1 -> t2 -> t3 -> String -> tVariable not in scope: suspectVari...
2026-06-28 12:43:30 +0000 <fp> So I guess I need to make a structure of closures and run it with an explicit command, like Io::ret(...).bind(...).run(). But Rust doesn't make that easy...
2026-06-28 12:45:32 +0000 <mauke> I don't know rust, but I just prototyped it in perl: https://pt.gayr.at/p/akEXWseeFyQMI20qKUFlL479SHI
2026-06-28 12:46:08 +0000 <mauke> (no 'print' because we're taking advantage of perl's implicit 'show')
2026-06-28 12:47:36 +0000Pozyomka(~pyon@user/pyon) (Quit: test)
2026-06-28 12:51:16 +0000Pozyomka(~pyon@user/pyon) pyon
2026-06-28 12:52:59 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) bitdex
2026-06-28 12:53:05 +0000fp(~Thunderbi@178-133-117-157.mobile.vf-ua.net) (Ping timeout: 256 seconds)
2026-06-28 12:54:47 +0000traxex(traxex@user/traxex) traxex
2026-06-28 12:58:26 +0000fp(~Thunderbi@46-133-26-225.mobile.vf-ua.net) fp
2026-06-28 13:00:03 +0000 <fp> mauke: Ok yeah that's basically what I tried at first. Unfortunately, Rust makes extending the lifetime of a capturing closure a major PITA
2026-06-28 13:00:57 +0000 <fp> Maybe if I bring in a garbage collector it'll be easier, but I'm not sure it's possible to implement this otherwise
2026-06-28 13:01:15 +0000 <tomsmeding> fp: wrap everything everywhere in Rc<>?
2026-06-28 13:01:33 +0000 <tomsmeding> then as long as you don't create cycles, you get a "GC" like Haskell has
2026-06-28 13:03:25 +0000 <fp> I guess if I force users to put everything they want returned into an Rc first, that could work
2026-06-28 13:04:26 +0000 <tomsmeding> you're trying to simulate a language that's maximally-YOLO with memory management (pure Haskell) in one that's unusually precise about memory management
2026-06-28 13:06:59 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-06-28 13:07:19 +0000 <tomsmeding> fp: "struct Io<T>(T);" "/// A computation that, when performed, does some I/O before returning a value of type `T`."
2026-06-28 13:07:23 +0000 <tomsmeding> where's the computation? This is just a T
2026-06-28 13:08:10 +0000 <tomsmeding> try `struct Io<T>(Fn() -> T);`
2026-06-28 13:08:25 +0000 <fp> Yes and that is the root of all evil
2026-06-28 13:08:41 +0000 <tomsmeding> because of lifetimes?
2026-06-28 13:08:51 +0000 <tomsmeding> add .clone() and Rc<> until it works
2026-06-28 13:09:09 +0000 <tomsmeding> lifetimes are 100% distracting from the mechanics of IO :p
2026-06-28 13:10:34 +0000 <fp> That actually doesn't work because Fn() -> T is a DST, so you need to Box (or just &, but I won't) it and use dyn, or use a function pointer (but that means capturing closures aren't allowed). And even with Rc and clone, you still run into lifetime issues
2026-06-28 13:11:45 +0000 <fp> like in `fn ret(t: Rc<T>) -> Io<T> { Io(Rc::new(|| t.clone())) }`, t doesn't have a long enough lifetime
2026-06-28 13:12:51 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 13:13:54 +0000 <tomsmeding> also not if you `move || t`?
2026-06-28 13:14:23 +0000 <tomsmeding> and yes my rust is rusty, add Box<> as necessary
2026-06-28 13:14:42 +0000 <fp> No, move doesn't work
2026-06-28 13:15:28 +0000 <tomsmeding> what precisely is the error? ret() owns t, right, so it should be able to move it into the closure
2026-06-28 13:16:23 +0000 <fp> Ultimately, my goal isn't to emulate Haskell per se, but to have a composable Io interface in Rust. For context, I'm testing this out to see if I could make an API for an industrial fieldbus this way
2026-06-28 13:16:34 +0000 <fp> "T may not live long enough"
2026-06-28 13:17:27 +0000 <tomsmeding> I think this experience is enough to show that Haskell's way of representing an IO computation -- using closures -- is not usable in Rust :p
2026-06-28 13:17:38 +0000 <fp> Yeah I'm seeing that
2026-06-28 13:17:46 +0000 <tomsmeding> you might have more luck with the free monad encoding
2026-06-28 13:18:06 +0000 <tomsmeding> hm, no that still has closures everywhere
2026-06-28 13:18:34 +0000 <fp> I guess building a stack machine might be more reasonable
2026-06-28 13:18:54 +0000 <tomsmeding> what Haskell's "IO" gives you is a data type for describing arbitrary side-effectful computations in a non-side-effectful language
2026-06-28 13:18:56 +0000 <tomsmeding> is that what you need?
2026-06-28 13:18:57 +0000 <fp> Or generally like an interpreter
2026-06-28 13:23:33 +0000 <fp> What I'm imagining is that a user can describe a complex IO action and that can be dispatched to the IO device or to a server that does the IO and they get back either the expected data or a rich error
2026-06-28 13:24:42 +0000 <tomsmeding> if you want to dispatch the IO computation to a device, and you describe IO like Haskell does, you'll need to also run arbitrary Rust code on the device
2026-06-28 13:24:52 +0000 <tomsmeding> and serialise, transfer and deserialise the closures
2026-06-28 13:25:23 +0000 <fp> Sure
2026-06-28 13:25:26 +0000 <tomsmeding> because an arbitrary IO action contains calls to primitive IO operations as well as "pure" glue code that decides what next action to take
2026-06-28 13:25:44 +0000 <hc> Hmm, not having read the backlog thoroughly, but isn't that pretty much what rust's async/"Futures" do? Wrap IO in closures?
2026-06-28 13:26:00 +0000 <hc> (Not that I'm saying I particularly like async rust)
2026-06-28 13:26:16 +0000 <tomsmeding> I feel like this is wrapping closures in IO instead of IO in closures
2026-06-28 13:26:50 +0000 <tomsmeding> fp: can you just dispatch a single primitive IO action to the device, or do you really need to dispatch a larger program?
2026-06-28 13:27:18 +0000 <tomsmeding> because then the first thing I'd think about is "what kind of computation, aside from the precise representation of the IO operations, can I run on this device"
2026-06-28 13:27:45 +0000 <tomsmeding> and what kind of computation do you actually want to run
2026-06-28 13:27:55 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Ping timeout: 276 seconds)
2026-06-28 13:27:57 +0000 <fp> That is a good question to ask, one that I should really consider
2026-06-28 13:28:10 +0000 <tomsmeding> an intermediate version that is much more feasible is defining a little language that you have an interpreter for on the device
2026-06-28 13:28:21 +0000 <tomsmeding> (I think you already suggested this)
2026-06-28 13:28:42 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 13:28:55 +0000 <tomsmeding> that means you have to also write the stuff in the .bind() closures in your little language, but the payoff is that the thing you send to the device, and what you execute there, is just a regular old data type
2026-06-28 13:29:05 +0000 <tomsmeding> which you can serde etc
2026-06-28 13:29:39 +0000 <tomsmeding> (I'm assuming "device" here is a separate piece of hardware that doesn't necessarily share a CPU architecture with the "main" computer)
2026-06-28 13:30:01 +0000berke93___(~default@193.108.195.249) (Ping timeout: 266 seconds)
2026-06-28 13:30:58 +0000 <fp> Yeah like I have some programs that are running with this fieldbus IO, but it's very timing sensitive, so I really need to move it to a different process (though same machine is probably fine). But then of course I have to develop a way to command IO actions of the other process, which is how I got here
2026-06-28 13:31:34 +0000 <fp> And also IO feels like magic sometimes and I wanted to understand it better
2026-06-28 13:31:53 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Read error: Connection reset by peer)
2026-06-28 13:33:09 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 13:33:10 +0000 <tomsmeding> if it's a different process on the same machine, I'd seriously consider if there is way to group your computations into "pre-made programs" that can be triggered by the commanding process as a whole
2026-06-28 13:33:22 +0000 <fp> The magic is less now, though lazy evaluation still feels crazy to me. That you can make a repl with =getContents >>= \contents -> putStrLn $ (unlines . map show . map eval . lines) contents= is bonkers
2026-06-28 13:33:48 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 256 seconds)
2026-06-28 13:34:19 +0000 <tomsmeding> as in, instead of constructing an IO computation in the commanding process and sending it over to the fieldbus process, look at your application and write a normal `fn` that does the whole thing, put it in a list of functions (with a name for each), and have the commanding process tell the fieldbus process to "now execute function abc"
2026-06-28 13:34:30 +0000 <tomsmeding> possibly with some serialised arguments
2026-06-28 13:34:54 +0000 <fp> Maybe yeah
2026-06-28 13:34:55 +0000 <tomsmeding> heh, yes that's fun
2026-06-28 13:35:25 +0000 <fp> Like there's no loop! my repl is a rep but it still works!
2026-06-28 13:35:33 +0000 <tomsmeding> lol
2026-06-28 13:36:05 +0000 <tomsmeding> that's lazy IO, though, not just lazy evaluation
2026-06-28 13:36:08 +0000 <mauke> map is a loop
2026-06-28 13:36:25 +0000 <tomsmeding> yeah but there's only one R and only one P, and the L is inside the E
2026-06-28 13:36:29 +0000 <tomsmeding> RE(L)P
2026-06-28 13:37:09 +0000 <fp> I guess I could simplify with map (show . eval)
2026-06-28 13:37:25 +0000 <tomsmeding> fp: that example relies on 'contents' being a pure value that, when you look at it, does some IO to give you the thing you're trying to read
2026-06-28 13:37:37 +0000 <tomsmeding> """pure"""
2026-06-28 13:37:53 +0000 <tomsmeding> that requires some unsafeInterleaveIO in getContents
2026-06-28 13:38:36 +0000 <fp> Yeah I tried digging into getContents to see what it does. Suffice to say I didn't understand what was going on
2026-06-28 13:39:00 +0000 <tomsmeding> if you have a simple implementation of getContents that just reads its input in IO as "normal", your REPL would be "read all input lines, then execute all of them"
2026-06-28 13:39:06 +0000 <tomsmeding> which is not a REPL and not nearly as magic
2026-06-28 13:39:28 +0000 <fp> That said, I did see RealWorld, which is cool.
2026-06-28 13:39:54 +0000 <tomsmeding> lazy evaluation means that a part of a value may not actually be computed yet; it's a thunk, i.e. a closure, that gets evaluated whenever you try to look at it
2026-06-28 13:39:56 +0000 <fp> Ok so getContents is magic in particular
2026-06-28 13:40:16 +0000 <tomsmeding> but that closure is a pure function, so you don't see it in the output (apart from being faster/slower/terminating)
2026-06-28 13:41:04 +0000 <tomsmeding> now if you do tricks to put a side effect inside a thunk, now suddenly you have pure code (that looks at the thunk and thus triggers its evaluation) that triggers IO
2026-06-28 13:41:09 +0000 <fp> So in another language, lazy evaluation might look like `var foo = { get() { compute_foo() } }`
2026-06-28 13:41:30 +0000 <fp> perhaps with memoization as well
2026-06-28 13:41:32 +0000 <tomsmeding> this means that what IO gets executed when depends on the evaluation order of your pure code, which normally is not allowed to happen in Haskell (because it makes reasoning extremely difficult)
2026-06-28 13:41:41 +0000 <tomsmeding> fp: yes, with memoisation, that's the point
2026-06-28 13:42:04 +0000 <tomsmeding> getContents returns a thunk that does IO when you look at it
2026-06-28 13:42:10 +0000 <tomsmeding> and it uses unsafeInterleaveIO to achieve that
2026-06-28 13:42:18 +0000 <fp> Wild
2026-06-28 13:42:34 +0000 <tomsmeding> this is called "lazy IO" and there is a decent fraction of Haskellers (though certainly not 100%) that believe lazy IO in Prelude was a bad idea
2026-06-28 13:42:58 +0000 <int-e> tbh "it's magic" is a good working theory
2026-06-28 13:43:03 +0000 <tomsmeding> because of its unexpected and unintuitive behaviour if you don't carefully track what's going on, or if you program doesn't look like the schoolbook examples that inspired lazy IO
2026-06-28 13:44:04 +0000 <jaror> lazy IO is especially bad if handles are involved, but otherwise I think it isn't much harder than normal file IO (which is already hard)
2026-06-28 13:44:25 +0000rainbyte(~rainbyte@181.47.219.31) (Read error: Connection reset by peer)
2026-06-28 13:44:32 +0000 <int-e> eh, it's convenient for programs of no importance (or programs that run in environments that don't fail ;-) )
2026-06-28 13:45:24 +0000 <int-e> if you actually care about when IO happens and you want to handle errors it turns very bad very quickly... well, or slowly, depending on the pace at which you consume the input
2026-06-28 13:45:30 +0000rainbyte(~rainbyte@181.47.219.31) rainbyte
2026-06-28 13:45:39 +0000 <tomsmeding> % System.Process.system "ls"
2026-06-28 13:45:39 +0000 <yahb2> entry.sh ; initdefs.hs ; Yahb2Defs.hs ; ExitSuccess
2026-06-28 13:45:43 +0000 <tomsmeding> % do { h <- openFile "initdefs.hs" ReadMode; s <- hGetContents h; hClose h; return s }
2026-06-28 13:45:44 +0000 <yahb2> *** Exception: initdefs.hs: hGetContents: illegal operation (delayed read on closed handle) ; ; HasCallStack backtrace: ; ioException, called at libraries/ghc-internal/src/GHC/Internal/IO/Handle...
2026-06-28 13:45:52 +0000 <fp> Oh I didn't think about IO errors with it
2026-06-28 13:46:02 +0000 <fp> that's gotta be funky
2026-06-28 13:46:08 +0000 <tomsmeding> why did that fail? Because the hGetContents did lazy IO and nothing actually happened until ghci tried to print s at the end, after hClose already happened
2026-06-28 13:46:34 +0000 <fp> Oh dear
2026-06-28 13:46:56 +0000 <c_wraith> I've got very mixed feelings, because I do like the convenience of lazy IO for one-off programs. But for anything complex, it makes things worse rather than helping.
2026-06-28 13:47:07 +0000 <tomsmeding> same as c_wraith here
2026-06-28 13:47:13 +0000 <int-e> hGetContents changes the handle into a weird "semi-closed" state that indicates that you don't know anymore whether it's open or closed
2026-06-28 13:47:21 +0000 <tomsmeding> it's great as a poor-man's streaming framework that is in Prelude
2026-06-28 13:47:33 +0000 <int-e> and prevents you from interfering with the ongoing lazy reads
2026-06-28 13:47:34 +0000 <tomsmeding> but then you actually try to do something non-trivial with it and it explodes in your face
2026-06-28 13:47:54 +0000 <fp> It's awfully neat that it makes repls a one-liner. Although I guess lisp has (loop (print (eval (read)))), so that's nothing new
2026-06-28 13:48:12 +0000 <int-e> Does this get more funky on Windows and mandatory file locking?
2026-06-28 13:48:22 +0000 <int-e> :t interact
2026-06-28 13:48:23 +0000 <lambdabot> (String -> String) -> IO ()
2026-06-28 13:48:30 +0000 <int-e> yeah
2026-06-28 13:48:40 +0000 <tomsmeding> forever (readLine >>= print . eval . read)
2026-06-28 13:49:10 +0000 <tomsmeding> forever (read <$> getLine >>= print . eval)
2026-06-28 13:49:17 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 13:49:26 +0000 <tomsmeding> LRPE, Haskell's REPL
2026-06-28 13:49:46 +0000 <fp> Fair enough
2026-06-28 13:50:06 +0000 <tomsmeding> I guess EPRL since REPL was also in reverse
2026-06-28 13:50:20 +0000 <c_wraith> :t readLn
2026-06-28 13:50:21 +0000 <lambdabot> Read a => IO a
2026-06-28 13:50:31 +0000 <tomsmeding> yeah sure
2026-06-28 13:50:41 +0000 <tomsmeding> forever (print . eval =<< readLn)
2026-06-28 13:50:46 +0000 <tomsmeding> here we go, a REPL
2026-06-28 13:50:53 +0000 <c_wraith> I don't like using Read as a command interface, though
2026-06-28 13:51:10 +0000 <tomsmeding> don't you like writing `Cmd "ls" []`?
2026-06-28 13:52:19 +0000 <c_wraith> it's not my favorite
2026-06-28 13:52:27 +0000 <int-e> . o O ( main = readLn >>= pure . eval >>= print >>= loop where loop = main )
2026-06-28 13:53:06 +0000 <int-e> or (<$>) eval so it's all punctuation?
2026-06-28 13:53:45 +0000 <int-e> . o O ( OoO = order of operations )
2026-06-28 13:53:57 +0000 <tomsmeding> readLn <&> eval >>= print >>= loop
2026-06-28 13:54:15 +0000 <tomsmeding> uh, >>loop
2026-06-28 14:08:11 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) (Ping timeout: 245 seconds)
2026-06-28 14:08:41 +0000yanmaani(~yanmaani@gateway/tor-sasl/yanmaani) yanmaani
2026-06-28 14:10:06 +0000 <jaror> Does anyone have a strong opinion on software forges?
2026-06-28 14:10:31 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 14:10:41 +0000 <jaror> It seems like github is the only place left that can provide some resistance to the ai scraper ddos
2026-06-28 14:11:46 +0000 <jaror> I guess that's a new advantage of Darcs: the bots don't know how to clone your repo :)
2026-06-28 14:17:00 +0000 <mauke> github is an ai scraper
2026-06-28 14:17:02 +0000 <tomsmeding> jaror: my cgit instance is doing fine, although that of course is _just_ git, no issues, PRs, etc.
2026-06-28 14:17:24 +0000 <mauke> quite happy with codeberg so far
2026-06-28 14:17:36 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 246 seconds)
2026-06-28 14:18:41 +0000 <jaror> mauks: yes, I agree, but the 93% uptime makes it hard to convince others.
2026-06-28 14:19:43 +0000haritz(~hrtz@2a01:4b00:bc2e:7000:d5af:a266:ca31:5ef8)
2026-06-28 14:19:43 +0000haritz(~hrtz@2a01:4b00:bc2e:7000:d5af:a266:ca31:5ef8) (Changing host)
2026-06-28 14:19:43 +0000haritz(~hrtz@user/haritz) haritz
2026-06-28 14:20:16 +0000 <jaror> mauke*
2026-06-28 14:21:06 +0000gmg(~user@user/gehmehgeh) (Ping timeout: 245 seconds)
2026-06-28 14:21:27 +0000 <jaror> tomsmeding: have you taken special precautions against scrapers?
2026-06-28 14:22:06 +0000 <jaror> I'm mainly asking because the situation with the GHC GitLab is getting critical.
2026-06-28 14:22:16 +0000gmg(~user@user/gehmehgeh) gehmehgeh
2026-06-28 14:22:38 +0000 <tomsmeding> zero
2026-06-28 14:22:48 +0000 <tomsmeding> Though maybe there just isn't enough on there!
2026-06-28 14:23:37 +0000 <tomsmeding> I don't know if they're spamming it, because I as a user of that VPS (also for other things) don't notice it :p
2026-06-28 14:27:21 +0000 <tomsmeding> jaror: are they getting through anubis?
2026-06-28 14:27:22 +0000 <fgarcia> i think something else people could try are hosting git and also using cloudflare or anubis
2026-06-28 14:28:16 +0000 <tomsmeding> and if so, do we have any idea if they just have a generic browser emulator or if they have special-cased code for anubis
2026-06-28 14:28:46 +0000 <tomsmeding> (in the latter case, hand-rolling a portal and changing it once in a while might help, but not in the former case)
2026-06-28 14:30:20 +0000 <jaror> It seems Anubis might be causing some of the issues, but yeah even with anubis the GitLab is slow sometimes.
2026-06-28 14:31:43 +0000 <tomsmeding> I think to diagnose this you'd need info from the server admins about what's going on in the server logs
2026-06-28 14:31:49 +0000 <jaror> Where "slow" means >10s response times
2026-06-28 14:32:02 +0000 <tomsmeding> what exactly is being spammed when the site is slow
2026-06-28 14:32:10 +0000 <tomsmeding> and by whom
2026-06-28 14:33:14 +0000 <jaror> The admins (mainly mangoiv) is aware and has tried a lot, but nothing seems to work very well.
2026-06-28 14:33:19 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Ping timeout: 264 seconds)
2026-06-28 14:33:29 +0000 <tomsmeding> right
2026-06-28 14:33:37 +0000 <tomsmeding> are we sure that the problem is that gitlab is slow?
2026-06-28 14:34:03 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 14:34:08 +0000 <tomsmeding> I wouldn't be surprised if the GHC gitlab is just spammed much more than git.tomsmeding.com, if only because there's more stuff on there to spam in the first place
2026-06-28 14:35:17 +0000 <tomsmeding> at some point, if there are enough requests, there's not much to do except blocking based on the sender of the request, which, with the botnets, is infeasible except for big centralised companies
2026-06-28 14:35:43 +0000 <jaror> That might be the case, but in the end it is unacceptably slow. GitHub and Codeberg do seem to manage better.
2026-06-28 14:36:18 +0000 <tomsmeding> it _is_ true that my experience with gitlab so far, also outside GHC's instance, has been "it's kinda slow"
2026-06-28 14:36:42 +0000 <tomsmeding> but that holds for github too, perhaps even more, though github probably has micro$oft resources for blocking bad actors
2026-06-28 14:37:12 +0000 <tomsmeding> the problem with the GHC gitlab is that you genuinely use a bunch of the features of gitlab, including and not limited to the wiki
2026-06-28 14:37:13 +0000 <jaror> For me it is ~10s per request but some other regularly have to wait minutes or even get errors.
2026-06-28 14:41:26 +0000fp(~Thunderbi@46-133-26-225.mobile.vf-ua.net) (Quit: fp)
2026-06-28 14:41:45 +0000fp(~Thunderbi@46-133-26-225.mobile.vf-ua.net) fp
2026-06-28 14:42:29 +0000 <tomsmeding> jaror: it's possible that forgejo is faster than gitlab, which would alleviate some of the pressure, but if it's just 2x as fast, that just postpones the problems until scraper volume doubles
2026-06-28 14:43:43 +0000 <tomsmeding> so if that's the case and codeberg is still much better off than the GHC gitlab, they must be doing some clever blocking
2026-06-28 14:45:45 +0000chromoblob(~chromoblo@user/chromob1ot1c) (Read error: Connection reset by peer)
2026-06-28 14:46:00 +0000fp(~Thunderbi@46-133-26-225.mobile.vf-ua.net) (Ping timeout: 245 seconds)
2026-06-28 14:46:10 +0000chromoblob(~chromoblo@user/chromob1ot1c) chromoblob\0
2026-06-28 14:47:55 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 14:53:00 +0000spew(~spew@user/spew) spew
2026-06-28 14:54:34 +0000 <jaror> Yeah, so the choices seem to be either Codeberg or GitHub. The latter seems more likely to survive better in the current landscape, but I'd hope codeberg can survive too.
2026-06-28 14:59:19 +0000 <spew> I use source hut
2026-06-28 15:00:40 +0000 <tomsmeding> even loading the banner photo on the anubis check page takes a long time
2026-06-28 15:00:46 +0000 <tomsmeding> is the server bandwidth-saturated or something
2026-06-28 15:04:40 +0000 <geekosaur> forgejo has a different version of the problem: I'm regularly hearing about it being down at times
2026-06-28 15:05:10 +0000 <tomsmeding> codeberg's forgejo instance, you mean? Or something else?
2026-06-28 15:09:31 +0000tromp(~textual@2001:1c00:340e:2700:dd19:dfa1:d2a9:f5b7) (Quit: My iMac has gone to sleep. ZZZzzz…)
2026-06-28 15:11:22 +0000 <geekosaur> codeberg, yeh. dunno about others, but I get the impression it works until it overloads completely
2026-06-28 15:19:30 +0000 <tomsmeding> did mangoiv write up anything about the observed issues, and what the bottlenecks / most painful routes seem to be?
2026-06-28 15:38:17 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 248 seconds)
2026-06-28 15:38:36 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 15:39:13 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 15:40:22 +0000__monty__(~toonn@user/toonn) (Quit: leaving)
2026-06-28 15:41:49 +0000emilym(~Thunderbi@user/emilym) (Remote host closed the connection)
2026-06-28 15:42:02 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 15:42:02 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 15:43:10 +0000machinedgod(~machinedg@d108-173-95-19.abhsia.telus.net) machinedgod
2026-06-28 15:46:12 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 273 seconds)
2026-06-28 15:47:31 +0000rscastilho2024_(rscastilho@user/rscastilho2024-:23901) rscastilho2024_
2026-06-28 15:49:39 +0000szkl(uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
2026-06-28 16:01:43 +0000 <jaror> tomsmeding: I don't think so. Maybe it would indeed be good to first see if rhe issue is really unfixable.
2026-06-28 16:13:31 +0000ystael(~ystael@user/ystael) (Ping timeout: 264 seconds)
2026-06-28 16:20:57 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:21:23 +0000 <tomsmeding> my alternative irc log viewer now has a view that compresses joins/parts (click "Compressed"): https://tirclogv.tomsmeding.com/log/haskell
2026-06-28 16:21:49 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:23:05 +0000Alex_delenda_est(~al_test@85.174.180.46) (Ping timeout: 245 seconds)
2026-06-28 16:23:30 +0000AlexZenon(~alzenon@85.174.180.46) (Ping timeout: 245 seconds)
2026-06-28 16:23:38 +0000 <monochrom> nice
2026-06-28 16:24:43 +0000AlexNoo(~AlexNoo@85.174.180.46) (Ping timeout: 276 seconds)
2026-06-28 16:25:22 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:25:46 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:25:58 +0000 <tomsmeding> I'm kinda planning to nuke https://ircbrowse.tomsmeding.com out of orbit and put this new thing in place. I don't think too much is lost. Does anyone disagree?
2026-06-28 16:26:26 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:26:46 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:27:29 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:28:02 +0000AlexZenon(~alzenon@178.34.151.183)
2026-06-28 16:28:15 +0000Ikosit8(~Ikosit@user/ikosit) (Quit: The Lounge - https://thelounge.chat)
2026-06-28 16:30:02 +0000 <EvanR> looks pretty good
2026-06-28 16:30:10 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:30:13 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 252 seconds)
2026-06-28 16:31:06 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:31:14 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:31:39 +0000Ikosit8(~Ikosit@user/ikosit) Ikosit
2026-06-28 16:31:46 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:31:48 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:32:21 +0000gmg(~user@user/gehmehgeh) (Ping timeout: 245 seconds)
2026-06-28 16:32:21 +0000tusko(~uwu@user/tusko) (Ping timeout: 245 seconds)
2026-06-28 16:32:47 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:33:29 +0000emilym(~Thunderbi@user/emilym) emilym
2026-06-28 16:34:22 +0000tusko(~uwu@user/tusko) tusko
2026-06-28 16:34:31 +0000 <tomsmeding> (it even has old freenode logs back to the mists of time!)
2026-06-28 16:34:58 +0000gmg(~user@user/gehmehgeh) gehmehgeh
2026-06-28 16:35:25 +0000 <tomsmeding> > Right now I'm using mostly Windows with Hugs 98 on my laptop.
2026-06-28 16:35:27 +0000 <tomsmeding> beautiful
2026-06-28 16:35:30 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:36:02 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:36:26 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:37:06 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:37:08 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:37:39 +0000 <EvanR> it's like piecing together ancient egyptian scrolls
2026-06-28 16:37:52 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:38:01 +0000 <EvanR> and it's an excel spreadsheet
2026-06-28 16:38:14 +0000 <monochrom> Highly red-shifted past records >:)
2026-06-28 16:38:37 +0000 <tomsmeding> well fixing up the tunes.org logs to actually be valid irc logs took a bit of massaging yes
2026-06-28 16:39:22 +0000 <tomsmeding> "I'm kind of excited about haskell because it's small"
2026-06-28 16:39:46 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 248 seconds)
2026-06-28 16:40:12 +0000weary-traveler(~user@user/user363627) (Quit: Konversation terminated!)
2026-06-28 16:40:28 +0000weary-traveler(~user@user/user363627) user363627
2026-06-28 16:40:50 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:41:10 +0000[_________](~oos95GWG@user/oos95GWG) (Quit: [_________])
2026-06-28 16:41:22 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:41:46 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:42:26 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:42:28 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:43:04 +0000[_________](~oos95GWG@user/oos95GWG) oos95GWG
2026-06-28 16:43:12 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:44:42 +0000califax(~califax@user/califx) (Remote host closed the connection)
2026-06-28 16:46:10 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:46:42 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:46:44 +0000 <EvanR> small user base? small language? small compiler?
2026-06-28 16:46:48 +0000 <EvanR> small stdlib?
2026-06-28 16:46:59 +0000 <tomsmeding> well "small stdlib" is relative
2026-06-28 16:47:08 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:47:36 +0000 <tomsmeding> EvanR: https://tirclogv.tomsmeding.com/log/fn-haskell-old?eid=a4fictRBH#ev-a4fictRBH
2026-06-28 16:47:46 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:47:51 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:48:31 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 16:48:34 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:49:30 +0000 <EvanR> this guy sounds like a plan9 disciple who got split off from the group
2026-06-28 16:50:27 +0000 <EvanR> I see the premonition of 2000s era obsession with replacing file trees with a search database
2026-06-28 16:50:43 +0000 <EvanR> before it all went to the cloud and isn't on your machine anyway
2026-06-28 16:50:52 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 16:51:30 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:52:02 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:52:25 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:53:06 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:53:08 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:53:52 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 16:54:01 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 16:55:46 +0000califax(~califax@user/califx) califx
2026-06-28 16:56:44 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 16:56:50 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:57:22 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:57:46 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 16:58:26 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 16:58:28 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 16:59:12 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 17:02:10 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:02:42 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:03:06 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 17:03:46 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:03:49 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 17:04:33 +0000AlexNoo__(~AlexNoo@178.34.151.183)
2026-06-28 17:05:07 +0000tusko(~uwu@user/tusko) (Remote host closed the connection)
2026-06-28 17:05:21 +0000tusko(~uwu@user/tusko) tusko
2026-06-28 17:07:30 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:08:02 +0000AlexNoo_(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:08:25 +0000AlexNoo(~AlexNoo@178.34.151.183)
2026-06-28 17:08:43 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 17:08:49 +0000nek0(~nek0@user/nek0) (Quit: The Lounge - https://thelounge.chat)
2026-06-28 17:09:06 +0000AlexNoo__(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:09:08 +0000skylord5816(~skylord58@user/skylord5816) (Ping timeout: 256 seconds)
2026-06-28 17:09:29 +0000AlexNoo_(~AlexNoo@178.34.151.183)
2026-06-28 17:11:07 +0000peterbecich(~Thunderbi@71.84.33.135) peterbecich
2026-06-28 17:12:50 +0000AlexNoo(~AlexNoo@178.34.151.183) (Ping timeout: 248 seconds)
2026-06-28 17:12:51 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 17:14:04 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 17:16:46 +0000pavonia(~user@user/siracusa) (Quit: Bye!)
2026-06-28 17:18:42 +0000nek0(~nek0@user/nek0) nek0
2026-06-28 17:18:56 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 17:24:10 +0000 <monochrom> Haskell was small back then in 2001. They were not wrong. :)
2026-06-28 17:26:19 +0000 <monochrom> I am still a bit annoyed by directory trees because, for my past and present course material, both "cscc24/2025" and "2025/cscc24" are wrong.
2026-06-28 17:27:35 +0000 <dcb> in a different timeline, instead of `grep` you `sql`
2026-06-28 17:27:50 +0000 <monochrom> The only up side is that I get an assignment question out of it. :) https://www.cs.utoronto.ca/~trebla/CSCB09-2026-Summer/a1/cscb09-2026-5-a1.pdf
2026-06-28 17:27:58 +0000tzh(~tzh@c-76-115-131-146.hsd1.or.comcast.net)
2026-06-28 17:28:55 +0000 <monochrom> I'm already using sqlite3 in shell scripts! I store student {name, number, email, login} in sqlite. Then a shell script to look up by name etc.
2026-06-28 17:30:16 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 245 seconds)
2026-06-28 17:32:40 +0000AlexNoo_AlexNoo
2026-06-28 17:33:11 +0000Alex_delenda_est(~al_test@178.34.151.183)
2026-06-28 17:35:10 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 17:35:36 +0000 <dcb> even for indexing arbitrarily large text files, say, for a plaintext personal knowledge management system?
2026-06-28 17:37:12 +0000 <monochrom> I haven't done that. Probably will never do. I just have a hundred small files, one per topic, and hoping that looking at the filenames reminds me where to find something.
2026-06-28 17:38:01 +0000 <monochrom> But I have been known to use my brain to index 200 books so it's fine.
2026-06-28 17:38:37 +0000ttybitnik(~ttybitnik@user/wolper) ttybitnik
2026-06-28 17:38:49 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 17:40:17 +0000fp(~Thunderbi@89-27-10-140.bb.dnainternet.fi) fp
2026-06-28 17:40:35 +0000skylord5816(~skylord58@user/skylord5816) skylord5816
2026-06-28 17:41:09 +0000 <monochrom> I don't even mind sqlite3 performing linear-time exhaustive search. (I didn't tell it to index any column.) I have only 200 students at most, computers are fast.
2026-06-28 17:41:27 +0000 <monochrom> The reason I use it though is because nothing else has join.
2026-06-28 17:41:47 +0000 <monochrom> (I mean generally "it" = relational.)
2026-06-28 17:42:54 +0000 <monochrom> I said {name, number, email, login} but annoyingly the university gave me two files: {name, number, email} and {name, number, login}. I needed a join.
2026-06-28 17:44:16 +0000 <monochrom> And down the road there will be {login, a1 marks, a2 marks} that eventually need to be merged back to student records.
2026-06-28 17:45:32 +0000tromp(~textual@2001:1c00:340e:2700:dd19:dfa1:d2a9:f5b7)
2026-06-28 17:45:45 +0000 <tomsmeding> monochrom: using sqlite for that is actually a pretty neat idea. I've been doing this stuff using csv files and some shell wrangling and some hand-written tooling, which has the definite upside that my text editor is just as capable at inspecting and editing stuff as the command line is
2026-06-28 17:45:56 +0000 <tomsmeding> that kind of breaks when everything is in a database file
2026-06-28 17:46:57 +0000 <monochrom> We can have the best of both worlds. It is not wrong to: 1. sqlite -> csv; 2. edit; 3. csv -> sqlite. :)
2026-06-28 17:47:06 +0000 <tomsmeding> I've been mulling on a more general tool to do join-like stuff (but tailored to dumb university stuff where e.g. every student has 2 student IDs and sometimes you need the one and sometimes the other, and very occasionally neither are valid) on csv files but I stopped needing it before it got built
2026-06-28 17:47:17 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 17:47:28 +0000 <monochrom> or even 1. csv -> sqlite; 2. join; 3. sqlite -> csv.
2026-06-28 17:47:40 +0000 <tomsmeding> Right. But also being able to recursively grep for a student ID in a directory tree gives me their CSV entries as well as their submitted assignment files. :)
2026-06-28 17:47:58 +0000 <tomsmeding> yeah, that second pathway may be the one, but then that also feels weird
2026-06-28 17:48:02 +0000piranezi(~piranezi@user/maxnetyaga) (Ping timeout: 248 seconds)
2026-06-28 17:48:10 +0000 <monochrom> I wrote my own haskell program for "read 2 csv's, join, output csv" but it is clunky to use.
2026-06-28 17:48:11 +0000piranezi2(~piranezi@user/maxnetyaga) maxnetyaga
2026-06-28 17:48:30 +0000fgarcia(~lei@user/fgarcia) (Ping timeout: 245 seconds)
2026-06-28 17:49:22 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 17:49:45 +0000 <darkling> There's already: join (1) - join lines of two files on a common field
2026-06-28 17:50:03 +0000 <geekosaur> sadly csv in the wild is often too complex for it
2026-06-28 17:50:04 +0000 <darkling> Although I have done the sqlite trick a few times for more complicated pipelines.
2026-06-28 17:50:13 +0000 <monochrom> Fragile in the face of real csv.
2026-06-28 17:50:47 +0000 <monochrom> "The Great, Monochrom",10011101,monochrom
2026-06-28 17:51:02 +0000 <tomsmeding> darkling: where is the option to consider ',' the field delimiter?
2026-06-28 17:51:04 +0000 <darkling> There's a set of csv tools too that mirror grep/cut/sort/join and a few others but handle CSVs properly.
2026-06-28 17:51:08 +0000 <geekosaur> you forgot embedding quotes in the first field
2026-06-28 17:51:08 +0000 <tomsmeding> oh, -t
2026-06-28 17:51:29 +0000 <tomsmeding> fortunately my CSVs didn't have quotes
2026-06-28 17:51:32 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-06-28 17:52:27 +0000 <darkling> Ah, yes, csvkit
2026-06-28 17:56:39 +0000 <monochrom> Nice csvsql
2026-06-28 17:58:14 +0000 <monochrom> The quotes in my example is really CSV quotes. My first column is the strong: The Great, Monochrom
2026-06-28 17:58:23 +0000 <monochrom> s/strong/string/
2026-06-28 18:05:12 +0000 <monochrom> "I was writing sensible CSV tools in Haskell. Then I downloaded csvkit and switched to Python." >:)
2026-06-28 18:11:32 +0000 <EvanR> tomsmeding, though if you're just reading using shell scripts and hacks, sqlite dumps to text pretty easily
2026-06-28 18:11:44 +0000 <EvanR> modifying the database is another story
2026-06-28 18:11:50 +0000 <tomsmeding> yeah you're right
2026-06-28 18:12:20 +0000 <EvanR> it also dumps to google sheets pretty easily, by setting the field separator to tab
2026-06-28 18:12:29 +0000 <EvanR> instead of |
2026-06-28 18:13:27 +0000 <EvanR> LIFE HAXX
2026-06-28 18:14:14 +0000 <monochrom> I didn't know of csvkit so I adopted sqlite3. If you start now, you may as well go for csvkit, especially since it can still bridge to sql if one day you need it.
2026-06-28 18:16:15 +0000 <EvanR> "csv" is a lie. A,B,"C,D",E four values not 5!
2026-06-28 18:17:14 +0000 <monochrom> Ah you're picking on the name?
2026-06-28 18:17:31 +0000 <monochrom> All "meaningful" names from programmers are lies.
2026-06-28 18:17:45 +0000 <monochrom> In Unix, listen(2) does not listen.
2026-06-28 18:20:43 +0000 <tomsmeding> there has also been a suggestion to separate fields using unicode characters instead. After all, those don't appear in data, do they? https://github.com/sixarm/usv
2026-06-28 18:21:49 +0000 <darkling> We should never have stopped using FS, GS, RS and US ASCII codes. :)
2026-06-28 18:22:08 +0000 <darkling> 28-31 https://en.wikipedia.org/wiki/C0_and_C1_control_codes
2026-06-28 18:23:12 +0000 <EvanR> those ascii controls are what's not used in data xD
2026-06-28 18:23:13 +0000 <EvanR> use those
2026-06-28 18:23:28 +0000 <EvanR> FS literally field separator
2026-06-28 18:23:44 +0000 <dolio> My meaningful names are accurate.
2026-06-28 18:23:58 +0000 <dolio> Go look in the ermine codebase and tell me the `unfurl` function doesn't unfurl.
2026-06-28 18:24:17 +0000 <monochrom> Yeah sqlite offers to use FS etc.
2026-06-28 18:37:30 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 18:40:52 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 18:45:20 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 18:46:51 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 18:51:27 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
2026-06-28 18:56:47 +0000Everything(~Everythin@static.208.206.21.65.clients.your-server.de) Everything
2026-06-28 18:59:01 +0000ski(~ski@31-208-30-244.cust.bredband2.com) (Ping timeout: 265 seconds)
2026-06-28 19:00:24 +0000ski(~ski@31-208-30-29.cust.bredband2.com)
2026-06-28 19:06:48 +0000ski(~ski@31-208-30-29.cust.bredband2.com) (Ping timeout: 270 seconds)
2026-06-28 19:08:31 +0000ski(~ski@31-208-30-244.cust.bredband2.com)
2026-06-28 19:14:08 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 19:15:35 +0000Sgeo(~Sgeo@user/sgeo) Sgeo
2026-06-28 19:15:51 +0000CiaoSen(~Jura@2a02:3100:5d91:a300:4e50:ddff:fe9b:8922) CiaoSen
2026-06-28 19:25:16 +0000gmg(~user@user/gehmehgeh) (Ping timeout: 245 seconds)
2026-06-28 19:27:32 +0000gmg(~user@user/gehmehgeh) gehmehgeh
2026-06-28 19:34:31 +0000vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 276 seconds)
2026-06-28 19:39:45 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-06-28 19:40:29 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 19:45:19 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 245 seconds)
2026-06-28 19:49:07 +0000weary-traveler(~user@user/user363627) (Quit: Konversation terminated!)
2026-06-28 19:49:31 +0000weary-traveler(~user@user/user363627) user363627
2026-06-28 20:02:49 +0000karenw(~karenw@user/karenw) (Ping timeout: 245 seconds)
2026-06-28 20:03:01 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-06-28 20:04:59 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-06-28 20:16:07 +0000rscastilho2024_(rscastilho@user/rscastilho2024-:23901) (Remote host closed the connection)
2026-06-28 20:16:09 +0000CiaoSen(~Jura@2a02:3100:5d91:a300:4e50:ddff:fe9b:8922) (Ping timeout: 252 seconds)