Parrot 3.7.0 "Wanda" | parrot.org | Log: irclog.perlgeek.de/parrot/today | #parrotsketch meeting Tuesday 19:30 UTC
Set by moderator on 6 September 2011.
cotto whiteknight, better to fix parrot, but that's much harder 00:18
or so I'm told. It's one of those ideas I've inherited without testing. 00:19
00:21 slavorg joined 01:08 benabik joined 01:28 bluescreen joined 01:31 jsut_ joined
dalek sella/harness_test: 35f5d7e | Whiteknight++ | / (4 files):
Add in some global accessors for Harness to get factories for TestExecutor, TapParser, and FileResult objects. The user can override these factories to provide different instances. Rearrange Harness a little bit to take advantage and make TestExecutor more testable
01:35
sella/harness_test: 03dbe25 | Whiteknight++ | s (2 files):
Fix setup.winxed to exit(1) when there is an error. +some comments and small cleanups in Harness
sella/harness_test: c45a149 | Whiteknight++ | / (2 files):
+tests for the new Harness accessor methods
sella/harness_test: ec3b15d | Whiteknight++ | / (2 files):
Stub tests for TestExecutor
sella/harness_test: e2a8dc5 | Whiteknight++ | / (8 files):
Several Harness test fixes
sella/harness_test: 09c731e | Whiteknight++ | src/harness/TapParser.winxed:
Change TapParser to be more intelligent about whitespace, which fixes error reporting.
sella/harness_test: 68c099b | Whiteknight++ | / (3 files):
Trim out newlines from the tap stream. Fix parsing of TODO to be more robust.
sella/harness_test: ca77256 | Whiteknight++ | t/tap_harness/Harness/TestRun/Factory.t:
+tests for TestRun.Factory
01:47
01:56 Coke joined 01:57 bubaflub joined 01:59 woosley joined 02:11 Coke joined 02:26 Coke joined 03:15 Coke joined
dalek kudo/nom: 9d6d7dd | moritz++ | src/Perl6/Metamodel/ (2 files):
MRO optimizations by mls++
05:07
rrot/win64-workaround: ff18696 | cotto++ | config/auto/sizes.pm:
less incorrect fix (plus comment) to force long long intval on msvc/x64
05:11
rrot/win64-workaround: 107f638 | cotto++ | / (2 files):
Revert "first try to force sizeof(void*) == sizeof(INTVAL) on 64-bit windows"

