Parrot 3.10.0 "Apple Pi" | parrot.org | Log: irclog.perlgeek.de/parrot | #parrotsketch meeting Tuesday 19:30 UTC
Set by moderator on 16 November 2011.
dukeleto is creating a VM to host a parrot continuous integration system on the OSUOSL supercell things 00:02
thingy, rather. It is a technical term.
cotto a very important one
dukeleto: while you're there, see how long fulltest takes on one of the beefy machines. Using someone else's hardware to cut releases could potentially speed up the process quite a bit, given that much of it involves waiting for tests to run. 00:05
and benabik++, just because 00:06
dukeleto cotto: gcc compile farm. gcc110 has 64 cores.
cotto dukeleto: that's the one I'm thinking of. 00:07
dukeleto cotto: we have 8 cores to play with at osuosl
cotto dukeleto: that's also acceptable
;)
00:20 kid51 joined 00:25 RobertLJ joined
whiteknight msg benabik I tried to disasm rosella/core.pbc. It threw an exception "Method 'get_type' not found for invocant of class 'PackfileAnnotation'" 00:34
aloha OK. I'll deliver the message.
01:02 RobertLJ joined 01:08 woosley joined 01:10 woosley joined
dalek CT: 3c55d8a | Whiteknight++ | src/disasm.winxed:
If we don't have an annotations segment, don't try to access it. This avoids null pmc errors for certain inputs
01:20
CT: fb2b25d | Whiteknight++ | src/disasm.winxed:
Update disasm.winxed to handle :named, :named/:slurpy, :optional, and :opt_flag parameters.
01:26 woosley joined
dalek CT: 53bd5d5 | Whiteknight++ | src/disasm.winxed:
Keep track of the Sub start and end offsets. While dumping bytecode, print out where the individual subroutines start/stop. This helps give us some valuable landmarks while reading the bytecode dump
01:39
whiteknight msg benabik I hope you don't mind I made a few fixes and feature additions to PACT/disasm.winxed. Can disassemble rosella/core.pbc now and gives more information about subs and args 01:41
aloha OK. I'll deliver the message.
whiteknight What I think we are really going to want to do here is refactor this out into a complete disassembly and bytecode analysis library 01:50
because we basically have all the information we would want to disassemble up to PIR. Some frozed PMC types we obviously can't disassemble, but most of the rest we can jam into :immediate subs 01:51
sorear whiteknight: IMO we should have a .const syntax for _any_ freezable object that just uses a frozen binary:"" string 02:04
or whatever the byte string syntax is now
whiteknight sorear: plobsing was working on such a thing.
sorear: but yes, it's a recognized need and something we are, theoretically, working towards
sorear Rakudo wants to move in a direction of storing classes and whatnot in the constant table
that requires either ditching PIR or extending PIR 02:05
whiteknight sorear: yes, we have :immediate subs which can be used for that purpose, again theoretically
sorear ...if I put it like that it almost sounds like an argument for not extending PIR
whiteknight and when we update PCT, we will have improved ability to serialize arbitrary compile-time pmcs
we are ditching PIR. It's a slow but inevitable process 02:06
sorear PCT is not the whole story, it is useful to be able to save .pir files and have stuff work
whiteknight eventually we will bootstrap and output packfiles directly
sorear c.f. the NQP bootstrap
whiteknight: do you have an answer yet for making packfiles work on multiple Parrot versions?
whiteknight sorear: it's not a problem I've been working on personally. I know we are further along, but the opcode set changes too frequently to be allowing arbitrary backwards compatibility 02:07
sorear whiteknight: we need to allow compatibility *even if the opcode set changes* 02:08
whiteknight we can't do that until we have lorito
lorito will allow us to include op definitions in the packfile
sorear what about when you change the lorito definitions?
I guess versioning 02:09
whiteknight lorito ops will be far fewer in number, much more controlled, and more atomic
PIR ops will be built from lorito ops, 02:10
or, whatever the future equivalent of PIR is
02:12 schmooster joined
dukeleto ~~ 02:13
whiteknight lemmetellyouwhat, this disassembler is already showing me some obvious places for optimizations 02:19
dalek CT: 161b06e | Whiteknight++ | src/disasm.winxed:
refactor out logic to print a PMC constant into a separate function. Use that new function to print PMC values inline when printing bytecode.
02:20
02:26 jsut joined
whiteknight like, for some reason, it looks like there's an extra set_returns and returncc opcode added at the end of every sub 02:37
or, not all, but many 02:38
that looks like an IMCC addition, not a winxed one
also, it looks like IMCC is inserting a get_results call after ever sub invocation, whether it's necessary or not 02:40
winxed seems to be outputting a .const 'Sub' foo = 'foo' call, which turns into a set opcode too early. So we end up doing the set whether we ever enter a branch which makes that call 02:43
02:46 benabik joined
benabik o/ 02:47
whiteknight: PACT master currently requires the change I made in Parrot master to get more information out of annotations.
whiteknight benabik: did you commit that change to parrot master? 02:48
benabik Yes.
2001ad8
whiteknight ah, yeah. Somehow I didn't pull
or, I thought I pulled but it didn't do
benabik: I hope you don't mind me playing in your code 02:50
but this disassembler is too awesome to not touch
benabik If I wanted my own private playground it'd be in benabik/PACT, not parrot/PACT
whiteknight Once we get the algorithms down, I think we need to start breaking out the logic into a library and a driver 02:51
benabik Yeah. The idea was to figure out what was in a Packfile and try to load it into some kind of PACT::Node structure 02:53
whiteknight I have a million little changes I want to make to the generated display, but I'll save all those till later. Once we get all the core logic factored out, it will be trivial to have a subclassable emitter class 02:57
benabik The display was really just for "am I doing it right".
Although I'm somewhat to the point where I want to put thought into PACT assembly.
whiteknight yeah, where we go from here is up 02:58
benabik++ 02:59
okay, I'm off to bed. More playing tomorrow 03:00
benabik 'night 03:01
dalek CT: 7af8731 | benabik++ | src/disasm.winxed:
disasm: Re-indent

