llfourn | MoarVM panic: Heap corruption detected: pointer 0x7f0fe9a16410 to past fromspace # on latest travis build | 03:43 | |
travis-ci.org/spitsh/spitsh/builds...7557#L1355 | |||
[Tux] | This is Rakudo version 2017.06-75-g823011281 built on MoarVM version 2017.06-30-g389e9732 | 06:41 | |
csv-ip5xs 2.667 | |||
test 12.656 | |||
test-t 4.138 - 4.245 | |||
csv-parser 12.801 | |||
lizmat | Files=1207, Tests=62917, 219 wallclock secs (13.12 usr 5.03 sys + 1327.15 cusr 135.32 csys = 1480.62 CPU) | 07:48 | |
Geth | roast: 0f97380f9a | (Elizabeth Mattijsen)++ | S03-operators/difference.t Add tests for mix() (-) <a b c>.Mix |
08:37 | |
rakudo/nom: c727462cde | (Elizabeth Mattijsen)++ | src/core/Rakudo/QuantHash.pm Fix mix() (-) <a b c>.Mix This was improperly returning the empty mix(), instead of negating the weights of the right hand side. |
08:38 | ||
lizmat | afk& | 08:46 | |
FROGGS | o/ | 09:06 | |
yoleaux | 30 Mar 2017 19:48Z <Zoffix> FROGGS: if.pm6 is busted and that breaks install of some crypto modules. Any ideas for how to fix? The role's method never gets run; dunno where to take it from here: github.com/FROGGS/p6-if/issues/2 | ||
FROGGS | uff | ||
jnthn | o/ FROGGS | 09:07 | |
FROGGS | hi jnthn | 09:08 | |
jnthn | At least it seems if.pm6 got fixed in the meantime :) | ||
FROGGS | phew, zoffix++ already fixed that issue | ||
aye :o) | |||
btw, I'm planning to pop in here in the evenings again... | 09:09 | ||
nine | FROGGS! \o/ | 09:10 | |
FROGGS | hi nine :o) | ||
nine | FROGGS: haven't read you in ages. How're you doing? | 09:13 | |
brrt | yes, that | 09:15 | |
tadzik | o/ | ||
FROGGS | ohh, I'm fine | 09:17 | |
was absent due to a biggish project at $work... | 09:18 | ||
but now want to experiment with my Mojolicious app and try to port stuff over | |||
the current module installer is zef, ehh? | 09:20 | ||
moritz | it is | ||
dogbert2 | lizmat: 'not ok 97 - Mix symmetric difference reduce works on three mixes' # is this work in progress? | 10:09 | |
dogbert2 notes that running spectest with HARNESS_TYPE=6 no longer outputs the names of the test files being run !? | 10:11 | ||
lizmat | dogbert2: yeah, still determining whether the test or the code is afaulty | 10:46 | |
lizmat confirms what dogbert2 said | 10:47 | ||
Geth | roast: 641916fbbe | (Elizabeth Mattijsen)++ | S03-operators/addition.t Add thorough testing for (+) The commented out lines currently fail :-( That's quite a number of cases :-( :-( |
11:29 | |
rakudo/nom: 9bd75f14df | (Elizabeth Mattijsen)++ | 2 files Normalize R:Q.ADD-MIX-TO-MIX interface |
12:44 | ||
DeadDelta | We don't guarantee any support for nqp, right? Like, were someone to use an op, it's their own dumb fault if we change that op and their code breaks? | 13:05 | |
jnthn | Always after 942 iterations, even with spesh disabled. | 13:15 | |
DeadDelta | m: class { has int $!n = 0; method x { $!n += 2 while $!n < 20000000 } }.new.x; say now - INIT now | 13:16 | |
camelia | 6.992108 | ||
DeadDelta | m: class { has int $!n = 0; method x { my int $n = 0; $n += 2 while $n < 20000000 } }.new.x; say now - INIT now | ||
camelia | 5.2410657 | ||
DeadDelta | So accessing an attribute is just more expensive or is something else happening? | 13:17 | |
jnthn | Just more expensive | 13:18 | |
DeadDelta | Thanks. | 13:19 | |
jnthn | (Which is probably consistently true across languages.) | ||
lizmat | .oO( DeadDelta is finding out the intricacies of push-all :-) |
13:22 | |
DeadDelta | :) I think I won't talk about any other .push* (like .push-at-least) in my article. They probably outside what a regular user would want to write, even if they're writing custom Iterators | 13:24 | |
(I don't even know what user-land example would trigger calls to them :/) | |||
lizmat | my @a = ^1000 # that would be a push-all | 13:25 | |
DeadDelta | Yeah, that's the only one I figured out. But others, like .push-at-least or .push-exactly or .push-until-lazy | 13:27 | |
lizmat | -> $a, $b { } | ||
if I recall correctly | |||
perhaps that is optimized | |||
more like -> $a, $b, $c # three or more | |||
DeadDelta | What's that? In .map signature? | 13:28 | |
lizmat | for @a -> $a, $b, $c { } ? | ||
DeadDelta | oh yeah. Thanks :) | 13:29 | |
lizmat | it creates a buffer internally for the 3 params on which it does a push-at-least | ||
DeadDelta | And .push-until-lazy. What's the idea behind that one? | ||
I'll just mention there are other .push-* things if you care about every last drop of performance and won't describe them :) | 13:31 | ||
dogbert2 | wrt RT #131592, on my system it eats up all available fd's (1024) quite qickly and then hangs | 13:35 | |
synopsebot6 | Link: rt.perl.org/rt3/Public/Bug/Display...?id=131592 | ||
DeadDelta | There are docs even docs.perl6.org/type/Iterator#metho...until-lazy | ||
jnthn | Hm, but maybe we should try to solve it at Perl 6 level, not VM level | 13:45 | |
Let's see... | |||
dogbert2 | AlexDaniel: that definitely helped, now only ~80 fd's are open on exit | 13:49 | |
AlexDaniel | .oO( what? Is he saying that there is a possibility that I won't have to fix this issue in my scripts till the end of my days? Instead, I can even remove redundant $p.out.close lines? ) |
||
pmurias | jnthn: is it sane for me to try to get Proc::Async to work on the js backend (I have coroutines on node.js, but most js implementations don't have threads) | ||
AlexDaniel | .oO( in fact, we won't even need to document it as a trap? :O ) |
||
timotimo | pmurias: probably fine to do it via the event loop | 13:51 | |
jnthn | pmurias: I suspect it may somehow be possible to do it, though probably not entirely easy | 13:52 | |
AlexDaniel: Initial results seem promising at least | |||
jnthn spectests the change | 13:53 | ||
Geth | roast: 6f911a9998 | (Elizabeth Mattijsen)++ | S03-operators/addition.t Do tests for (a=>-1).Mix (+) <a>.Mix -> mix() Also disable debugging helpers. |
13:59 | |
jnthn | Hm, on reflection initial solution maybe a bit aggressive | ||
jnthn spectests a probably better one | |||
Geth | rakudo/nom: 66aef5893d | (Elizabeth Mattijsen)++ | src/core/set_operators.pm Make Mix (+) Mix a bit smarter - test for empty mixes better - start with a deep clone of left instead of re-building on the fly |
14:02 | |
rakudo/nom: d183846116 | (Elizabeth Mattijsen)++ | src/core/Rakudo/QuantHash.pm Make Mix (+) Mix about 1.5x faster - also fix problem with negative weights cancelling out |
|||
rakudo/nom: abfd7d9518 | (Jonathan Worthington)++ | src/core/Proc/Async.pm Don't leak handles plumbed into another process. By closing them automatically. This fixes RT #131592 running out of handles. |
14:06 | ||
synopsebot6 | Link: rt.perl.org/rt3/Public/Bug/Display...?id=131592 | ||
jnthn | There we go | ||
jnthn has one more tweak at merge, though | 14:24 | ||
Just in case I missed something last time around when doing it | |||
No, seems that I did try before the way to get a single descriptor | 14:27 | ||
It just ends up losing stderr | |||
(If you make a pipe and then point stderr at the same pipe as was bound to stdout) | 14:28 | ||
So, can't really do it unless one of us figures out how to make that happen. | 14:30 | ||
And I've not been able to | |||
And found a libuv mailing list post whether somebody else seemed to struggle with the same issue and there wasn't a solution | |||
jnthn makes the last push on Proc::Async so he can do something that isn't process-related tomorrow :) | 14:32 | ||
ugexe | I thought in NIO ( >:) ) at least it was just like redirectBlahBlah(foo) redirectBarBar(foo) | 14:33 | |
ugexe isnt a java programmer... just went through the java bits of the proc stuff years ago | |||
Geth | rakudo/nom: 5fb6d67921 | (Elizabeth Mattijsen)++ | src/core/Rakudo/QuantHash.pm Abstract Setty::BAGGIFY logic into R:Q.SET-BAGGIFY |
||
rakudo/nom: 36bf08fca3 | (Elizabeth Mattijsen)++ | src/core/Setty.pm Make Setty.(Bag|Mix)(|Hash) use R:Q.SET-BAGGIFY Also fix bug in that empty Sets would not coerce to bag() and mix(), but to a newly created Bag/Mix |
|||
rakudo/nom: 11b02d2ca6 | (Jonathan Worthington)++ | src/core/Proc/Async.pm Add plumbing std[out|err] to stdin in Proc::Async. So you can now write `$proc2.bind-stdin($proc1.stdout)` and have it work. |
15:00 | ||
roast: c1f176656a | (Jonathan Worthington)++ | S17-procasync/bind-handles.t Tests for Proc::Async descriptor plumbing. |
15:01 | ||
jnthn | There we go | 15:02 | |
Now there really is nothing that Proc can do that Proc::Async can't :) | |||
DeadDelta | ZofBot: but will it blend? | 15:07 | |
ZofBot | DeadDelta, but this is super-powerful and exciting! I do look at systems that receive http calls and then make calls into other systems with retries and standoffs, collate the results and feed them back | ||
brrt | jnthn++ | 15:09 | |
Geth | rakudo/nom: bacaa05150 | (Elizabeth Mattijsen)++ | src/core/set_operators.pm Make Setty (-) Setty about 20% faster - by first baggifying the left Setty instead of building a Bag from scratch |
15:10 | |
lizmat | .tell [Tux] in line 1037 of CSV.pm, can the size of @ch change while in the loop? | 17:44 | |
yoleaux | lizmat: I'll pass your message to [Tux]. | ||
[Tux] | yes, see line 1253 | 17:56 | |
yoleaux | 17:44Z <lizmat> [Tux]: in line 1037 of CSV.pm, can the size of @ch change while in the loop? | ||
[Tux] | and line 1308 | ||
that specifically happens with embedded EOL's | 17:57 | ||
lizmat | oki :-) | ||
lizmat stops optimising CSV.pm again | 17:58 | ||
dogbert2 make spectest suddenly has a tendency to hang, one random test file never completes | 18:13 | ||
[Coke] mentions his weird new doc issue over here, JIC: irclog.perlgeek.de/perl6/2017-06-27#i_14793874 (it's generating "invalid UTF8", but only with run, perl6 --doc, and .lines) | 18:18 | ||
mst | trout.me.uk/foom.jpg ? | 18:53 | |
DeadDelta | :) | 18:54 | |
ugexe | [Coke]: I have a similar issue where I use proc to read lines (url per line) and launch a new proc for each line. it always crashes at 254 on my system (and only osx). i thought it was from the launched processes but now I wonder if its the .lines | 18:56 | |
[Coke] | lines by itself is fine | 19:00 | |
I also am on OS X. | |||
DeadDelta | Hehe, yeah, tell me more about how I should learn Perl 5 before criticising when shit like this has double the upvotes than any other post in /r/perl www.reddit.com/r/perl/comments/6jp...rver_that/ | 19:10 | |
ZofBot: they want war! They got it! | |||
ZofBot | DeadDelta, } # define your own :x modifier Pragmas Various pragmas may be used to control various aspects of regex compilation and usage not otherwise provided for | ||
DeadDelta | Oh, that reminds me. | 19:11 | |
AlexDaniel | jnthn: sooo, should we close github.com/perl6/doc/issues/1304 then? | 19:12 | |
Geth | rakudo/nom: 7ec136f821 | (Zoffix Znet)++ (committed using GitHub Web editor) | src/Perl6/Grammar.nqp Remove comment about implementing :p quoter We don't have any plans to implement it as the .IO coercer does the fine job and is short-enough |
19:13 | |
DeadDelta | moritz: on mobile, the log pages just say Forbidden" now :/ | 20:00 | |
moritz | DeadDelta: yes; I had to disable them due to runaway memory usage :( | 20:02 | |
DeadDelta | :( | 20:04 | |
ZofBot: what will I read on the potty now???? | |||
ZofBot | DeadDelta, Likewise certain implicit lexicals ($_, $/, and $!) are so marked | ||
moritz | if you have good ideas for debugging runaway memory usage in a p5 app, I'm all eager to hear it | 20:05 | |
DeadDelta | What's the app? | 20:06 | |
dunno, nytproff or whatever can find it, no? | |||
moritz | the IRC log web app | 20:07 | |
and nytprof is good for debugging time spent | |||
but not for memory leaks :( | 20:08 | ||
DeadDelta | the ilbot one? github.com/moritz/ilbot?files=1 | 20:14 | |
and I'm guessing it doesn't leak on older perl 5 | 20:16 | ||
moritz | right | ||
perl 5.20 -> 5.24 | |||
timotimo | DeadDelta: for me, METAOP_ASSIGN disappears completely, at least when the LHS is a variable. potentially only in that case | 20:17 | |
in general, i think code that's guaranteed to throw a run-time error is a bad test case for the optimizer | |||
DeadDelta | Ah | 20:18 | |
moritz | I guess I'll try to upgrade to a perl 5.26 via perlbrew | ||
DeadDelta | timotimo: yeah, my bad | ||
Geth | rakudo/nom: 2ce5b67815 | (Elizabeth Mattijsen)++ | src/core/Stash.pm Make Stash.AT-KEY a few percent faster - purely in nqp ops - separate candidate if no global fallback needed - don't allocate an nqp::hash until it's really needed - makes calling our subs from another package somewhat faster |
20:19 | |
timotimo | :) | 20:20 | |
lizmat | it is now faster to call A::a instead of A.a *IF* you do not pass any arguments | 20:27 | |
(and not use self in the method case) | |||
that's because the lookup with Stash.AT-KEY is faster than setting up "self" in the method | 20:28 | ||
even if you don't use self or $!foo or $.foo inside the method | |||
jnthn is a tad surprised by that, in that the method could be inlined... | 20:29 | ||
AlexDaniel: Seems like we can | |||
lizmat | jnthn: even inlined, setting up "self" through List.from-slurpy-flat is more expensive | 20:30 | |
DeadDelta | TIL you can call A::a instead of A | ||
TIL you can call A::a instead of A.a | |||
AlexDaniel | jnthn: thank you very much | 20:31 | |
jnthn | Only if it's a sub | ||
DeadDelta | TIL you can call a sub as A.a :s | ||
AlexDaniel | we will see how it goes, I'll probably update rakudo for whateverables soon | ||
jnthn | lizmat: huh, where is List.from-slurpy-flat used? | ||
lizmat | m: class A { method a() { } }; for ^100000 { A.a }; say now - INIT now | ||
camelia | 0.14180921 | ||
lizmat | jnthn: ^^^ | ||
DeadDelta | m class Foo { our sub x { say "hi" } }; Foo.x | 20:32 | |
jnthn | m: class A { my method a() { } }; for ^100000 { A::a(A) }; say now - INIT now | ||
camelia | Could not find symbol '&a' in block <unit> at <tmp> line 1 |
||
lizmat | m: class A { our sub a() { } }; for ^100000 { A::a }; say now - INIT now | ||
DeadDelta | m: class Foo { our sub x { say "hi" } }; Foo.x | ||
camelia | 0.12977999 | ||
No such method 'x' for invocant of type 'Foo' in block <unit> at <tmp> line 1 |
|||
lizmat | m: say 0.14180921 / 0.12977999 | 20:33 | |
camelia | 1.092689328 | ||
DeadDelta | Ah, now I get it | ||
jnthn | I still don't get the comment on List.from-slurpy-flat... | 20:34 | |
lizmat | jnthn: class A { method a() { } }; for ^100000 { A.a } # profile this and see that List.from-slurpy-flat takes 40% of CPU | ||
jnthn | Doesn't even show up in a profile of that that I just made | 20:36 | |
[Coke] | jnthn: do you have local mods? | ||
jnthn | No, though build is a few days old | ||
But it'd still be a totally bizzare thing for that code to call | |||
It shows method a inlined into the sub body | 20:37 | ||
uh, the loop block body I mean | |||
jnthn is just a tad surprised that the passing/handling of self would be so costly, is all | 20:38 | ||
[Coke] | camelia, help? | ||
camelia | [Coke]: Usage: <(rakudo-moar|p5-to-p6|prof-m|star-m|debug-cat|nqp-js|rakudo-jvm|nqp-moarvm|nqp-jvm|nqp-q|r-j|sm|star|nom|nqp-m|p6|m|p56|rakudo|nqp-mvm|r-m|r-jvm|j|rj|perl6|rm|r|nqp)(?^::\s(?!OUTPUT)) $perl6_program> | ||
[Coke] | prof-m: class A { method a() { } }; for ^100000 { A.a } | ||
camelia | No such file or directory | ||
.. Prof: p.p6c.org/4ae425a | |||
[Coke] | guess that's borked. :) | ||
jnthn | aww | ||
camelia | (timeout)Can't exec "./rakudo-inst/bin/perl6-m": No such file or directory at lib/EvalbotExecuter.pm line 206. cat: /home/camelia/rakudo-inst/revision: No such file or directory now running scp... /tmp/mprof.html: No such file or directory |
||
.. Prof: p.p6c.org/4ae4270 | |||
lizmat | jnthn: ah, I get it now, so you're saying the from-slurpy-flat is called for the loop body ? | 20:39 | |
*not* for the method call ? | |||
jnthn | lizmat: I'm saying that on a profile using a bit-back-from-HEAD Rakudo I don't see a call to from-slurpy-flat at all | 20:40 | |
It just doesn't show up in the routines list | |||
lizmat | well, it does for me :-( | ||
jnthn | Will try it in the morning on my work box where I've got a bleeding edge build | 20:41 | |
If it is there it's a recent regression | |||
lizmat | it claims it is being called at gen/moar/BOOTSTRAP.nqp:3185 | ||
which is the foreign_transform_array entry | 20:42 | ||
jnthn | And this is just for /perl6-m --profile -e 'class A { method a() { } }; for ^100000 { A.a }' ? | ||
lizmat | yup | 20:43 | |
lizmat doubly verifies | |||
yup | |||
jnthn | Wonder what coulda caused that | 20:45 | |
It's just a bizzare thing to end up calling | 20:46 | ||
Ah well, tomorrow. | 20:48 | ||
DeadDelta | I see slurpy from flat on 2017.06-63-g2a88c20 | 20:49 | |
m: List.^lookup('from-slurpy-flat').wrap: -> | { say "hi"; nextsame }; class A { method a() { } }; for ^1 { A.a } | 20:51 | ||
camelia | No such method 'enter' for invocant of type 'Any'. Did you mean 'eager'? in block <unit> at <tmp> line 1 |
||
lizmat | m: List.^lookup('from-slurpy-flat').head.wrap: -> | { say "hi"; nextsame }; class A { method a() { } }; for ^1 { A.a } | 20:54 | |
camelia | No such method 'enter' for invocant of type 'Any'. Did you mean 'eager'? in block <unit> at <tmp> line 1 |
||
lizmat | hmmm | ||
m: BEGIN List.^lookup('from-slurpy-flat').head.wrap: -> | { say "hi"; nextsame }; class A { method a() { } }; for ^1 { A.a } | |||
camelia | 5===SORRY!5=== Error while compiling <tmp> An exception occurred while evaluating a BEGIN at <tmp>:1 Exception details: No such method 'enter' for invocant of type 'Any'. Did you mean 'eager'? in code at <tmp> line 1 |
||
lizmat | m: dd List.^lookup('from-slurpy-flat') | 20:55 | |
camelia | Method from-slurpy-flat = method from-slurpy-flat (List $: | is raw) { #`(Method|54316856) ... } | ||
lizmat | m: dd List.^lookup('from-slurpy-flat').head | ||
camelia | Method from-slurpy-flat = method from-slurpy-flat (List $: | is raw) { #`(Method|32997224) ... } | ||
DeadDelta | Same error in 2015.12 fwiw | ||
lizmat | m: dd List.^lookup('from-slurpy-flat').head.wrap: -> { } | ||
camelia | No such method 'enter' for invocant of type 'Any'. Did you mean 'eager'? in block <unit> at <tmp> line 1 |
||
DeadDelta | Still have from-slurpy-flat on 2017.06 | 21:16 | |
The profile on 2017.05 has a lot more crap in it, but it still got from-slurpy-flat in it at 32% | 21:29 | ||
.tell jnthn RE from-slurpy-flat I tried with 2017.06 and 2017.05 builds, it's there in both at around 32%-38% | |||
yoleaux | DeadDelta: I'll pass your message to jnthn. | ||
DeadDelta | Thank you, robot! You are most kind. | 21:30 | |
timotimo | DeadDelta: do you think it'd be useful for Proc::Q to also give a channel that tells you when procs have been started? | 21:37 | |
DeadDelta | What for? | 21:38 | |
I kinda thought of it you put in a bunch of data you need to process with procs and you pull it out when ready. You never deal with the procs directly | |||
DeadDelta leaves to finish off Part II of Seqs article | 21:41 | ||
timotimo | okay so | 21:47 | |
the crashing when profiler runs, right? | |||
MasterDuke | you've fixed it?! | ||
timotimo | run_alt is being invoked with a last argument that comes from the register loc_3_obj | ||
but nothing in the whole frame writes to that | |||
aha, indeed, it's also nowhere to be found in the spesh output | 21:49 | ||
i wish i was able to fix it already | 21:59 | ||
i might want to have more debugging helpers in place to see what spesh is thinking | |||
Geth | rakudo/nom: 9a2127f2b5 | (Timo Paulssen)++ | src/core/Nil.pm give nil methods a much more efficient "take any args" signature |
22:43 | |
timotimo | ^- here's the fix for from-slurpy-flat | ||
DeadDelta | ROFL | 22:45 | |
timotimo++ nice one :D | 22:46 | ||
damn. Note to self: when writing an article don't run code samples on your 32-bit box that don't got jit :/ | 23:01 | ||
A ~1000-word section just went from "it's a 30% gain but with these easy codes we make it 2.5x fastar!" just became "we made stuff 10% faster and with this bunch of code we make it 50% faster" :( | 23:02 | ||
timotimo | ;( | 23:12 | |
DeadDelta | ? | 23:16 | |
That face looks angry :D | |||
ZofBot: what kind of face you like to make? | 23:20 | ||
ZofBot | DeadDelta, emit" each of the return values of the closure, and then call " | ||
DeadDelta | You're not funny any more. I need to reset your brain. | ||
timotimo | that's more like "damn, that's annoying" | 23:21 | |
the face | |||
ugexe | closure is not doing, only alah is doing | 23:22 | |
DeadDelta | :) | ||
timotimo | jit is not doing, alah is doing | 23:28 | |
[Coke] | oh please don't. :| | 23:31 | |
heyyyy, segfault. | |||
perl6 htmlify.p6 --parallel=10 --sparse=4 segvs. | 23:32 | ||
(doc repo) | |||
golfing... | |||
timotimo | start with the usual, disabling spesh for example | 23:35 | |
[Coke] | MVM_JIT_DISABLE=1 MVM_SPESH_DISABLE=1 perl6 htmlify.p6 --parallel=10 --sparse=4 # still segvs. | 23:37 | |
oh, just straight up segfaults with perl6 htmlify.p6, no opts needed. | 23:38 | ||
timotimo | oh, huh | 23:41 | |
how soon does it crash? | 23:43 | ||
i'm getting rather far in the one without arguments | 23:45 | ||
[Coke] | crashed immediately. | 23:47 | |
immediately. | |||
[6~ | |||
timotimo | not on my machine | ||
This is Rakudo version 2017.06-87-g36823ab built on MoarVM version 2017.06-30-g389e973 | |||
maybe that's old? | |||
[Coke] | This segfaults for me: use URI::Escape; | 23:49 | |
use lib 'lib'; | |||
use Pod::Htmlify; | |||
I'm on 2017.06-87-g36823ab18 | 23:50 | ||
... same version. huh | |||
I cut down htmlify.p6 to those 3 lines, segv. | |||
MasterDuke | i think there's already a ticket about `use lib 'lib'` | 23:51 | |
buggable: lib | 23:52 | ||
rt.perl.org/Ticket/Display.html?id...et-history | 23:53 | ||
[Coke] | ugh. | 23:54 | |
ugexe | [Coke]: a longshot, but try running with `perl6 -I. ...` | ||
[Coke] | DeadDelta: see, this happens whenever I try to hack on docs. :) | ||
DeadDelta | :) | 23:59 |