🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel!
Set by lizmat on 6 September 2022.
00:00 reportable6 left 00:03 reportable6 joined 00:05 jpn joined 00:07 deoac joined 00:10 jpn left 00:34 NemokoschKiwi left 00:48 jpn joined 00:49 rakuuser left 00:53 jpn left 00:58 AlexDaniel left 01:03 xinming left 01:06 xinming joined 01:41 jpn joined
rf Does anyone know if DBIish does transactions 01:42
I just want to run a huge SQL script with DBIish 01:43
01:45 systems joined
tonyo github.com/raku-community-modules/...test#L1742 01:46
postgres and oracle both work too
01:46 jpn left
Geth ¦ doc: cfa self-assigned Document trap: `use lib` with a huge directory is super slow github.com/Raku/doc/issues/2199 01:52
02:12 Guest5682 joined, deoac left, Guest5682 is now known as tg57 02:29 tg57 left 02:33 rf left 02:45 jgaz left 02:56 snonux left 02:57 snonux joined, samebchase2 joined 02:58 samebchase left, samebchase2 is now known as samebchase 03:09 tg57 joined, tg57 left
Geth ¦ doc: coke self-assigned Change document extension from .pod6 to .rakudoc github.com/Raku/doc/issues/3785 03:11
03:29 jpn joined 03:34 jpn left 03:55 systems left 03:58 razetime joined 04:18 razetime left
Geth doc/main: 7a54ae3f3f | (Will Coleda)++ | 5 files
remove unused utils