90% of the code uses tabs. Fix the other 10%.
There's more than one person editing now. I suppose some thought should go into code standards soon.
03:06
whiteknight sorry, my editor is set to use spaces instead of tabs 03:08
anyway, out!
benabik aloha: msg whiteknight I generally prefer tabs, but really the lack of consistency is what bothered me. :-D 03:12
aloha benabik: OK. I'll deliver the message.
benabik Hm. Segfault disassembling PCT/PAST.pbc printing a Key. 03:16
In Parrot_io_write_buffer 03:17
That's odd. 03:47
src/call/context.c:682: failed assertion 'Parrot_pcc_get_regs_used(interp, ctx, REGNO_STR) > idx'
bacek_at_work benabik, looks like Key was collected by GC already 03:48
benabik, and has some weird data inside
benabik bacek_at_work: It should be referenced by the Packfile I just loaded. 03:49
bacek_at_work Packfiles aren't properly marked
benabik Should be referenced by the FixedPMCArray I built from the Packfile?
bacek_at_work And "register" Keys are highly coupled with CallCOntext
benabik Register keys? 03:50
bacek_at_work KEY_register_FLAG
something like "[$S0]"
benabik It may be a key attempting to reference a register that doesn't exist.
bacek_at_work which doesn't store string, but register no
so
benabik And tries to reference the register when printed. That's the problem.
bacek_at_work if you try to access this Key in wrong context it will die 03:51
dalek CT: 82f61fe | benabik++ | src/disasm.winxed:
disasm: Don't print keys

Keys can refer to registers that won't exist in the disassembler code. This is... bad, to say the least. For now, just disable printing them. Long term, we're going to need better key introspection.
04:01
sorear er... is there any way to, given a bytecode offset, find the correct Sub to get register info from? 04:02
benabik That can probably be figured out, but the issue is that the Key code hits a Key that says [$S100] and then tries to read the value from that register in the current sub. 04:03
I'd prefer to have the disassembler walk the key and print the register reference. 04:04
sorear you can't change it to just say [S99]?
sorear wonders if the limit on S00-S99 in PASM has been removed yet
benabik I might be able to do that in C-land, but I'd prefer if there's a programmatic way to find that. 04:05
Also, I'd rather not change the current behavior in case someone's using it.
sorear hopes the disassembler is using S99 and not $S99
benabik I currently having it print $ for registers because I'm used to it. 04:06
cotto 'evening 05:19
tadzik 'morning 06:55
cotto that too 07:03
08:17 mj41 joined 09:19 lucian joined
mls morning 09:25
09:25 rurban joined
mls whiteknight: the extra set_returns/returncc gets added by imcc, see expand_pcc_sub() in pcc.c 09:26
it checks if the last op is ret/exit/end/branch/returncc. If it's neither, it adds a return 09:27
09:28 dngor joined
mls benabik: I patched pbc_dump for the same reason, see commit 09210aa9 09:28
10:06 GeJ_ joined 10:20 ambs joined 11:40 JimmyZ joined
dalek rrot/kill_constants: 279d10c | bacek++ | / (12 files):
Revert "Remove Parrot_pmc_new_constant* functions"

