gchristensen changed the topic of #nixos-borg to: https://www.patreon.com/ofborg https://monitoring.nix.ci/dashboard/db/ofborg?refresh=10s&orgId=1&from=now-1h&to=now "I get to skip reviewing the PHP code and just wait until it is rewritten in something sane, like POSIX shell. || https://logs.nix.samueldr.com/nixos-borg
<MichaelRaskin> Let's start with simple stuff…
<MichaelRaskin> >(x : (x x)) (x: (x x))
<{^_^}> error: stack overflow (possible infinite recursion)
<Dezgeg> >builtins.unsafeGetAttrPos "abort" builtins
<{^_^}> (no output)
<infinisil> > builtins.nixVersion
<{^_^}> "2.0"
<MichaelRaskin> >(x: y: (x y x)) (x: y: (x y x))
<{^_^}> <LAMBDA>
<infinisil> It's lazy though, so that might prevent it from working :)
<MichaelRaskin> >(x: y: (x y x)) (x: y: (x y x)) (x: y: (x y x))
<{^_^}> error: stack overflow (possible infinite recursion)
<MichaelRaskin> >pkgs.texlive
<{^_^}> { "12many" = <CODE>; "2up" = <CODE>; Asana-Math = <CODE>; ESIEEcv = <CODE>; FAQ-en = <CODE>; GS1 = <CODE>; HA-prosper = <CODE>; IEEEconf = <CODE>; IEEEtran = <CODE>; MemoirChapStyles = <CODE>; SIstyle
<Dezgeg> >pkgs.path
<{^_^}> /nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source
<MichaelRaskin> > (f: s: (f f (s + s + s))) (f: s: (f f (s + s + s))) " "
<{^_^}> error: stack overflow (possible infinite recursion)
<ekleog> > builtins.readFile /etc/machine-id
<{^_^}> access to path '/etc/machine-id' is forbidden in restricted mode
<MichaelRaskin> > "${/etc/passwd}"
<{^_^}> access to path '/etc/passwd' is forbidden in restricted mode
<infinisil> Heh, that would be pretty bad
<MichaelRaskin> I would only get the hash
<infinisil> Ah yeah
* ekleog had tried to look for a not-too-bad-if-inadvertently-leaked file :°
<MichaelRaskin> Of a file without even the hashes of the passwords
<infinisil> Yeah
<ekleog> > builtins.readDir /etc
<{^_^}> access to path '/etc' is forbidden in restricted mode
<MichaelRaskin> Hopefully the bot user has not access to shadow
<infinisil> Why is it named /etc/passwd honestly, if passwords are actually in /etc/shadow
<MichaelRaskin> > "<pkgs>"
<{^_^}> "<pkgs>"
<MichaelRaskin> Because it took more than one try to remove hashes from publically-readable file
<MichaelRaskin> > "${<nixpkgs>}"
<{^_^}> file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I), at [1m(string)[0m:7:12
<MichaelRaskin> > pkgs.source
<{^_^}> attribute 'source' missing, at [1m(string)[0m:7:9
<MichaelRaskin> > pkgs.pat
<infinisil> > nixpkgs
<{^_^}> attribute 'pat' missing, at [1m(string)[0m:7:9
<{^_^}> "/nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source"
<MichaelRaskin> >/nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source
<{^_^}> /nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source
<infinisil> pkgs is defined as import nixpkgs {}, and nixpkgs as builtins.fetchTarball "github master.."
<MichaelRaskin> > "" + nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source
<{^_^}> access to path '/nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source' is forbidden in restricted mode
<infinisil> Seems pretty safe to me :)
<MichaelRaskin> > builtins.map (x: (tryEval (__getAttr x pkgs).outPath)) (builtins.attrNames pkgs)
<{^_^}> [31;1merror:[0m undefined variable 'tryEval' at [1m(string)[0m:7:27
<ekleog> > pkgs.libreoffice
<{^_^}> { __ignoreNulls = true; all = <CODE>; args = <CODE>; bash = <CODE>; buildCommand = <CODE>; buildInputs = <CODE>; builder = <CODE>; configureFlags = <CODE>; dbus = <CODE>; depsBuildBuild = <CODE>; deps
<ekleog> > "${pkgs.libreoffice}"
<{^_^}> "/nix/store/4wfzfrwxiyw5w4s3mjl0ykp0rjmnlb0f-libreoffice-5.4.6.2"
<infinisil> >_show = x: if builtins.isAttrs x && x ? type && type == "derivation" then x.outPath else x
<{^_^}> [31;1merror:[0m undefined variable 'type' at [1m(string)[0m:2:50
<infinisil> >_show = x: if builtins.isAttrs x && x ? type && x.type == "derivation" then x.outPath else x
<{^_^}> _show defined
<infinisil> >pkgs.libreoffice
<{^_^}> "/nix/store/4wfzfrwxiyw5w4s3mjl0ykp0rjmnlb0f-libreoffice-5.4.6.2"
<MichaelRaskin> > builtins.fetchurl { url="https://nixos.org/";}
<{^_^}> access to URI 'https://nixos.org/' is forbidden in restricted mode
<ekleog> > builtins.fetchgit { url = "https://github.com/Ekleog/ofborg"; }
<{^_^}> attribute 'fetchgit' missing, at [1m(string)[0m:7:9
<ekleog> > builtins.fetchGit { url = "https://github.com/Ekleog/ofborg"; }
<{^_^}> access to URI 'https://github.com/Ekleog/ofborg' is forbidden in restricted mode
<ekleog> > builtins.filterSource (_: true) /etc
<{^_^}> access to path '/etc' is forbidden in restricted mode
<MichaelRaskin> > let f = s: s + s; g = f: x: if __isString x then f x else g (y: (f x y)); in g f f f f f f f f f f f f f f "123"
<{^_^}> cannot coerce a function to a string, at [1m(string)[0m:7:20
<MichaelRaskin> Oops
<ekleog> > import /etc/nixos/configuration.nix
<{^_^}> access to path '/etc/nixos/configuration.nix' is forbidden in restricted mode
<ekleog> > builtins.pathExists /etc/passwd
<{^_^}> false
<ekleog> > builtins.pathExists /etc/machine-id
<{^_^}> false
<ekleog> > builtins.pathExists /etc/machi
<{^_^}> false
<ekleog> … you said it was OK to crash your bot, right?
<MichaelRaskin> let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f "123"))))))))))))
<ekleog> > builtins.genList (x: x) 4000000000
<infinisil> ekleog: Go for it
<{^_^}> [31;1merror:[0m out of memory
<infinisil> :O
<ekleog> oh it didn't :D
<MichaelRaskin> > let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f "123"))))))))))))
<{^_^}> "1231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231231
<infinisil> Ah
<MichaelRaskin> >let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f (f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f("1234")))))))))))))))))))))))))))))
<ekleog> oh, I guess I just tried a too big one-at-a-time alloc
<{^_^}> [31;1merror:[0m out of memory
<ekleog> > builtins.genList (_: builtins.genList (_: builtins.genList (x: x) 65536) 65536) 65536
<{^_^}> [ <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <C
<infinisil> > let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f (f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f("1234")))))))))))))))))))))))))))))
<{^_^}> [31;1merror:[0m out of memory
<infinisil> Damn
<ekleog> > builtins.genList (_: builtins.genList (_: builtins.genList (_: builtins.genList (x: x) 65536) 65536) 65536) 65536
<{^_^}> [ <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <CODE> <C
<ekleog> oh yeah laziness bites me
<infinisil> It actually does take all of my server's RAM
<samueldr> would ulimit help?
<MichaelRaskin> You mean, with OOM of random processes?
<ekleog> I guess nix returns the OOM error when malloc fails?
<samueldr> yeah
<ekleog> and maybe the OOM killer waits a bit, and evaluation ends before the OOM starts killing stuff
<ekleog> so spamming OOM-ing commands may be… fun :°
<samueldr> though, it looks like, from a quick reading, that ulimit won't help with some classes of memory uses
<infinisil> > 1 + 2
<{^_^}> 3
<infinisil> > let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f (f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f("1234")))))))))))))))))))))))))))))
<{^_^}> (no output)
<infinisil> Huh
<infinisil> What I did was set serviceConfig.MemoryMax = "200M"
<MichaelRaskin> let f = x: x + x + x; g = f: x: f(f(f(f(x)))); in g g g g g g g f "123";
<MichaelRaskin> > let f = x: x + x + x; g = f: x: f(f(f(f(x)))); in g g g g g g g f "123";
<{^_^}> [31;1merror:[0m syntax error, unexpected ';', expecting ')', at [1m(string)[0m:7:80
<infinisil> I did somewhat limit it at first, but then swap got all taken eventually
<MichaelRaskin> >let f = x: x + x + x; g = f: x: f(f(f(f(x))))); in g g g g g g g f "123";
<{^_^}> [31;1merror:[0m syntax error, unexpected ')', expecting ';', at [1m(string)[0m:7:54
<MichaelRaskin> let f = x: x + x + x; g = f: x: f(f(f(f(x)))); in g g g g g g g f "123"
<MichaelRaskin> >let f = x: x + x + x; g = f: x: f(f(f(f(x)))); in g g g g g g g f "123";
<{^_^}> [31;1merror:[0m syntax error, unexpected ';', expecting ')', at [1m(string)[0m:7:80
<MichaelRaskin> >let f = x: x + x + x; g = f: x: f(f(f(f(x)))); in g g g g g g g f "123"
<{^_^}> error: stack overflow (possible infinite recursion)
<infinisil> But why did that operation take so long when I supposedly limited it to 3 secs :/
<ekleog> > let l = builtins.genList (_: l) 65536; deref = l: deref (builtins.elemAt l 0); in deref l
<{^_^}> error: stack overflow (possible infinite recursion)
<infinisil> > eatmyram = let f = x: x + x; in f (f (f (f (f (f(f(f(f(f(f(f(f (f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f("1234")))))))))))))))))))))))))))))
<{^_^}> eatmyram defined
<ekleog> > let l = builtins.genList (_: l) 6553600; deref = l: deref (builtins.elemAt l 0); in deref l
<{^_^}> error: stack overflow (possible infinite recursion)
<infinisil> >eatmyram
<infinisil> swap going up
<infinisil> swap going up/down
<infinisil> almost empty
<{^_^}> (no output)
<infinisil> Yeah it just uses swap :/
<ekleog> > let l = [l l]; deref = l: deref (builtins.elemAt l 0); in deref l
<{^_^}> error: stack overflow (possible infinite recursion)
* ekleog wonders why strings work better than lists at eating all the ram
<ekleog> > let f = x: x ++ x; in f (f (f (f (f (f(f(f(f(f(f(f(f (f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f([1 2 3 4])))))))))))))))))))))))))))))
<MichaelRaskin> Because lists are allocated one cons cell at a time, and strings are C++ strings with some optimistic assumptions?
<ekleog> oh it looks like it's just that I'm trying to be clever (whom I'm not), and it miserably fails
<{^_^}> (no output)
<ekleog> s/it miserably fails/I miserably fail at it/
<ekleog> infinisil: oh, I guess for your 3s limit it doesn't take into account kernel time?
<infinisil> Haha oh no
<ekleog> all the time is in malloc, so… :)
<MichaelRaskin> malloc is mostly userspace fragment placing algorithm
<MichaelRaskin> > "${./.}"
<{^_^}> access to path '/' is forbidden in restricted mode
<MichaelRaskin> > pkgs.lib.mapAttrs (x: x.pkgs) pkgs.texlive
<{^_^}> { "12many" = <CODE>; "2up" = <CODE>; Asana-Math = <CODE>; ESIEEcv = <CODE>; FAQ-en = <CODE>; GS1 = <CODE>; HA-prosper = <CODE>; IEEEconf = <CODE>; IEEEtran = <CODE>; MemoirChapStyles = <CODE>; SIstyle
<infinisil> I guess I'll just make it timeout hard after 3 seconds
<ekleog> MichaelRaskin: when swapping I'm not sure userspace allocation matters :)
<MichaelRaskin> Ah right, swap
<MichaelRaskin> > pkgs.tptp
<MichaelRaskin> > 1
* ekleog just disabled the swap after one too many crash of x11
<{^_^}> 1
<infinisil> Huh
<MichaelRaskin> > pkgs.hello
<{^_^}> "/nix/store/6mab2znnw7j96k3vsdw9vyckady29r46-hello-2.10"
<infinisil> > pkgs.tptp
<MichaelRaskin> > pkgs.tptp
<MichaelRaskin> It's actually not completely free and marked unfree in Nixpkgs
<infinisil> Oh
<infinisil> How it currently works: takeLastLineOf (if exitCode == 0 then stdout else stderr)
<MichaelRaskin> Technically, redistribution is only allowed verbatim (in whole or in parts), so patching the script interpreter paths makes the output undistributable
<infinisil> But it should output "(no output)" when there's no output :/
<infinisil> > pkgs = import nixpkgs { config.allowUnfree = true; }
<{^_^}> pkgs defined
<infinisil> > pkgs.tptp
<{^_^}> "/nix/store/8xp1whqrbj3fsgdwhbmrk8qrkdkc6njk-TPTP-7.1.0"
<infinisil> Oh great
<MichaelRaskin> Wait a minute
<MichaelRaskin> > pkgs = {}
<{^_^}> pkgs defined
<MichaelRaskin> > pkgs.hello
<{^_^}> attribute 'hello' missing, at [1m(string)[0m:8:9
<MichaelRaskin> It is the same bot across channels, right?
<infinisil> #bottest currently runs my dev version
<MichaelRaskin> > nixpkgs
<{^_^}> "/nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source"
<infinisil> the state of channels is separate
<MichaelRaskin> nixpkgs = "/etc/passwd"
<MichaelRaskin> > import nixpkgs
<{^_^}> <LAMBDA>
<MichaelRaskin> > nixpkgs
<{^_^}> "/nix/store/bfv9yv20q43q85ymzps9qlmhm8q19kcr-source"
<MichaelRaskin> > nixpkgs = "/etc/passwd"
<{^_^}> nixpkgs defined
<MichaelRaskin> > import nixpkgs
<{^_^}> access to path '/etc/passwd' is forbidden in restricted mode
<infinisil> >:l pkgs
<{^_^}> imported scope
<MichaelRaskin> > pkgs
<{^_^}> { }
<infinisil> > pkgs
<{^_^}> { }
<infinisil> > import nixpkgs {}
<{^_^}> access to path '/etc/passwd' is forbidden in restricted mode
<infinisil> > import
<{^_^}> <PRIMOP-APP>
<infinisil> > <nixpkgs>
<{^_^}> file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I), at [1m(string)[0m:9:9
<infinisil> >:u
<infinisil> It's currently cloning nixpkgs
<infinisil> (still going..)
<infinisil> Why is this taking so long, gosh
<infinisil> >pkgs=import <nixpkgs> {}
<{^_^}> pkgs defined
<infinisil> >pkgs
<{^_^}> getting status of '/var/lib/nixbot/state/nixpkgs/default.nix': No such file or directory
<{^_^}> Updated nixpkgs
<infinisil> Whew finally, only took 34 minutes..
<infinisil> >pkgs
<{^_^}> { }
<infinisil> >import <nixpkgs> {}
<{^_^}> { AAAAAASomeThingsFailToEvaluate = <CODE>; AMB-plugins = <CODE>; AgdaSheaves = <CODE>; AgdaStdlib = <CODE>; CoinMP = <CODE>; DisnixWebService = <CODE>; EBTKS = <CODE>; EmptyEpsilon = <CODE>; Fabric =
<infinisil> > pkgs = import <nixpkgs> {}
<{^_^}> pkgs defined
<infinisil> >builtins.readFile <nixpkgs/.git/HEAD>
<{^_^}> "ref: refs/heads/master\n"
<infinisil> >builtins.readFile <nixpkgs/.git/refs/heads/master>
<{^_^}> "2b499afa63f01473a19c7166c1f3750fa45a1bab\n"
<infinisil> > rev = builtins.readFile <nixpkgs/.git/refs/heads/master>
<{^_^}> rev defined
orivej has quit [Ping timeout: 260 seconds]
MichaelRaskin has quit [Quit: MichaelRaskin]
<Mic92_> > 1 / 0
<{^_^}> division by zero, at [1m(string)[0m:10:9
<ekleog> > /foo/bar
<{^_^}> /foo/bar
<ekleog> > /part
<{^_^}> /part
<infinisil> Ohhh, the reason it took so long is because i have CPU usage limited to 10% :)
<infinisil> > 1+1
<infinisil> Seems to have stopped at 12:00
<infinisil> >1+1
<{^_^}> 2
<infinisil> I'll look into fixing that today
<sphalerite> >let f = x: f (x+1) in f 0
<{^_^}> [31;1merror:[0m syntax error, unexpected IN, expecting ';', at [1m(string)[0m:10:28
<sphalerite> >let f = x: f (x+1); in f 0
<{^_^}> error: stack overflow (possible infinite recursion)
<sphalerite> >builtins.readFile /etc/passwd
<{^_^}> access to path '/etc/passwd' is forbidden in restricted mode
<sphalerite> aww :p
orivej has joined #nixos-borg
Willi_Butz_ has joined #nixos-borg
infinisil_ has joined #nixos-borg
Willi_Butz has quit [*.net *.split]
infinisil has quit [*.net *.split]
<infinisil_> > 1
<{^_^}> 1
<LnL> lol
<infinisil_> It is very likely that this is what's causing my program to exit occasionally
<infinisil_> Seems to be an issue not on my side though, but I'll code it so it can handle it
infinisil_ has quit [Quit: Configuring ZNC, sorry for the join/quits!]
infinisil has joined #nixos-borg
<NinjaTrappeur> Hey, I'm diving in Borg, I am a bit confused about the github -> MQ PHP bit. How is this deployed? Is there a specific reason for having this outside of the ofborg/ Rust codebase?
<infinisil> >:v
<{^_^}> All bindings: _show eatmyram lib nixpkgs pkgs rev
<infinisil> >eatmyram
<ekleog> NinjaTrappeur: I guess you want it's related to https://github.com/NixOS/ofborg/#old-php-stuff ; ie. just not-done-yet? :°
<ekleog> s/you want //
<{^_^}> (no output)
<ekleog> >:l
<{^_^}> :l needs an argument
<ekleog> >:l /etc/machine-id
<{^_^}> imported scope
<ekleog> MOUHAHAHA
<ekleog> >:l /etc/nixos/configuration.nix
<{^_^}> imported scope
<ekleog> >:v
<{^_^}> All bindings: _show eatmyram lib nixpkgs pkgs rev
<ekleog> infinisil: ^ I think you want to disable the :l one at least :)
<infinisil> ekleog: Why?
<infinisil> >hello
<{^_^}> value is a path while a set was expected
<infinisil> >r s
<{^_^}> value is a path while a set was expected
<infinisil> >:r s
<{^_^}> Scopes got reset
<infinisil> >hello
<{^_^}> [31;1merror:[0m undefined variable 'hello' at [1m(string)[0m:9:9
<ekleog> > :p (builtins.readFile /etc/machine-id)
<{^_^}> Unknown command: p
<ekleog> >:p (builtins.readFile /etc/machine-id)
<{^_^}> Unknown command: p
<infinisil> >:l pkgs
<{^_^}> imported scope
<infinisil> >hello
<{^_^}> "/nix/store/6mab2znnw7j96k3vsdw9vyckady29r46-hello-2.10"
<infinisil> It's not an actual nix-repl
<ekleog> oh I mistook :l for an import-like
* ekleog had read :l <path> and thought that was a file path
<ekleog> >:q
<{^_^}> Unknown command: q
<infinisil> Ah yeah. No worries, there's no way to read files with my bot :) (except nixpkgs)
<ekleog> >:t {}
<{^_^}> Unknown command: t
<ekleog> oh it's running hnix?
<infinisil> Nope
<infinisil> nix-instantiate, I'm 99.9% certain that hnix couldn't evaluate nixpkgs, which makes it pretty useless. Nix not having a spec is to blame here
<ekleog> yeah, likely the best working option, I just hoped the bot would push development of hnix by failing sometimes :°
<infinisil> Eh, I doubt hnix will ever get there without a spec, and nix keeps changing as well.
<infinisil> It would be nice to use hnix though, maybe if I get a bit better at Haskell I'll have a go at improving it :)
<LnL> infinisil: hnix passes all of the nix evaluation tests now AFAIK
<NinjaTrappeur> ekleog, Thanks, sadly, I still don't get how this snippet loads php/web/index.php :( What am I missing?
<ekleog> LnL: Is that so? not long ago it had the priority of {}.a or b wrong, so maybe that's a nix evaluation to add? :°
<ekleog> +test
<infinisil> LnL: Oh interesting, apparently jwiegly has been working like crazy on its implementation
<infinisil> jwiegley*
<infinisil> I might just give hnix a try then
<LnL> yeah, he's made a lot of changes recently
<ekleog> NinjaTrappeur: I'd guess either you mock this PHP script by injecting directly events into AMQP (that'd allow for testing the whole rust codebase) or you poke gr*hamc to know how it's supposed to be deployed :)
<LnL> that sounds kind of heavy to me
<LnL> most of the functionality can be tested at the amqp boundary instead if it's generalized a bit
<NinjaTrappeur> Alright, thanks
orivej has quit [Ping timeout: 264 seconds]
MichaelRaskin has joined #nixos-borg
jtojnar has quit [Quit: jtojnar]
jtojnar has joined #nixos-borg
jtojnar has quit [Remote host closed the connection]
jtojnar has joined #nixos-borg
orivej has joined #nixos-borg
jtojnar has quit [Remote host closed the connection]
jtojnar has joined #nixos-borg
jtojnar has quit [Remote host closed the connection]
jtojnar has joined #nixos-borg
jtojnar has quit [Quit: jtojnar]
jtojnar has joined #nixos-borg
orivej has quit [Remote host closed the connection]
orivej has joined #nixos-borg
tilpner_ has joined #nixos-borg
sphalerite_ has joined #nixos-borg
tilpner has quit [*.net *.split]
sphalerite has quit [*.net *.split]
tilpner_ is now known as tilpner
<{^_^}> [ofborg] @Synthetica9 opened pull request #174 → Add myself to config.extra-known-users → https://git.io/vpKRy
<MichaelRaskin> MiсhaelRaskin ++
<{^_^}> MiсhaelRaskin's karma got increased to 1
<MichaelRaskin> infinisil: cheating protection, cheating protection…
<jtojnar> cool, GitHub now allows check to end with "neutral" status
<infinisil> MichaelRaskin: Heh, nice
<infinisil> There's always a way around it, especially with IRC where you can just change nicks :)
<MichaelRaskin> jtonjar: I think it has been there for some times, how the checks get summarized, though?
<MichaelRaskin> infinisil: also, multiple connections…
<MichaelRaskin> infinisil: but technically I didn't change the nick for my connection
<infinisil> What do you mean by multiple connections?
<MichaelRaskin> I could launch multiple ii instances…
<infinisil> And what can this be useful for?
<infinisil> >1
<{^_^}> 1
<MichaelRaskin> > ++
<{^_^}> >'s karma got increased to 1
<{^_^}> [31;1merror:[0m syntax error, unexpected CONCAT, at [1m(string)[0m:10:9
<MichaelRaskin> ,++
<{^_^}> ,'s karma got increased to 1
<MichaelRaskin> , ++
<{^_^}> ,'s karma got increased to 2
<MichaelRaskin> ,, ++
<{^_^}> ,,'s karma got increased to 1
<MichaelRaskin> Well, if the instances are in places with different downtime patterns, it might be useful