This reverts commit 0950a0066a7ff1de911104c0553f840385314ee8.
cotto aloha, clock?
aloha cotto: LAX: Tue, 22:11 PDT / CHI: Wed, 00:11 CDT / NYC: Wed, 01:11 EDT / UTC: Wed, 05:11 UTC / LON: Wed, 06:11 BST / BER: Wed, 07:11 CEST / TOK: Wed, 14:11 JST / SYD: Wed, 15:11 EST
05:21 SHODAN joined
dalek sc: 7f22440 | cotto++ | timeline.md:
Merge remote-tracking branch 'wk-timeline-gist/master'
05:30
sc: 37bb054 | cotto++ | timeline.md:
Merge remote-tracking branch 'pm-timeline-gist/master'
05:31
cotto git is fun! 05:34
05:42 rfw joined 06:15 davidfetter joined 07:01 UltraDM joined 07:26 mj41 joined 07:37 kthakore joined 07:43 jtpalmer joined 08:14 jsut joined
dalek kudo/nom: f2857b7 | (Timothy Totten)++ | src/core/IO/Socket/INET.pm:
IO::Socket::INET.accepts now returns the connected socket
08:31
09:11 TiMBuS joined 09:12 dodathome joined 09:17 tcurtis joined 09:27 Coke joined
dalek p: 8ba6001 | moritz++ | src/how/NQPClassHOW.pm:
MRO calculation optimization by mls++
09:36
Tene dukeleto: I'm no longer on-call at work tomorrow, so I might be able to finally work on Parrot tomorrow night. 09:50
10:17 ambs joined 11:18 mj41 joined 11:20 felixdo joined 11:35 Psyche^ joined 12:22 whiteknight joined
whiteknight good morning, #parrot 12:23
atrodo =~ 12:39
12:40 benabik joined 12:51 honza joined
benabik o/ 12:51
12:52 alvis joined 12:53 alvis joined 13:11 mtk joined
honza Hi, I am going to make an interpretter for a Smalltalk-like language. Is there any possibility to create bytecode file with dynamically created objects in runtime with Parrot? 13:14
moritz you can freeze objects, store them in .pbc files, and then thaw them 13:16
is that what you want to know?
honza can i use one pbc file as an image? 13:17
moritz it seems that the freeze opcode creates a string 13:21
so you could embed the result of a freeze as a constant
though note that parrot's freeze/thaw mechanism isn't all that general (at least not general enough to serialize Perl 6 classes :/ ) 13:22
honza what's missing?
benabik moritz: I've been wondering about that? Is that due to 6model or just freeze/thaw being insufficently clever?
moritz last I looked, we needed some way to freeze recursive structures, but stop at certain boundaries 13:23
whiteknight plobsing added backreferences a while back. I don't know if that covers all use-cases 13:24
honza I need it too, but whole tree of objects.
whiteknight honza: We can create bytecode and insert arbitrary constants into it. I don't think we have any users stress-testing the features so I'm sure there will be rough edges 13:25
benabik moritz: Rakudo needs to freeze _most_ of a tree?
s/tree/graph/
whiteknight the bytecode system is one that we are planning a lot of work on, so feedback and feature requests would be very good
moritz benabik: correct 13:26
benabik: suppose you write class Foo is Int { }
benabik: class Foo needs to be serialized, and all its dependencies, except those which are already in the setting 13:27
benabik Oh. Need to free Foo and connect it with the main Int when loaded. Fun.
*freeze
whiteknight I think that's the last part we are missing. We do have the backreferences, but we don't have the ability to partially freeze objects like that and reassemble 13:30
arnsholt IIRC jnthn will start working on that Real Soon Now for NQP 13:31
whiteknight I would really much rather have it done directly in Parrot, if possible
moritz 6guts.wordpress.com/2011/09/13/what...eroctober/
13:32 benabik_ joined
honza moritz: thank you for the information. Please, can you send me some link with example of freezeing object and thawing them? 13:33
moritz honza: t/pmc/freeze.t in the parrot repo 13:34
github.com/parrot/parrot/blob/mast...c/freeze.t 13:35
honza moritz: my beginner question - can be this code executed in a pir file? 13:46
moritz honza: that code is a perl script that contains lots of little runnable PIR scripts 13:47
each of which can be run as a PIR file 13:48
honza moritz: thank you :) I will test it. 13:49
14:15 alvis_ joined, alvis left 14:29 contingencyplan joined
dalek sella/gh-pages: 9049485 | Whiteknight++ | libraries/ (2 files):
Updates to Harness and Query docs. Add new classes to Harness and some updated descriptions. Add information about Streams to the Query docs. Some of these later docs aren't 100% accurate because Streams need a refactor.
14:31
benabik docs++ 14:33
whiteknight++ # documentation? that's crazy talk
;-)
14:46 ambs joined
dukeleto ~~ 15:08
honza Where can I find assigment PMC -> library, for example File -> io_ops, please? 15:18
moritz honza: it's called 'grep' or 'ack' and is used on the parrot source tree 15:19
I don't think there's a better way :(
whiteknight honza: what do you mean? 15:21
honza I don't know which library I have to load for e. g. 'OS' oject 15:22
object
whiteknight loadlib "os" 15:23
honza thank you :) but it would be nice if there were helpful comments at the headers of the PMC
whiteknight We can add that 15:24
honza for newbies it would be excellent 15:25
dalek p: f3b8f73 | (Michael Schroeder)++ | src/how/RoleToClassApplier.pm:
copy has_method implementation over from perl6