add comments to remaining items so we know what they're for.
Closes #3906
04:33
¦ doc: coke assigned to codesections Issue util/list-missing-methods failure github.com/Raku/doc/issues/4223 04:36
¦ doc: coke unassigned from taboege Issue Checklist for 2019.03 github.com/Raku/doc/issues/2673 04:38
doc/main: a6f46aeffc | (Daniel Green)++ | CREDITS
Add myself to the credits
05:10 razetime joined 05:18 jpn joined 05:21 oodani left 05:22 oodani joined, jpn left 05:32 melezhik joined 05:41 melezhik left 05:43 melezhik joined 06:00 reportable6 left, melezhik left 06:01 reportable6 joined 06:31 razetime left 06:49 squashable6 left 06:52 squashable6 joined 07:01 jpn joined 07:05 jpn left
SmokeMachine rf: yes, DBIish does transactions 07:32
tellable6 SmokeMachine, I'll pass your message to rf 07:33
07:50 abraxxa joined, silug left 07:51 silug joined 07:55 abraxxa left, abraxxa joined 08:12 Sgeo left 08:15 abraxxa left 08:19 abraxxa joined 08:23 abraxxa left, abraxxa joined 08:49 jpn joined 08:54 jpn left 09:01 jpn joined 09:10 sena_kun joined 09:16 sftp left, sftp_ joined, sftp_ is now known as sftp 09:50 sena_kun left 10:03 razetime joined 10:14 sena_kun joined 10:18 sena_kun left
tadzik I've stumbled upon this mastodon.social/@alexkalopsia/1099...9695818290 and I wonder how to reproduce it in Raku – it feels like it should give you nice numbers like that easily, but I can't get it right 10:19
tellable6 2020-03-25T22:48:00Z #raku-dev <patrickb> tadzik: Rakubrew is (slowly) getting to the point of working reliably. What's your stance wrt rakudobrew? Should it officially be deprecated?
tadzik wow, I've been missing some messages 10:20
m: say 1/998.001 # sad
camelia 0.001002
lizmat m: printf("%.300f",(1 / 998.001).FatRat) 10:23
camelia 0.001002003004005006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000…
tadzik FatRat! That's it, thanks :)
lizmat nah, it isn't ?
tadzik hum, indeed 10:24
Nemokosch the conversion should happen earlier, right?
this is a situation where an adverb might be nice
lizmat the size of the printf format should be enough 10:25
Nemokosch isn't (1 / 998.001) evaluated too early for that?
tadzik m: printf("%.300f",1 / 998.001.FatRat) # doesn't help 10:26
camelia 0.001002003004005006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000…
Nemokosch oh okay, the precision isn't lost here, it's just not displayed well... 10:28
tadzik it seems to me like it does get lost
m: printf("%.30f", (1 / 998.001.FatRat) * 100000) 10:29
camelia 100.200300400500600000000000000000
Nemokosch m: (1 / 998.001).FatRat * 100000 andthen .raku.say
Raku eval FatRat.new(100000000, 998001)
Nemokosch seems accurate 10:30
lizmat PR to introduce Rat.Str(:digits) coming up 10:46
10:47 razetime left 10:55 sena_kun joined
lizmat github.com/rakudo/rakudo/pull/5223 10:56
tadzik ^^ 11:00
11:38 rakuuser joined 11:53 codesections left 12:00 reportable6 left 12:01 reportable6 joined 12:11 thundergnat joined
thundergnat Rat.Str(:digits) Huh. That's pretty much what my Rat::Precise module does. github.com/thundergnat/Rat-Precise Which, oddly enough isn't showing up on raku.land :-( 12:13
It also has a :z flag to preserve trailing zeros, if desired
12:14 thundergnat left
lizmat TIL 12:15
Nemokosch it doesn't hurt to have something like this in the core, though, does it 12:19
lizmat nope
el m:perl dd &say.WHAT 12:25
Raku eval Sub
el a Sub containing native code?
m:perl dd &say
Raku eval Sub say = proto sub say (|) {*}
lizmat why the perl there ? 12:26
Nemokosch it gives highlighting (and there is no Raku highlighting on Discord)
lizmat ah, ok
but yeah, "say" is an ordinary multi sub 12:27
el so a sub can contain both moarvm code and native code 12:29
lizmat what makes you think that? 12:30
a sub is just a Block with a name and a "return" target
12:31 jpn left
lizmat a Block is a scope with a signature and a list of statements 12:32
that ultimately results in bytecode to be executed by whatever backend is in use
if you run on MoarVM, then it will be moarvm bytecode
on JVM, it will be JVM bytecode 12:33
Nemokosch does multiple dispatch work on sheer Blocks?
lizmat nope, dispatch is a Sub / Method thikng
*thing
Nemokosch 👍
el - is native - i thought say is in native code because i assume builtins are written in C and compiled to native code 12:35
it is not
Geth doc: tbrowder++ created pull request #4224:
Correct the intended zero-width index entries
12:36
lizmat nope: *NONE* of the core is written in C
it is *all* Raku bytecode
afk for a bit&
el really is raku fast enough that writing the core in raku is no longer a liability 12:38
Nemokosch The truth is, a significant t of the core has been rewritten in NQP 12:40
.s/t/part/ 12:41
NQP is pretty darn fast and completely interoperable with "vanilla" Raku 12:43
12:43 rakuuser left, jdv left 12:44 jdv joined
ugexe fwiw there is always a cost of having something in the core 12:46
12:46 Woodi_ joined
ugexe if that implementation ends up being wrong in some way that isn't immediately apparent you end up with a php like language where a bunch of the built in functions have "safe" or legit alternatives 12:46
12:48 xkr47_ joined
ugexe also writing the core in something other than raku could been seen as a liability since rakudo can optimize raku, and in the future probably enough so as to be faster than e.g. nqp 12:50
Nemokosch PHP has also come a long way since the five 🙂 12:51
ugexe that being said we're obviously not there yet, but porting between nqp <-> raku isn't *that* hard
sure, and they still has to have stuff like sql safe or whatever 12:52
bug compatibility is a real thing 12:53
to pick on .Str(:digits) for a moment: one might argue it should be a count of *all* digits, one might argue it should only be digits after the decimal 12:55
its called digits afterall
12:56 silug left, xinming left, epony left, linkable6 left, samcv left, perlbot left, Scotteh left, nativecallable6 left, tellable6 left, benchable6 left, sourceable6 left, bloatable6 left, unicodable6 left, statisfiable6 left, tinita left, energizer left, bartolin_ left, tobs left, japhb left, jjatria left, sivoais left, corwin left, ecocode_ left, xkr47 left, polettix_ left, destroycomputers left, Ulti_ left, Woodi left, nicole left, nebuchadnezzar left, gordonfish left, hexology left, xkr47_ is now known as xkr47, hexology joined
ugexe eventually someone will want the other variant, yet the original name that implies both will only apply to one while the other has some name detached from other variants argument/parameter/whatever 12:56
12:56 energizer joined
ugexe at least from a naming perspective one solution is to not hummanize things that may not really need it 12:57
huffmanize^
12:57 jpn joined
ugexe .Str(:trailing-digits) for instance 12:57
I don't really have any strong feels on .Str(:digits) fwiw, i'm just using it as an exmaple because it just came up 12:59
13:01 epony joined, silug joined, xinming joined, linkable6 joined, samcv joined, perlbot joined, Scotteh joined, nativecallable6 joined, tellable6 joined, benchable6 joined, sourceable6 joined, bloatable6 joined, unicodable6 joined, statisfiable6 joined, tinita joined, bartolin_ joined, tobs joined, japhb joined, jjatria joined, sivoais joined, corwin joined, ecocode_ joined, polettix_ joined, destroycomputers joined, Ulti_ joined, nicole joined, nebuchadnezzar joined, gordonfish joined 13:04 epony left, perlbot left 13:05 epony joined 13:07 jpn left
ugexe but like in regex ① is a digit so theoretically things like FatRat.new(①).Str(...) should be considered (my guess is this already just works because raku is good like that, but it should still have been considered) 13:07
13:08 perlbot joined
ugexe then again i typically paralyze myself when considering all this stuff :P 13:09
lizmat well, thundergnat showed Rat::Precise, and I think that would make an excellent addition to the core 13:14
Nemokosch again there are very different attitudes to this stuff, bug compatibility and all
I tend to agree that even something that is arguably a bugfix could in theory mess something up somewhere else, and if it hasn't been specified either way, it's just as much a breaking change as it is a fix 13:15
ugexe i mean people also say zef would make a good addition to the core, which i would also disagree with
lizmat I can see that: you want to be able to update zef without needing to update the core 13:17
ugexe well, we need the raku programs that we leave behind e.g. previous workplaces to keep working hopefully without anyone having to fix it and get a bad impression. if it wasn't for that i'd mostly be all for not considering bug-compatibility at all
well the not just that, but like zef is also things like invoking curl/wget/tar etc in a OS dependant way 13:18
lizmat ack 13:19
13:20 jpn joined, epony left 13:25 euandreh left 13:29 jpn left 13:30 nebuchad` joined 13:31 nebuchadnezzar left 13:32 jpn joined 13:53 epony joined
Geth ¦ doc: coke unassigned from Scimon Issue Proc::Async Example needs to be modified to run on Windows 10 github.com/Raku/doc/issues/1453 14:12
¦ doc: coke self-assigned Proc::Async Example needs to be modified to run on Windows 10 github.com/Raku/doc/issues/1453
¦ doc: coke assigned to tbrowder Issue update humorous subtitle github.com/Raku/doc/issues/4202 14:18
el rakudo -> nqp -> C thats 2 levels of abstraction 14:20
Geth ¦ doc: coke self-assigned Differentiate clearly "version" and "release" github.com/Raku/doc/issues/3843 14:21
el is that only possible with JITing rakudo hasn't come to that level yet
14:43 Altai-man joined 14:44 sena_kun left 14:47 jgaz joined 15:26 rf joined 15:38 Sgeo joined
Geth rakudoc: pheix++ created pull request #23:
Migrate to Pod::Utils
15:45
15:52 epony left 15:53 epony joined 16:23 razetime joined 16:44 abraxxa left 16:51 euandreh joined
tonyo m: use Rat::Precise; 16:54
camelia ===SORRY!=== Error while compiling <tmp>
Could not find Rat::Precise in:
/home/camelia/.raku
/home/camelia/rakudo-m-inst-2/share/perl6/site
/home/camelia/rakudo-m-inst-2/share/perl6/vendor
/home/camelia/rakudo-m-inst-2/…
17:07 simcop2387 left, perlbot left 17:09 simcop2387 joined 17:10 perlbot joined 17:17 razetime left
Geth doc/finanalyst-patch-1: 1da99fc750 | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/community.pod6
Update community.pod6

Remove reference to perl.meetup.com as it no longer exists
17:23
doc: finanalyst++ created pull request #4226:
Update community.pod6
17:24
doc/main: ade0e7f024 | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/community.pod6
Update community.pod6 (#4226)

Remove reference to perl.meetup.com as it no longer exists
17:29
doc/finanalyst-patch-3: ec9a23baad | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/faq.pod6
Update faq.pod6

edit the zef url so that it is recognised by modules.raku.org remove reference to p6doc, which is not being found there,
17:34
17:41 QhpAptyj9hj0RQwM joined
Geth doc/finanalyst-patch-1: 2147d8e975 | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/modules.pod6
Update modules.pod6

The example changed. So make the link work.
17:42
doc: finanalyst++ created pull request #4228:
Update modules.pod6
17:43
doc/finanalyst-patch-4: a80750c26d | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/modules-extra.pod6
Update modules-extra.pod6
17:44
doc: finanalyst++ created pull request #4229:
Update modules-extra.pod6
17:45
doc/finanalyst-patch-5: f5b68eb63f | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Type/DateTime.pod6
Update DateTime.pod6
17:54
doc: finanalyst++ created pull request #4230:
Update DateTime.pod6
17:55
18:00 reportable6 left 18:02 reportable6 joined 18:10 TieUpYourCamel left, Altai-man left
Geth doc/main: a575049cda | (Richard Hainsworth)++ (committed using GitHub Web editor) | doc/Language/modules.pod6
Update modules.pod6 (#4228)

The example changed. So make the link work.
18:29
doc: cfa++ created pull request #4231:
Document potential performance penalties for filesystem repos (#2199)
18:34
18:35 linkable6 left 18:38 linkable6 joined
Geth doc/main: 160b0cfd87 | cfa++ (committed using GitHub Web editor) | 2 files
Document potential performance penalties for filesystem repos (#4231)

Closes #2199.
18:40
19:02 dustinm`_ left 19:08 linkable6 left 19:10 linkable6 joined 19:17 sena_kun joined 19:18 archenoth joined 19:21 Oshawott left 19:23 dustinm` joined
Geth doc: cfa++ created pull request #4232:
Clarify the role of META6.json in filesystem repos
19:34
19:39 jpn left
Geth doc/main: 60c752d207 | cfa++ (committed using GitHub Web editor) | doc/Language/traps.pod6
Clarify the role of META6.json in filesystem repos (#4232)

Relates to #2199 and comments on #4231.
19:44
19:51 jpn joined 20:01 jpn left 20:09 jpn joined 20:36 amenonsen left, jpn left 20:40 lichtkind joined 20:50 jpn joined 20:54 jgaz left 21:05 sftp left 21:06 sftp joined 21:07 jpn left 21:23 vrurg left 21:24 vrurg joined 21:45 Xliff joined
Xliff \o 21:46
m: "test".IO.spurt("TestTestTest"); given "test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .close; "test".IO.slurp.say }
camelia Failed to open file /home/camelia/test: Is a directory
in block <unit> at <tmp> line 1
Xliff m: "/tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .close; "/tmp/test".IO.slurp.say }
camelia BLEAH!stTest
Xliff ^^ Isn't that a bug?
If not, how can I correct it so the output doesn't contain the results of the previous .spurt? 21:47
m: "use NativeCall; sub ftruncate(int32, uint64) is native(*); /tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .ftruncate(.native-descriptor, 6); close; "/tmp/test".IO.slurp.say } 21:50
camelia ===SORRY!=== Error while compiling <tmp>
Calling close() will never work with signature of the proto ($, *%)
at <tmp>:1
------> "); .ftruncate(.native-descriptor, 6); ⏏close; "/tmp/test".IO.slurp.say }
Xliff m: "use NativeCall; sub ftruncate(int32, uint64) is native(*); /tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH!"); ftruncate(.native-descriptor, 6); close; "/tmp/test".IO.slurp.say }
camelia ===SORRY!=== Error while compiling <tmp>
Undeclared routine:
ftruncate used at line 1. Did you mean 'truncate'?
rf I'm not sure what would be the bug here 21:53
tellable6 2023-03-01T07:33:01Z #raku <SmokeMachine> rf: yes, DBIish does transactions
ugexe open with :truncate?
Xliff m: "/tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .close; "/tmp/test".IO.slurp.say }
camelia BLEAH!stTest
Xliff ugexe: I don't want to clear the contents of the file before I can read them. 21:54
I also would rather not have to open the file twice.
rf I think this is just a side-effect of buffered IO 21:55
But I could be wrong
Xliff Right. so the big question is how can I truncate the extra "stTest"
rf You want that to be removed?
Xliff Yep.
File should end at "!" 21:56
m: "/tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { my $c = .slurp; .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .close; "/tmp/test".IO.slurp.say; $c.say }; 21:57
camelia BLEAH!stTest
TestTestTest
21:57 jpn joined
Xliff m: "/tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw, :truncate) { my $c = .slurp; .seek(0, SeekFromBeginning); .spurt("BLEAH!"); .close; "/tmp/test".IO.slurp.say; $c.say }; 21:57
camelia BLEAH!
rf m: "test".IO.spurt("TestTestTest"); say "test".IO.slurp; "test".IO.spurt("BLEAH!"); say "test".IO.slurp;
camelia Failed to open file /home/camelia/test: Is a directory
in block <unit> at <tmp> line 1
Xliff Note that opening with :truncate leaves the last "TestTestTest" empty. That is not what I want.
rf m: "/tmp/test".IO.spurt("TestTestTest"); say "/tmp/test".IO.slurp; "/tmp/test".IO.spurt("BLEAH!"); say "/tmp/test".IO.slurp; 21:58
camelia TestTestTest
BLEAH!
rf I think there's a way just to clobber the file
with spurt
ugexe spurt has some other options that open() does, maybe it makes sense for it to have :truncate
rf m: "/tmp/test".IO.spurt("TestTestTest"); say "/tmp/test".IO.slurp; spurt "/tmp/test", "BLEAH!"; say "/tmp/test".IO.slurp; 21:59
camelia TestTestTest
BLEAH!
22:00 ToddAndMargo joined
Xliff rf: *sigh* --- Did I mention that the opened file must be locked? Which is why I do not want to perform several file ops. 22:01
Sorry if I didn't.
Xliff headdesks
ugexe: No, :truncate erases the contents of the file. I need to read that out before the .spurt.
IO::Handle.spurt only has :close 22:02
ugexe you would call spurt after you read it obviously 22:03
and i suggested adding a :truncate option to spurt, not that exists
not that it exists^
rf Maybe using a filehandle is the right approach here 22:04
ugexe yeah it has to be a file handle if you want to do multiple actions on it 22:05
without reopening it that is
Xliff Yeah, but there is no .truncate for IO::Handle. 22:06
No joy using spurt(:truncate) 22:07
ugexe i know, again, i'm *suggesting* it might make sense to have it -- "maybe it makes sense for it to have :truncate"
Xliff Oh. Yes. Definitely! 22:08
This... WORKS!
m: use NativeCall; sub ftruncate (int32, uint64) is native {*}; "/tmp/test".IO.spurt("TestTestTest"); given "/tmp/test".IO.open(:rw) { .seek(0, SeekFromBeginning); .spurt("BLEAH"); ftruncate(.native-descriptor, 5); .close; }; "/tmp/test".IO.slurp.say
camelia BLEAH
rf In Template6 how can I access a map within a map? 22:29
22:36 jpn left
Nemokosch Could you give an example? 22:49
22:52 amenonsen joined
rf Template6.new.process('my-template', foo => { bar => 'baz' }); 22:53
How would I access bar in the template
Nemokosch hold up... 22:58
22:58 archenoth left 23:00 kjp left 23:04 kjp joined
you know, I mangled with that module a couple of months ago, but I keep forgetting... 23:05
have you tried foo<bar>, by the way? 23:12
ugexe normally in template toolkit (dunno about template6) you would just call .key-name 23:13
i.e. foo.bar
23:14 sena_kun left
Nemokosch my first (well, at least third first, lol) impression is that the vast majority of behavior really just comes from EVAL 23:16
so I'd try the most naive way 23:17
of course it would be better to rewrite it with proper RakuAST code generation but for the time being, I might rewrite the generated pieces of code to heredoc strings at least, it's really convoluted here and there 23:20
23:33 jpn joined, derpydoo joined 23:34 amenonsen left
rf I tried foo<bar> but I get an error 23:35
Geth doc/main: 68ea242952 | (Will Coleda)++ | 2 files
run duplicate check on more files.

  ... fix the bug that prompted this
23:36
doc/main: 0f59e32295 | (Will Coleda)++ | 2 files
pass 'make xtest'
23:38 jpn left
Nemokosch what is the error, if I may 23:38
rf [% if meta<description> %] this is the call 23:39
coleman I'm trying to find a compact equivalent of `awk '/foo/ {print $1}'`
Here's a pastebin envs.sh/5y
I'm doing this wrong. Lmk if you can help :) 23:40
rf @Nemokosch Undeclared routine: meta used at line 15
ugexe maybe it would parse meta.<description> better 23:41
if you can call any existing method you could use AT-KEY 23:42
rf coleman: Try /catalog.+\s/
ugexe i.e. meta.AT-KEY("description")
Nemokosch m: say '.' ~~ / \w / 23:44
Raku eval Nil
Nemokosch hmmm
anyway, seems like meta<description> went to the generated code verbatim 23:45
rf coleman: This worked for me /<('catalog'\w+)>/; 23:46
coleman oof
Nemokosch or at least this is how I can reproduce the behavior by reading the logic
for the catalog stuff - if the whole thing is one string, you could just ignore the original logic, break up the whole thing into words and grep on that, no? 23:47
coleman rf: thank you very much :) 23:48
Nemokosch that wouldn't be an equivalent for sure but it would get the job done
cfa wouldn't the actual equvalent be .lines on the slurp, then grepping for a pattern?
m: "catalog-6987bf74cc-xhfnq 2/2 Running 0 136m\n controlensemble-0 3/3 Running 2 (27h ago) 28h\n dashboard-dff795cdc-cg5jg 2/2 Running 0 134m\n edge-7894f45d6b-2kzdt 1/1 Running 0 28h\n greymatter-datastore-0 2/2 Running 0 136m\n".lines.grep(/catalog/).say 23:49
camelia (catalog-6987bf74cc-xhfnq 2/2 Running 0 136m)
coleman lines would be closer to awk, which defaults to splitting on lines... 23:51
rf Hmm, Nemo it seems like it wants meta to be a sub rather than a map 23:52
coleman i'll report back if i find something succinct
23:53 derpydoo left
Nemokosch rf: yes, that's not surprising on one hand... on the other hand, I'm afraid %meta<description> won't magically fix that 23:53
because the generated functions have their own "stash" 23:54
cfa i guess /^^.*catalog.*?$$/
might do the job too
match a line with catalog in it
for all matches you'd need m:g/^^.*catalog.*?$$/ 23:55
rf I guess I may need to do some hacking on Template6 23:57