Let's do it in smaller steps.
11:46
rrot/kill_constants: d229dc6 | bacek++ | src/gc/ (2 files):
Mark code segment.

We'll need it when we stop generating constant Keys and other PMCs in IMCC.
rrot/kill_constants: d555d17 | bacek++ | src/key.c:
Fix braino in marking Key.
rrot/kill_constants: e207e6b | bacek++ | compilers/imcc/pbc.c:
Don't generate 'constant' PMCs in IMCC
12:12 Psyche^ joined 12:33 bluescreen joined
dalek rrot: 7ad205b | mls++ | / (7 files):
add 'peek_exception' op as workaround for pct relying on .get_results to get the exception

  .get_results clears the call object, so we cannot use it to get the exception
when HLL code also relies on .get_results returning the exception. Thus, the new op returns the exception without clearing the call object. This op can be removed again if PCT provides a different mechanism to get the exception and all HLLs use the new mechanism.
12:49
12:57 JimmyZ_ joined 12:58 benabik joined
benabik o/ 12:59
mls \\o benabik!
about key segfaults: I patched pbc_dump for the same reason, see commit 09210aa9 13:00
benabik Yeah, saw that message. 13:01
I think there's enough functions to reasonably print it in C-land, but I'd love to introspect them from inside the VM.
mls yeah, it seems insane that it relies on the current ctx
meeting -> afk 13:02
benabik It makes some sense for what they're designed for. You'd like get_hll_global ['Namespace';$S0] to find the current value of $S0. 13:03
13:13 whiteknight joined
whiteknight good morning, #parrot 13:13
benabik o/ whiteknight 13:36
13:37 JimmyZ joined 13:40 Kovensky joined 13:53 mtk joined
dalek sella/event_4: acd78bf | Whiteknight++ | / (9 files):
Start fleshing out new Event library, to try and take advantage of green_threads and other upcoming changes
14:19
sella/event_4: 9c27e55 | Whiteknight++ | src/event/Queue.winxed:
Remove unnecessary Queue class
benabik I had a random thought: Could we avoid some of the pain of inferior runloops by making them tasks? Instead of having nested C-Parrot-C-Parrot, we would go C-Parrot-C-Wait for task and then have a new C-Parrot task. Slightly complex to set up, but might avoid some of the pain of trying to manage both the contexts and C stack. 14:21
(I have not investigated to determine if this would actually help, just an idea that popped into my head.) 14:22
whiteknight benabik: it depends on the context. I suspect we would not be able to do it for most uses
you lose anything like a guarantee of sequential ordering, and you lose the ability to get a return value in a timely manner 14:23
benabik Well, the origin task would be blocked until the inferior task returned, so it shouldn't goof ordering. 14:24
Timeliness is a bit of an issue, I suppose.
dalek sella/event_4: 91d1560 | Whiteknight++ | / (5 files):
Fix existing event tests
14:36
14:47 whiteknight_ joined
dalek rrot: 8e7bd15 | mls++ | src/ops/core.ops:
correct documentation for peek_exception
15:04
rrot: 7b50a14 | mls++ | compilers/ (6 files):
Support direct lexinfo access with ".const 'LexInfo' $P0 = <subid>"
15:14 ambs joined 15:23 alester joined
dalek rrot: a8cb7da | petdance++ | src/gc/gc_gms.c:
consting local vars
15:23
NotFound benabik: the problem is how and were to decide to launch a new task. Usually you don't know. 15:46
dalek sella/event_4: 4dd20ee | Whiteknight++ | setup.winxed:
Event doesn't rely on Action anymore
15:51
sella/event_4: dff8cba | Whiteknight++ | src/ (5 files):
Add a new function get_winxed_compiler, because a basic compreg call will fail if we haven't loaded the language yet. Use that in a few places to standardize access
sella/event_4: c8b788d | Whiteknight++ | src/ (5 files):
Merge branch 'master' into event_4
sella/event_4: 0f09670 | Whiteknight++ | / (11 files):
autogenerate tests for new event library. Fill most of them in, with stubs at least
sella: dff8cba | Whiteknight++ | src/ (5 files):
Add a new function get_winxed_compiler, because a basic compreg call will fail if we haven't loaded the language yet. Use that in a few places to standardize access
15:51 whiteknight joined 15:54 plobsing joined 16:14 bluescreen joined
Coke I have a local HS teacher who is interested in getting some of his students enrolled in GCI. Any pointers for "how to get started", esp if he's interested in targetting parrot tasks specifically? 16:41
whiteknight Coke: Most prep that needs to be done right now is on our end, eg creating tasks 16:43
Getting in touch with us, and telling us what kinds of tasks his students are interested in is a good idea
dukeleto ~~
whiteknight so we can know to create more tasks specifically like that
dukeleto we need to make lots of tasks this weekend, since there are only 2 times that tasks go out: this Monday, and half-way through GCI
whiteknight Coke: coming in and chatting with us, and saying hi, and getting familiar with the code is a good idea too
dukeleto they are changing it up this year. I just learned of this. 16:44
whiteknight dukeleto: oh, crap
dukeleto whiteknight: yeah
whiteknight last year we had a very prolific rolling system
dukeleto Coke: feel free to do an email intro to the HS teacher and me
whiteknight Man, we need to get moving on tasks. That scheduling change is a bear 16:46
I'll have to get some Rosella and Jaesop tasks set up. Maybe PLA too, if that's working right still
I wonder if NotFound needs any work done on Winxed, that an inexperienced hand might attempt 16:48
benabik I'd suggest tasks for PACT, but it's still in the exploration stages. 16:49
whiteknight keep a list together in your head or somewhere else in case it's ready for more help around midterm
benabik There's a TODO.mkd in the repo for a reason. :-D 16:50
whiteknight okay, we'll mine that for tasks when we're ready 16:51
if alester weren't doing such an awesome job with automating the migration, I would suggest that we could use ticket copying as a task 16:53
"move 10 tickets from trac to github, keeping necessary references and metadata, etc"
dukeleto whiteknight: meh, it would be useful for us, but i don't think students would get much out of it 16:56
whiteknight: i think students will enjoy working on various parrot languages and libraries
whiteknight: i have been putting a "gci" label on github issues that I think would be good for gci students
wow, lots of good stuff happening in PACT 16:58
Coke dukeleto: sent. 17:01
17:03 bluescreen joined
whiteknight dukeleto: yes, last night was a very fun night of PACT hacking 17:09
dalek p/nfa: 6395eaf | jnthn++ | tools/build/Makefile.in:
Don't build nqpq by default for now.
17:20
p/nfa: 1a0cd9f | jnthn++ | t/nqp/50-regex.t:
Revert changes to a test so it works with nqp, rather than nqpq.
17:22 mj41 joined
dukeleto Coke: replied 17:23
dalek p: 46e0f9e | jnthn++ | src/QRegex/Cursor.nqp:
Fix an LTM tie-breaking bug; diakopter++ for spotting.
17:29
p: cecd970 | diakopter++ | src/QAST/ (2 files):
move node() from QAST::Regex to QAST::Node; add $!node to QAST::Node
p: abf900a | diakopter++ | src/QRegex/Cursor.nqp:
Merge branch 'nfa' of github.com:perl6/nqp into nfa
p: ad45f01 | jnthn++ | src/QRegex/NFA.nqp:
Twiddle NFA subrule merge logic to avoid needing to boolify.
p: 0bbd9c1 | jnthn++ | src/QRegex/NFA.nqp:
Handle empty concat nodes in NFA builder; fixes tests we regressed in the protoregexes branch.
p: 2668e04 | jnthn++ | src/QRegex/P6Regex/Actions.nqp:
Ensure that <sym> captures.
p: 6395eaf | jnthn++ | tools/build/Makefile.in:
Don't build nqpq by default for now.
p: 1a0cd9f | jnthn++ | t/nqp/50-regex.t:
Revert changes to a test so it works with nqp, rather than nqpq.
p: f97207c | jnthn++ | / (11 files):
Merge branch 'nfa'
whiteknight nqpq? 17:30
Not quite perl, quite
hmm, my favorite: not-quite-perl quiche 17:31
dalek kudo/nom: 88f6945 | jnthn++ | src/Perl6/Grammar.pm:
Parse current protoregex syntax; keep older deprecated ones for now, though we'll put a warning in the next * release about them.
17:33
kudo/nom: 829f9d3 | jnthn++ | src/Perl6/Actions.pm:
Update actions so we can, in theory, handle protoregexes, though the NFA construction explodes for some reason.
kudo/nom: a8b2873 | jnthn++ | src/Perl6/Metamodel/BOOTSTRAP.pm:
Add nqpattr cheat used for now by protoregexes implementation, so the NFA builder can get at NFAs for subrules. And with this, we seem to have workingish protoregexes - to the limit of the NFA engine (which still means more powerful than the literal only we had before).
kudo/nom: e41953a | jnthn++ | src/Perl6/Grammar.pm:
Ensure that regex compiler sees the name of the regex. Fixes use of <sym> in protoregexes, and protoregex.t now passes all but one test (which seems to be unrelated to protoregexes themselves).
kudo/nom: 1f3e863 | jnthn++ | tools/build/NQP_REVISION:
Bump to NQP revision with protoregex support.
kudo/nom: 0fa6613 | jnthn++ | t/spectest.data:
Turn on protoregex.t.
17:41
kudo/nom: de79bac | jnthn++ | docs/ChangeLog:
ChangeLog entry for protoregexes.
p: e8e4511 | jnthn++ | src/QRegex/ (2 files):
Don't emit debug data when doing protoregexes.
cotto ~~ 17:44
whiteknight hello cotto 17:46
dalek p: d2b7838 | jnthn++ | tools/build/PARROT_REVISION:
Bump to Parrot 3.10 release.
17:52
kudo/nom: f50f538 | jnthn++ | tools/build/NQP_REVISION:
Bump to NQP revision which targets the relesae Parrot.
17:53
kudo/nom: 9bc820b | jnthn++ | docs/ChangeLog:
Case consistency fix in ChangeLog.
17:57
kudo/nom: 98d8d9e | jnthn++ | docs/announce/2011.11:
Start to sketch out the 2011.11 announce.
18:02 cognominal joined 18:05 lucian joined 18:11 fperrad joined
dalek kudo/nom: 813c6ae | (Solomon Foster)++ | src/core/ (2 files):
Bring uniq over from b.
18:41
kudo/nom: aa25165 | (Solomon Foster)++ | t/spectest.data:
Turn uniq.t back on.
18:42
18:43 lucian joined
dalek p: 4ec1bdf | jnthn++ | / (3 files):
Boolification support for bigints.
18:43
kudo/nom: 21fcfa3 | jnthn++ | / (2 files):
Switch Int to use bigint boolification, to fix bug found my moritz++.
18:44
kudo/nom: adb4caa | jnthn++ | docs/ChangeLog:
Note uniq() in ChangeLog (colomon++).
18:47
Coke dukeleto++ 18:59
18:59 RobertLJ joined
dalek kudo/nom: c294ae6 | (Solomon Foster)++ | src/core/IO.pm:
Add IO.copy.
19:11
cotto dukeleto++ 19:12
dalek sella: c8b788d | Whiteknight++ | src/ (5 files):
Merge branch 'master' into event_4
19:14
sella: 0f09670 | Whiteknight++ | / (11 files):
autogenerate tests for new event library. Fill most of them in, with stubs at least
sella: 2b412ae | Whiteknight++ | src/event/Event.winxed:
events can return results. We keep a named collection of results, since each subscriber may want to set a unique one
sella: 64be952 | Whiteknight++ | / (2 files):
Flesh out result mechanism for Events. Add tests for new methods
sella: 3930fb8 | Whiteknight++ | / (5 files):
Break out a new Payload type from Event. This is necessary to decouple the dispatch logic from the actual data being moved around. This prevents data weirdness if callbacks dispatched on different tasks/threads try to return result payloads out of bounds
19:49
dngor O.o 19:50
dalek sella/gh-pages: c2c4251 | Whiteknight++ | libraries/event.md:
Quick update of Event docs
20:07
20:20 bacek joined
dalek p: 89ecefb | jnthn++ | src/QRegex/NFA.nqp:
Apply patch from diakopter++ that adds support for ?, + and * quantifiers to LTM.
20:23
20:29 RobertLJ1 joined
dalek p: 1db768d | jnthn++ | src/QRegex/NFA.nqp:
Add missing handling in NFA engine of CODEPOINT_NEG and CHARLIST_NEG.
20:31
20:38 snearch joined
dalek p: 131f8e7 | jnthn++ | src/QRegex/NFA.nqp:
Handle CHARCLASS and CHARCLASS_NEG case in NFA engine, so things like \\d and \\W work with LTM.
20:41
kudo/nom: 6178be7 | jnthn++ | tools/build/NQP_REVISION:
Bump to NQP revision with latest NFA bits.
20:43
kudo/nom: d0f6d27 | jnthn++ | docs/ (2 files):
Update release guide and announce with choice of London.pm.
21:00
kudo/nom: 5390ac6 | jnthn++ | docs/ChangeLog:
Note copy in the ChangeLog.
21:07
kudo/nom: b9526c6 | jnthn++ | tools/build/NQP_REVISION:
Set NQP_REVISION to 2011.11.
21:10
Coke mls: any relatives in Southeastern CT? 21:40
dalek kudo/nom: 617fef9 | tadzik++ | docs/ (2 files):
Add a new release announcement, update release_guide
21:43
kudo/nom: 90347c1 | tadzik++ | VERSION:
[release] bump VERSION
21:45
benabik I'm not sure --debugging=0 actually turns off debugging. 21:46
Actually, I'm not sure the debugging option does _anything_. I see it getting stored in the various configure bits, but never used. 21:53
Any GC wizards want to help figure out a assertion failure in Rakudo I hit? gist.github.com/1374579 21:54
Coke alester: thought you might care to know that one of our test users is named "Bobby Tables" 21:59
alester hehe 22:00
Good!
dukeleto ~~ 22:02
ooh, a new Rakudo release
benabik: is rakudo using gms instead of gms2 by default? 22:03
Coke you seem surprised. ;)
dukeleto benabik: dead object found usually means a gc bug :(
benabik dukeleto: I'm not aware of passing any GC opts anywhere.
dukeleto: It's gms or ms2. And it seems to use gms, which is the newer one I thought. 22:04
tadzik it uses gms
22:14 lucian joined
dalek kudo/nom: ecc46f4 | tadzik++ | src/core/IO.pm:
Copy non-specced IO.chmod from b
22:21
22:31 rfw joined
dukeleto benabik: huh. i thought there was a gms2, but i could be crazy 22:38
cotto we had ms and ms2 22:49
and gms
lucian let's have what azul have! :) 23:04
bacek_at_work ~~ 23:13
tadzik hello bacek_at_work 23:15
bacek_at_work aloha, tadzik
benabik aloha: tadzik?
aloha benabik: tadzik is a 1221 byte file
benabik Curious.
bacek_at_work aloha, good girl :)
tadzik ...oh my 23:16
where did she get _that_ from? :) 23:17
bacek_at_work "tribal knowledge" :)
cotto tadzik: bots never lie. 23:18
tadzik I'm sure she's sure she's correct
benabik (Because I was curious, too: irclog.perlgeek.de/parrot/2011-01-05#i_3153008 ) 23:19
tadzik wtf 23:21
oh, I see :) 23:23
g'night #parrot 23:25
cotto 'night tadzik
23:27 lucian joined 23:38 whiteknight joined
benabik Can someone with the appropriate permissions point www.parrot.org/release/developer at ftp://ftp.parrot.org/pub/parrot/releases/devel/3.10.0/ like it should? 23:40
Oh. I have the permissions to do so. 23:41
Looks like release/current was updated but not release/developer, which is used on /downloads 23:42
whiteknight bleh. I missed a step
also, hate drupal
cotto It's just the way we misuse it.
23:55 benabik_ joined
whiteknight cotto: I think I want to put together a dynpmc mechanism for watching directories and getting file change notifications. Any preference where such a thing goes? 23:56
I'm inclined to put it in the repo in src/dynpmc, but I could start a new project for it 23:57