The perl6 implementation uses the method_table instead of iterating over all methods. It ignores $local for now, this may need to be fixed in the future.
15:32
16:04 SHODAN joined 16:05 ambs joined
honza Can someone explain to me the difference between an attribute and a property? 16:21
16:22 dmalcolm joined
sorear honza: the Parrot Way it to use multiple names for the same thing in some places and the same name for different things in others. Can you be more specific about what you mean by each? 16:24
honza sorear: are there situations where properties should be used instead of attributes? 16:25
sorear honza: what do you mean by "properties" and "attributes"/ 16:26
both terms are used for multiple things in the source
honza I have found it - properties can be acessed as key in associative arrays and hold additional information about PMC 16:30
sorear that's not all they do
honza what's the rest?
sorear well, are you talking about getprop properties, or OO properties, or something else? 16:32
whiteknight attributes are things that objects in a class has
dukeleto honza: so you would like a document that describes all core libraries and which functions they contain?
whiteknight so a class has an attribute, and objects of that class also have those attributes. These are things you see in most languages
properties are named values that can be set on an instance, and have nothing to do with the class
dukeleto honza: also, are you asking questions about writing PIR ?
sorear whiteknight: how can you be so sure that honza is talking about getprop and getattribute?
whiteknight honza: for most uses, you probably want attributes
sorear whiteknight: I wish people would help us help them 16:33
whiteknight sorear: in the context of Parrot, that's what those two words mean
dukeleto honza: or perhaps a searchable web interface?
honza: we definitely need to make our documentation friendlier. Suggestions are very welcome. 16:34
honza thank you all very much. It's clear. 16:37
dalek kudo/nom: f8301da | Coke++ | t/spectest.data:
track failures, run fudges.
Coke sorear: I'm not sure what was unclear about his question. 16:41
I think you might be a little to close to the internals if that was confusing.
sorear ok. 16:43
16:59 HSlayer|2 joined 17:12 mj41 joined
dalek sella/gh-pages: 223991a | Whiteknight++ | libraries/ (3 files):
a few fixes/additions to Core docs
17:18
sella/query_streams: bd0b66e | Whiteknight++ | s (3 files):
Query.Queryable.Stream -> Query.Stream. Make it not a Queryable anymore. Small cleanups to the source
17:19
cotto I'm thinking about m0 again. Is there any reason to support short (16-byte ints) as a type? 17:23
I don't see one, but it seems like a good idea to ask before rejecting the idea 17:24
whiteknight cotto: lots of users have asked for various-sized integer types 17:27
I think we can't go wrong if we offer, even if it's not optimized for performance, access to 8- 16- and 32-bit integer values
or, if we have an easy buffer type that allows those types to be used pretty easily 17:28
In either case, I know people do ask for them
dukeleto but what datatypes does m0 need to understand natively? 17:32
whiteknight: i agree that we should have them, but i am not quite sure if m0 needs to know about all of them
whiteknight that's what I'm saying, we don't need to optimize for them, but we need a mechanism for working with them 17:37
I know Rakudo wants them, and we don't want to make a short-sighted system that they are just going to have to work around 17:40
mls hi parrot folks! 17:47
what's the background of imcc not setting the line number for lines that don't start with whitespace? 17:48
(should have said: updating the line number) 17:49
cotto_work ~~ 17:52
mls oh, there's ticket #1652, please ignore the noise ;) 17:53
17:56 fperrad joined
whiteknight mls: bad decisions were made. We're not proud of it 17:58
bubaflub whiteknight: don't know if you saw it, but amber-lang.net/ is smalltalk running on top of JS, maybe something fun for jaesop in the future 17:59
whiteknight bubaflub: yeah, maybe
bubaflub: We really are going to need 6model for stage 1, and we can't do anything fun like that before stage 1
17:59 benabik joined
mls Is it ok to insert an extra SET_LINE_NUMBER in the "return SUB" case, so that ops profiling knows where subs begin? 17:59
(I mean return SUB in imcc.l) 18:00
bubaflub whiteknight: yeah, i'm looking forward to that. hopefully cardinal will take off again.
whiteknight mls: please do. So long as it doesn't break any important tests
where "important tests" are those tests that wouldn't have broken anyway
bubaflub: yeah, 6model should do a hell of a lot to help several languages
benabik o/
whiteknight I would love to see cardinal get moving again 18:03
dalek kudo/nom: 6c9731a | moritz++ | src/Perl6/Grammar.pm:
die on use of match variable in declaration
18:05
bubaflub whiteknight: a lot of Rubinius is written in Ruby and I wonder how much we can steal / borrow from them 18:08
whiteknight bubaflub: if we go the bootstrapped way, probably a lot
write stage 0 in NQP/PCT or whatever, write stage 1 mostly in Ruby 18:09
bubaflub whiteknight: yeah, that's what i'm hoping for. i know we'll have to put in a lot of work for the Object system and probably clean up some of the syntax stuff, but i'm thinking we won't have to focus on the stdlib stuff
whiteknight the boundaries where Rubinius had to resort to lower-level code probably forms the same boundary that we have to use
Tene We can't really borrow anything from rubinius until we have a good object model. 18:10
whiteknight right, that part is first
sorear what's Rubinius again?
whiteknight and 6model plays a big part of that
tadzik sorear: Ruby implementation in Ruy 18:11
Tene We can't even really steal from any of the test suites, as they all use test libraries that rely on monkey patching and other advanced object model features.
tadzik iirc
Tene they're not really intended for implementations in-progress.
whiteknight Tene: did you have anything written for moving Cardinal to 6model? I know you were talking about it, I don't know if you have any fragments around half written 18:12
Tene but, that's approximately the plan I intended.
benabik Tene: The conversation started with "after 6model we could…" Also, somewhat sadly, monkey patching is a somewhat basic part of ruby
Tene whiteknight: yeah, I have some notes in ink in a notebook, and an implementation that fails pretty badly.
tadzik sorear: oh pardon, the vm itself seems to be in cpp
whiteknight Tene: more than the rest of us have. you have a scanner?
Tene The implementation is doing it wrong, and isn't properly factored. 18:13
whiteknight: I'm not on-call anymore, and I actually got some sleep last night, so I might be able to work on Parrot stuff tonight.
Hopefully.
First is documenting HLL interop stuff for dukeleto. 18:14
whiteknight Tene: I don't want to put you straight to work if you need some time to relax!
Tene After that, I'd love to talk about cardinal 6model stuff
whiteknight awesome, definitely something good to talk about
dukeleto Tene++ # docs please 18:18
whiteknight dukeleto: you're insatiable! 18:19
Tene whiteknight: would you really prefer that he said "You know what? I think we have enough Parrot. Let's stop here." 18:20
whiteknight I didn't say it was a bad thing!
Tene :)
dukeleto whiteknight: indeed, i am 18:26
18:36 jsut_ joined
cotto_work whiteknight: didn't you have a 64-bit windows install somewhere? 19:15
whiteknight cotto_work: I have one here at work. I haven't had a chance to play with the branch 19:18
19:25 alvis joined
dukeleto i have been coding in perl for 15 years and I still can't ever remember if it is ~= or =~ 19:31
arnsholt Which is why Perl 6 replaces it with ~~ =) 19:32
tadzik Perl 6 has ~= too :P 19:34
TimToady and =~ :) 19:35
benabik Blarg?
NotFound Spain is different. Amazon has opened here, and is cheaper to buy in amazon.uk than locally.
tadzik oh noes, what have we done!
cotto_work and == 19:36
NotFound Do you have =: ?
TimToady not yet
NotFound Good, winxed innovates something.
benabik What's =:? 19:37
NotFound assign
(in pir terms) 19:38
benabik What's that make = ? (Pardon if I'm being slow today.)
NotFound set
benabik set is register, assign is VTABLE?
cotto_work there's not a very good distinction between those concepts in pir 19:39
whiteknight I didn't know Winxed had =: 19:41
NotFound And its related vtables are aslo funny.
whiteknight: ack for it the winxed sources and you'll see is heavily used. 19:43
Is what allows to write fast closures. 19:44
whiteknight what do you mean? 19:45
NotFound It avoids the need to constantly load and store var lexicals. 19:46
(if you are careful)
cotto_work most interesting 19:48
benabik Grab the PMC and assign to it, rather than store a new value?
NotFound benabik: yeah
More funny: a[1] = 1; => $P1[1] = 1 ----- a[1] =: 1; => $P2 = $P1[1] \\n assign $P2, 1 19:52
whiteknight ...is that actual code, or did you break your keyboard? 19:57
cotto_work +1
I especially like the ----- operator
whiteknight really, really decrement
also "subtract like crazy" 19:58
cotto_work quit being so negative ;]
NotFound --++ 20:00
dalek kudo/nom: 16bb82c | jnthn++ | src/core/Enum.pm:
key and value should declare themselves as public attributes in Enum.
20:07
whiteknight NotFound: so how do you use that for cheap closures? 20:09
NotFound More cleanly:
winxed:
a[1] = 1;
gives
$P1[1] = 1
winxed:
a[1] =: 1;
gives
$P2 = $P1[1]
assign $P2, 1
whiteknight ...and somewhere in there is an optimization for closures? 20:11
NotFound whiteknight: no, this is just a more funny usage without lexicals involved. 20:12
whiteknight okay
benabik whiteknight: Instead of having to many find_lex, store_lex he uses one find_lex and many assign.
NotFound For closures, using =: avoids the need to use the 'volatile' modifier and don't generate store_lex 20:13
You just need to avoid mixing inadvertently = and =: with the same var.
whiteknight there's a volatile modifier?
are we talking about the same language?
NotFound whiteknight: yes, plobsing asked for it short after introducing lexicals. 20:14
whiteknight Are there examples about what it does?
NotFound I've not used it yet.
whiteknight I want to add ops for typed attribute access soon. I was going to prototype them last night but ran out of time 20:15
I might add them tonight
NotFound It just generates a find_lex in all lexicals reads, instead of using just one at the start of the sub. 20:16
whiteknight oh, okay
NotFound That makes closures more complicated in winxed than in javascript, but allows shorter and faster generated code. 20:18
20:32 ttbot joined 20:43 contingencyplan joined
Coke any reason for =: over := for winxed binding? 21:43
dalek Heuristic branch merge: pushed 85 commits to rakudo/optimizer by jnthn 21:47
Heuristic branch merge: pushed 40 commits to rakudo/nom-buf by tadzik 22:00
kudo/nom: ed8f4ad | tadzik++ | t/spectest.data:
Run S06-advanced_subroutine_features/callsame.t
kudo/nom: 867ebd6 | jnthn++ | src/core/control.pm:
Add a cheating &warn to avoid meta-errors.
22:41
kudo/nom: 12b860d | jnthn++ | src/core/Temporal.pm:
A doubled 'or' caught by work in the optimizer branch.
22:44 Coke joined
dalek kudo/optimizer: ed8f4ad | tadzik++ | t/spectest.data:
Run S06-advanced_subroutine_features/callsame.t
22:45
kudo/optimizer: 1088154 | jnthn++ | src/Perl6/Optimizer.pm:
Stub in some check-time failure/warning infrastructure. First cut of detecting undeclared routines; fails on building CORE.setting.
NotFound Coke: = is used for the more javascriptish meaning, I thought that using := for assign will be confusing. Using a symbol with less history forces users and readers to think about it.
kudo/optimizer: e98e205 | jnthn++ | src/Perl6/Optimizer.pm:
Don't complain about calling routines that we get passed as &foo style parameters.
kudo/optimizer: 867ebd6 | jnthn++ | src/core/control.pm:
Add a cheating &warn to avoid meta-errors.
kudo/optimizer: 12b860d | jnthn++ | src/core/Temporal.pm:
A doubled 'or' caught by work in the optimizer branch.
kudo/optimizer: 6bb0357 | jnthn++ | / (3 files):
Merge branch 'nom' into optimizer
22:53 whiteknight joined
dalek rrot/whiteknight/native_attrs: 1d08697 | Whiteknight++ | / (5 files):
Add in getattribute and setattribute variants for native types. Right now they do the same boxing/unboxing, but in the future they might be replaced with real native attribute access
22:54
sella/harness_test: 4daeac7 | Whiteknight++ | / (6 files):
Implement several tests. Only the FileResult tests are failing now, and I'm setting up a mock infrastructure for them
22:56
sella/harness_test: 353cd78 | Whiteknight++ | / (2 files):
Tests for FileResult
sella: 03dbe25 | Whiteknight++ | s (2 files):
Fix setup.winxed to exit(1) when there is an error. +some comments and small cleanups in Harness
sella: c45a149 | Whiteknight++ | / (2 files):
+tests for the new Harness accessor methods
sella: ec3b15d | Whiteknight++ | / (2 files):
Stub tests for TestExecutor
sella: e2a8dc5 | Whiteknight++ | / (8 files):
Several Harness test fixes
sella: 09c731e | Whiteknight++ | src/harness/TapParser.winxed:
Change TapParser to be more intelligent about whitespace, which fixes error reporting.
sella: 68c099b | Whiteknight++ | / (3 files):
Trim out newlines from the tap stream. Fix parsing of TODO to be more robust.
sella: ca77256 | Whiteknight++ | t/tap_harness/Harness/TestRun/Factory.t:
+tests for TestRun.Factory
sella: 4daeac7 | Whiteknight++ | / (6 files):
Implement several tests. Only the FileResult tests are failing now, and I'm setting up a mock infrastructure for them
sella: 353cd78 | Whiteknight++ | / (2 files):
Tests for FileResult
sella: 16f8ad3 | Whiteknight++ | / (31 files):
Merge harness_test branch. Fix conflicts
sella: e036fbf | Whiteknight++ | s (3 files):
Add 'winxed_debug' arg to Distutils wrapper to build winxed files with --debug
sella: 03e6688 | Whiteknight++ | src/harness/ (2 files):
Fix up TestFile.PIR
kudo/optimizer: bfcf87a | jnthn++ | src/Perl6/Compiler.nqp:
While in the optimizer branch, turn optimizer on by default, for easier testing.
23:08
kudo/optimizer: 4cba402 | jnthn++ | src/Perl6/Optimizer.pm:
Avoid some inlines when we might screw up the workings of control exception handlers (like with given/when). This fixes the spectest regressions that we got from the immediate block inlining optimization. (We now fail some tests, but it's because the tests have undeclared routines, which the optimizer complains about at CHECK time; these tests need fixing.)
23:10 plobsing joined
whiteknight msg cotto can you please take a look at the whiteknight/native_attrs branch? We talked about it at #ps a few weeks ago 23:14
aloha OK. I'll deliver the message.
cotto_work whiteknight: I'm here 23:15
whiteknight okay. It's a simple patch. 23:16
cotto_work no it's not. It nearly killed firefox. 23:17
;)
hard to criticize the implementation 23:18
I'll give it a better look and remind myself of its motivation this evening. 23:19
whiteknight the motivation is that we can start making HLLs, like winxed, pretend to have native-typed attrs
until we get 6model and make it a reality
cotto_work whiteknight: looks good to me. Throw it at NotFound and see what happens. ;) 23:25
whiteknight also, we're merging kill_threads soon, unless somebody yells "stop" real soon
NotFound: ping
sorear wonders how the 6model merge will work 23:28
whiteknight sorear: you want to get involved? We need more hands
you can help shape it 23:30
NotFound whiteknight: pong
whiteknight NotFound: I just pushed a whiteknight/native_attrs branch. Very straightforward. Adds ops to getattribute/setattribute native types. How quickly could Winxed add support?
I could put together a patch if you think it would be easy
or, you can do it if you want it done the right way :) 23:31
NotFound Too late for me now, I'll take a look tomorrow
sorear whiteknight: sadly I'm quite booked for now 23:32
whiteknight NotFound: okay, no rush. Let me know if you like these ops. I can merge them soon if they are good 23:33
ANYBODY HAVE ANY RESERVATIONS ABOUT A kill_threads MERGE? It's happening in a few minutes if nobody says anything 23:35
cotto_work whiteknight: www.youtube.com/watch?v=u6ALySsPXt0 23:36
whiteknight bleh, I just got a failure in t/pmc/timer.t after the update from master 23:37
plobsing whiteknight: yes, I have a reservation for kill_threads. I beleive it was for now o'clock under the name "killy mckillerson". 23:41
whiteknight :)
cotto_work You don't want to get that guy's name wrong. 23:43
whiteknight Timers!!! 23:44
whiteknight hates
if hate for software was a muscle, mine would be ripped 23:45
plobsing if software didn't suck, we'd be out of a hobby. 23:46
cotto_work whiteknight: is it failing reliably?
whiteknight yeah
cotto_work Timers, I am disappoint.
whiteknight: passes for me 23:50
whiteknight yeah, I updated the branch from master and the failure appeared 23:51
dalek rrot/whiteknight/kill_threads: 405ca66 | NotFound++ | ext/winxed/driver.pir:
update winxed snapshot to 0de3efd454
23:56
rrot/whiteknight/kill_threads: 0223380 | Whiteknight++ | / (73 files):
merge master into kill_threads. fix conflicts
rrot/whiteknight/kill_threads: 4f52f73 | Whiteknight++ | src/interp/inter_cb.c:
Merge branch 'whiteknight/kill_threads' of github.com:parrot/parrot into whiteknight/kill_threads
whiteknight cotto_work: pull that, and see if you get a failure 23:57
cotto_work doing so naough 23:58