Index

Show enters and exits. Hide enters and exits.

00:11:15boyscoutMake sure that a local addrinfo side is found. Fixes #989 - ee2bdc2 - Evan Phoenix
00:14:01scoutmasterrubinius#135: SUCCESS in 2 min 41 sec
00:18:06scoutmasterrubinius OS X 10.5#101: FIXED in 11 min
00:18:21evanhuzzah!
00:18:24evanall green again.
00:19:20scoutmasterrubinius-2.0#116: FAILURE in 5 min 13 sec: http://ci.rubinius.net/job/rubinius-2.0/116/
00:21:39evanoh damn.
00:28:21boyscoutDon't use Kernel#sleep to know how much time has past. Fixes #986 - f6567b8 - Evan Phoenix
00:31:07scoutmasterrubinius#136: SUCCESS in 2 min 40 sec
00:32:23scoutmasterrubinius-2.0#117: FIXED in 5 min 5 sec
00:39:25brixenevan: what was the idea with fa151008a ?
00:39:42evanyou can see his links
00:39:53evanfor C++ iterators
00:40:09evanusing preincrement avoids copying the current one to return
00:40:18brixenoh ok
00:40:19evanI just never bothered to care
00:40:22evaneven though I knew that
00:40:25evanhe went to the trouble
00:40:27evanso I rewarded him.
00:40:31brixengotcha
00:40:50brixenI think the tradition probably goes back to K&R book
00:40:54brixenand it became ingrained
00:41:07brixenall example code was written with i++
00:41:15evanyep
00:41:24boyscoutAdd HAVE_ macros for blocking region stuff. Fixes #977 - 45e0601 - Evan Phoenix
00:46:03scoutmasterrubinius#137: SUCCESS in 4 min 33 sec
00:50:53brixenevan: any reason to put those defines in ruby.h instead of defines.h ?
00:51:08evani'm dumb?
00:51:09evanoops.
00:51:13brixenheh
00:51:15brixenok
00:51:24evanwell, it made sense to put them by the their they're declaring
00:51:30brixenyeah
00:51:35brixenMRI has defines.h though
00:51:39evani can't wait until mkmf can detect shit properly.
00:51:41brixenit's the consistency bot in me
00:51:43brixentrue
01:05:25brixenjust installed jekyll on 2.0pre, which installed 7 gems, and it ran so fast
01:05:37brixenmaybe I have really slow internet at home
01:05:47evan:)
01:05:50evanwell, i'm off for a jog.
01:05:52brixenoh wait, hah
01:05:55brixenI'm on an ssd
01:05:57brixenI forget!
01:05:59evanha!
01:06:00brixenevan: have fun!
01:06:00evanyep
01:24:41jerbrixen: ssd makes everything nice and speedy
01:27:04brixenjer: yes, including closing your laptop and throwing it in your bag in the airplane with no concern for turbulence
01:27:30brixenand working for 5 hours on the plane with no concern for battery life is so rad
01:33:04alexsuracievenin'
01:33:14brixenhey alexsuraci
01:33:22alexsuraciyo
01:33:31brixenturns out, one great way to find bugs is to actually read the code that is failing
01:34:02brixencreates a ProTip Bug Finding™ list
01:34:25alexsuracii spent the day at work doing 99% reading and wrote about 10 lines of code :D
01:34:32alexsuracibaby steps
01:34:36brixenheh
01:34:41brixenthat sounds like a very good day
01:34:57alexsuraciheh, it's my day 2, and the codebase is pretty large. thankfully it's all ruby.
01:35:09brixenfun!
01:35:38brixenwould they be opposed to running it on rbx and you extending it with Atomy? :)
01:36:11alexsuracihah, i wouldn't be surprised at all if they ended up with atomy runtime support down the line :P (as long as i'm there anyway)
01:36:26alexsuraciactually, it's open-source, so maybe either way
01:37:36brixenheh, cool
01:38:05alexsuracibrixen: so when are you in town on the weekend? :P
01:38:17brixenwell, I leave sat
01:38:22brixenle'me check what time
01:38:57brixenflight is at 12:30 pm
01:39:06alexsuraciah
01:39:26brixenalexsuraci: I'll likely be back in Jul
01:39:48brixensince you're just getting settled in, don't feel compelled to fit in an SF trip in the next 2 day
01:39:49brixens
01:40:13alexsuraciyea, july would be nice, i think bakkdoor is back around then too?
01:40:16brixenand bakkdoor will be back in july
01:40:17brixenyeah
01:40:24brixenwe can hang out and hack on some fun stuff
01:40:41alexsuracisounds good
01:40:44brixencool
01:41:53brixenwhy oh why are the deps for melbourne not causing a rebuild...
01:47:46brixenhell yeah! RBXOPT='-X19 -Xint' bin/mspec run -h
01:50:28brixenoh yeah https://gist.github.com/1041728
01:50:45brixenas soon as I have a clean CI run in 1.9 mode, I'll enable it
01:50:58brixennow, to fix this jit issue (note the -Xint in those commands)
01:51:02jdsiegelOooooo
01:51:26brixenjdsiegel: hehe, you have a 1.9 irc alert bouncer huh? :D
01:51:55jdsiegelhooked up to my home alarm system!
01:52:19meh`does it work? :>
01:55:44petercooperbrixen: Does your tweet mean my post might be applicable soon? (The one where I show everyone how to use 1.9 right now in RBX ;-))
01:55:57brixenpetercooper: hah, yes, very soon
01:56:03petercooperNiiiice :)
01:56:11brixenI just need a sane spec run
01:56:30brixensince that ran 3 specs, I'm encouraged
01:56:38brixenbut we currently have about 45,000
01:57:07brixenof course, I'm not above tagging first and asking questions later
02:06:31postmodernhttp://pastie.org/2109191
02:06:36postmodernhaving trouble building 2.0.0pre
02:06:43postmoderndid a clean build just now
02:07:33brixenpostmodern: clean build before or after that?
02:08:05postmodernbrixen, both, i tried ./configure && rake and that failed, so i rake cleaned
02:08:06brixenpostmodern: also, when you have an issue, please pastie me *everything*
02:08:16brixenyou do me no favors by cutting that content
02:08:43postmodernk
02:08:53brixenI'm tracking down an issue with the deps for melbourne not causing recompiles correctly
02:08:58brixenit's puzzling
02:09:06postmodernwill install script
02:09:21brixeninstall what?
02:10:16brixenpostmodern: ok, I got your issue
02:10:28brixenyou're building with 1.9.2 and I messed up the location of that define
02:10:42postmodernbrixen, ah excellent
02:11:32brixendang, I don't want to push this without fixing the deps issue though :-/
02:12:01jerbrixen, indeed... Though, i use my iPad on airplanes, just easier that way :) Leave my laptop for the ambassadors lounges on layovers :)
02:12:20brixenjer: ahh, do you do dev on your ipad?
02:13:36tarcieridev on an iPad? o.O
02:13:59brixentarcieri: sounds fun, huh? :)
02:14:20brixengesture-based, graphical assembly
02:16:05tarcieriCOSA? heh
02:16:49tarcierilook at how easy quicksort is: http://www.rebelscience.org/Art/qsort.png
02:17:20brixenyep, awesome
02:17:43brixenalso, what's with all those comments?
02:17:53brixenif the code isn't clear enough without comments, refactor
02:17:58brixen:D
02:18:50tarcieriheh
02:19:04brixenwow, rvm install ruby-1.8.7 builds fast on an ssd
02:19:08brixencrazy
02:19:09tarcieriheh
02:19:12tarcierissds rock!
02:20:48jerbrixen: sometimes yes :)
02:21:54brixenjer: I knew it!
02:21:57jerbrixen: i was writing an ipad code editor on an ipad for a while (granted, through ssh to my mac...) idea was to also build some bonjour service that'd interface with an xcode project, hit xcodebuild for you, push the build out to an http server for over the air sync to the ipad
02:22:03jerso you could one command build & run from your ipad, to your ipad
02:22:04jer:)
02:22:10brixennice
02:22:43jeri occsaionally suffer from "ooo, shiney" syndrome and that project ended up on the back burner
02:24:51brixenheh
02:25:25jerbut yeah, writing code on the ipad isn't so bad when you carry your bluetooth keyboard with you everywhere =p
02:40:30brixenpostmodern: I'll push this in a bit, going to grab some food and see if I can fix this deps issue
02:40:53brixenpostmodern: I fixed a couple other issues building with MRI 1.9 too
02:56:27postmodernbrixen, sweet, thank you
04:00:32brimil01evan: you around sir?
04:57:01brimil01Question on documentation of the core lib, does 1.8.7 docs supersede documentation already in rubinius?
07:08:51gaffoevan or brian here?
07:10:55boyscoutFixed another ID issue in 1.9 parser. - 8127d12 - Brian Ford (2.0.0pre)
07:10:55boyscoutRegen'd 1.9 parser. - d2a88c1 - Brian Ford (2.0.0pre)
07:10:55boyscoutFixed rebuilding melbourne from dependencies. - fc85189 - Brian Ford (2.0.0pre)
07:11:02brixenhey gaffo
07:11:28brixenpostmodern: there's a fix for building with MRI 1.9
07:11:45brixenpostmodern: I'm working on fixing the warnings you'll see when melbourne builds
07:13:19brixenbrimil01: did you check out the rubyspec/readruby stuff?
07:13:45brixenbrimil01: it doesn't make any sense to me to keep importing MRI rdoc into separate impl source code
07:13:48scoutmasterrubinius#138: SUCCESS in 2 min 48 sec
07:14:02brixenbrimil01: we should have a central repo for the rdoc and reference that from the other impls
07:14:19brixenbrimil01: ideally, we could then get people to help translate it along with the other rbx docs
07:17:18gaffohey brix
07:17:23gaffoer brixen
07:17:31brixenheh
07:17:43gaffo(forgot about prompts)
07:17:58brixenno worries, some people call me brix
07:18:13brixenso, the issue with embedding is that we need an API
07:18:28brixenbecause we don't want to have the same situation that exists with MRI
07:18:42gaffokk
07:18:45brixenwhich is that C extensions use internal MRI stuff and it causes a lot of problems
07:19:03brixenevan and charlie (jruby) are talking about working on a better C-API
07:19:23brixendo you have an idea of what features you need for embedding?
07:19:26gaffoso which way are you talking about
07:19:35gaffoc/et al > ruby
07:19:40gaffo or ruby > et al?
07:19:52brixennot sure what you mean by that
07:20:27gaffowell, currently I had looked at rbx and saw that bootstrapping an environment wasn't that hard
07:20:33brixenah sure
07:20:40gaffoand ffi looked like I could call back into c
07:20:45gaffowell, lemme step back
07:20:46brixenso, we need something like rb_interpreter_new()
07:21:12gaffoI'm currently looking at it as a games engine. I work for a good sized games developer
07:21:17brixenok
07:21:31brixenso you want to embed rbx to enable Ruby scripting inside the game?
07:21:33gaffobut it's more for home stuff at the moment (we have our own scriptiing)
07:21:39brixenah ok
07:21:56banister`herobrixen internal stuff is fun though ;) let's us write whacky stuff like http://github.com/banister/free ;) (very naughty i know)
07:21:59gaffoI want to do it personally but move my work tech towards what I learn here. It's how I work.
07:22:10brixenbanister`hero: you're banned :P
07:22:22brixengaffo: ok, sure
07:22:47brixengaffo: do you want to have multiple segregated Ruby interpreters running in one process?
07:23:04gaffobrixen, that would be good
07:23:15gaffobut I think better would be just one that can either reload classes on the fly
07:23:20banister`hero;)
07:23:22gaffowell, whole source
07:23:28brixensure
07:23:28gaffoor just re-start
07:23:32gaffoand
07:23:49gaffoone that doesn't depend on the filesystem
07:24:10brixenwell, we need to load the kernel from something
07:24:18gaffoeg it can libload off of some other source (usually a pack file)
07:24:24brixenok
07:24:32gaffoI think the loading is secondary
07:24:43gaffowell, and 3 is
07:24:44brixenwe can certainly have options there
07:24:52gaffoand the most important
07:25:01gaffojust getting it linked into other apps easily
07:25:06brixenyeah
07:25:12gaffowhich I think would be step 1. er 3, er 1
07:25:19brixenso, I'm going to be in LA with evan next week
07:25:25gaffokk
07:25:26brixenwe can spend some time on this
07:25:41brixengaffo: what TZ are you in?
07:25:45gaffoSeattle
07:25:48brixenah ok
07:25:52gaffoRainyTZ
07:25:58brixenheh
07:25:59gaffowell now it's SunnyTZ
07:26:01brixenyeah, I'm in pdx
07:26:05gaffooh cool man
07:26:10gaffoI'll be there this weekend
07:26:11brixennormally, but I'm in SF at the moment
07:26:23brixenahh, I'll be heading to LA this weekend
07:26:30brixenanyway, do you have time to pop in tomorrow?
07:26:35gaffosure
07:26:42brixenok, let's discuss more with evan
07:26:50brixenand we can set up some stuff to look into next week
07:26:51gaffosounds good. I get in around 10
07:26:55brixenok
07:27:11gaffotalk to ya tomorrow
07:27:18brixencool, cheers
07:27:25brixenI'm gonna crash
07:27:28gaffome too
07:27:32gaffonight
07:27:35brixennight
07:27:57brixenbanister`hero: I'll add the KERNEL_PATH stuff tomorrow, so it's easier to find the source
07:28:05brixenbanister`hero: I haven't forgotten about you :)
07:28:30brixensleeps
07:28:31banister`herobrixen awesome thanks
07:28:38banister`herosleep wel!
07:28:42brixenthanks!
07:43:25flaviobrixen: good night!
09:55:20diegoviolahi
12:56:19Zr40I'm looking into writing a code coverage tool that reports branch coverage. MRI doesn't seem to support this; set_trace_func only reports line info. Would this be possible to do with Rubinius, and where should I start?
13:53:31diegoviolawill rbx be used as the default interpreter for ruby 2.0? if rbx is so much better than mri why not drop mri and develop on RBX?
13:54:15diegoviolai don't see the point of having both mri and rbx, could someone enlighten me?
13:54:17diegoviola:D
13:54:53diegoviolai see the point of having a c interpreter and a java one though
13:54:58diegoviolac/c++
13:55:07diegoviolaand ruby one
13:55:32Mon_OuieThey're different, RBX isn't better than MRI regarding every single aspect.
13:59:05diegoviolaok
14:04:23Zr40would Rubinius support branch code coverage, and how would I go about implementing it?
14:19:12dbussinkZr40: you could look at how the profiler is implemented
14:19:17dbussinkZr40: and use that as an example
14:19:45dbussinkit probably needs additional info though
14:25:36dbussinkevan: ping?
14:27:58cremesdiegoviola: competition is good; it results in better runtimes for all cases
14:28:10diegoviolacremes: agreed, thanks
14:28:17cremesdiegoviola: and no, there is no plan for rubinius to supplant mri
14:34:55Zr40dbussink: the profiler appears to be implemented in C++ code (vm_tooling_*)
14:35:05dbussinkZr40: that's right yeah
14:35:22dbussinkbut there's probably some change there needed to be able to do coverage
14:55:39Zr40dbussink: would the debugger interface be suitable?
14:57:53Mon_OuieIt could be; maybe you could do it by adding a breakpoint on both targets of branchments?
14:58:26Zr40I don't think breakpoints are suitable, it would create tons of them
14:59:17Mon_OuieAs far as I can see, the debugger thread doesn't get any information about what happens in the code if there is no breakpoint
15:13:25Zr40hmm, temporary breakpoints might actually be ideal. Can I use them to call a method when the breakpoint hits?
15:24:13Mon_OuieThey will send information to a Rubinius::Channel in a thread (both of which you must create)
15:24:30Mon_OuieOnce you received information you can do whatever you want with them
16:20:18cremesevan: ping
16:43:35dbussinkcremes: tried that, didn't seem to work yet ;)
16:43:57dbussinkcremes: we should have a way to poke him irl :p
16:47:59cremesdbussink: yeah, we need a way to poke him in meatspace so that he has no life at all
16:48:07cremeshe must know that he CANNOT ESCAPE US!
16:48:11dbussinkhe doesn't need a life, does he? ;)
16:48:28dbussinkand he has this big excuse shortly anyway :P
16:49:37dbussinkhave something i want to run by him too
17:08:52evanmorning.
17:11:01brixenmorning sailors
17:13:35dbussinkevan: question for you
17:13:43evanok
17:13:51dbussinkevan: currently immix does conservative marking, is that for a specific reason?
17:14:04evanconservative marking being what?
17:14:08dbussinkdoes not, sorry
17:14:19dbussinkit now exactly marks the lines an object consists of
17:14:27dbussinkand not conservative like in the immix paper
17:15:00dbussinkevan: a gist is probably easier: https://gist.github.com/4af420b55874a1f5d36f
17:15:55evanI don't recall off hand
17:15:56evanhonestly.
17:16:01evanperhaps I was worried about bugs
17:16:11evanI decided to do the way that I could fully understand at the time
17:16:30evanyour way adds just that extra condition?
17:16:40dbussinkyeah, a shortcut for small objects
17:16:49dbussinkit can mark a line too much though
17:16:58dbussinkbut the immix paper claims that's worth it performance wise
17:16:59evanok
17:17:03evani'd have to look at the paper
17:17:12evanI don't recall why they do that
17:17:15evanbut if it works fine
17:17:17evango for it.
17:17:20dbussinksearch for "Conservative Marking" in the paper
17:17:30dbussinkbasically because otherwise the marking is more expensive
17:17:43dbussinkbecause of the additional computations needed to determine the number of lines
17:17:56brixendbussink: did you profile to see how expensive the marking is?
17:18:00shevyhmm when there are multiple ruby versions like 1.8.7 1.8.8 1.9.1 1.9.2 does Rubinius aim to support all of them? or only the latest always
17:18:10dbussinkbrixen: nope, just something i wanted to play it a bit it
17:18:14brixensince now a single object will use an entire line
17:18:20dbussinki thought it would be more complex honestly
17:18:30dbussinkbrixen: not use
17:18:42brixendbussink: keep in use
17:18:44dbussinkbut it can overmark stuff and keep a little too long alive
17:18:48brixenyes
17:18:51dbussinkyeah that's true
17:19:09brixenshevy: rbx is 1.8.7 compatible and we're working on 1.9.2
17:19:15dbussinkshevy: right now 1.8.7, near future both 1.8.7 and 1.9.2
17:19:29dbussinkshevy: luckily they cancelled 1.8.8
17:19:49brixendbussink: if you want to investigate, I'd like to know the marking cost as well as how many objects of what size are in a line on something like a rails app doing requests
17:20:20cremesevan: any chance we could bump speed.rubyspec.org from a micro to a small ec2 size?
17:20:34evandbussink: ok, so it's for speed
17:20:35cremesevan: the database i/o is beyond what the micro can reasonably handle
17:20:42dbussinkevan: yeah
17:20:46evandbussink: you should do some quick tests then to show that it speeds up collections
17:20:49dbussinkevan: i wonder how to properly benchmark it though
17:20:59evancremes: sure
17:21:00dbussinkevan: any suggestion for doing that?
17:21:12dbussinki think some gc benchmarks could be useful in general :)
17:21:14evani'm not sure how to change it without tearing it down and setting up another one
17:21:29cremesevan: hang on a sec... i have a stackoverflow article that discusses how to do that
17:21:34evanok
17:22:12dbussinkevan: suggestions for how to benchmark it?
17:22:12cremesevan: http://stackoverflow.com/questions/5898308/upgrade-amazon-ec2-micro-instance-to-large
17:25:06dudleyfIt's not a bug when Rubinius differs from MRI on undefined behavior, is it?
17:25:22brixendudleyf: what is the behavior
17:25:24brixen?
17:25:27dudleyfi.e. modifying an array while iterating over it
17:25:37brixenno
17:25:46brixenmatz has explicitly said that is undefined
17:25:49brixenwe do not support it
17:25:49Mon_OuieThat behaviour isn't quite consistent in MRI
17:26:06dudleyfbrixen: Good. Just making sure.
17:26:19Mon_OuieAt least for hashes it behaves differently in 1.8 and 1.9
17:26:52cremesevan: let me know when you might have a chance to try that upgrade
17:27:04cremesevan: i want to shut down the site, tar it up and copy it off just in case
17:27:07dbussinkbrixen: maybe as it's undefined behavior, we could throw an exception?
17:27:39brixendbussink: why?
17:27:40evandbussink: benchmark wise, i guess write code that holds onto a bunch of objects
17:27:44evanthen time how long collection takes?
17:27:52dudleyfdbussink: that would have saved me a couple of hours :)
17:27:58dbussinkbrixen: ^^
17:28:03dbussinkbrixen: that's the reason ;)
17:28:03brixennot a good reason
17:28:22brixenthat's a cost for everyone so one programmer doesn't do something he should never have done
17:28:47brixenI've never accidentally written code to modify a collection I'm iterating
17:29:04evancremes: i'll do it now
17:29:08evancremes: if you want to backup first
17:29:13brixenso let's make everyone's code slower so you don't have to think much? :P
17:29:19dudleyfbrixen: Neither have I, I was tracking down an instance of someone doing it intentionally in a library I was using
17:29:20evanthe IP might change so we'll have to update DNS
17:29:23cremesevan: ok, i'll ping you when i'm done (gimme 10m)
17:29:58brixendudleyf: thankfully, that code is few and far between, and not worth the cost to everyone's code IMO
17:30:04dbussinkevan: i guess this would be a time to call explicit GC right? ;)
17:30:16evannope.
17:30:37evanyou'll just time the whole application
17:30:40dudleyfbrixen: fair enough
17:30:55dbussinkevan: because i was going to try to put it in a benchmark some way
17:31:08evanhm
17:31:56evandbussink: you can use GC.run(true)
17:32:02evansure
17:32:03evango for it.
17:32:25cremesevan: done
17:32:37brixendbussink: the problem I see with that is you don't know when the GC may run
17:34:29brixendbussink: also, if you are just creating synthetic objects, that's not giving you the line profiles that a real application may have
17:34:49brixenI'd much rather see this under a rails app being hit by ab, for example
17:35:42evanwhere the fuck is XMALLOC
17:35:44evanin capi
17:35:46evananyone know?
17:35:58evanI grep for it and it's nowhere
17:36:06brixenI don't believe it's defined
17:36:13evanwait what?
17:36:19evansomeone deleted it?
17:36:28evanbecause it was definitely defined at one point.
17:37:52brixenI remember it being defined in shotgun
17:38:30evan:/
17:38:34evanthats bad.
17:38:36dbussinkevan: vm/capi/18/include/ruby.h:void* XMALLOC(size_t bytes);
17:38:39evanyeah
17:38:41evani see what
17:38:46dbussinkvm/objectmemory.cpp:void* XMALLOC(size_t bytes) {
17:38:48evanbut where is the definition?
17:38:51evanACK
17:38:59evani've been greping just vm/capi
17:39:01evanthanks dbussink
17:39:55evanI knew I remembered seeing it at the bottom of a file
17:40:03evanthat file was just vm/objectmemory.cpp
17:40:21brixenah yeah, I just went looking for that recently
17:40:27evanI should move these.
17:40:35evanthey don't need to be in objectmemory.cpp
17:45:56evanhuh. funny.
17:46:13evanI think that libxml2 uses XMALLOC to allocation memory internally
17:46:20evanand, by sheer coincidence
17:46:23evanwe have a symbol of that name.
17:46:28evanthat happens to allocate memory.
17:46:36evanbecause there is no XMALLOC in MRI
17:46:47evanso in MRI, libxml2 uses it's own symbol.
17:47:30brixenah interesting
17:47:45brixenand we define xmalloc to be XMALLOC, MRI does have xmalloc
17:48:32brixenconfusing
17:52:03evanyeah
17:52:11brixenevan: at the moment, we are not inlining methods with rest args?
17:52:12evanthat ends up causing us the thrash inside the GC
17:52:22brixenI'm reading the comment in jit_inline_method.cpp
17:52:26evanbecause we GC every 10Mb worth of calls to XMALLOC
17:52:33evanbrixen: no, we're not.
17:52:37evanthats correct.
17:52:40brixenI see
17:52:58brixenI'm looking at adding the argument processing for inlined blocks
17:53:07brixenthat's a blocker right now for running 1.9 mode
17:53:14brixenwith the jit on
17:53:21evanwhy is that a blocker?
17:53:40brixenbecause eg Enumerable#find_all jits and yields nils forever after ;)
17:53:56brixenI can run the specs with -Xint -X19
17:53:59evani don't follow.
17:54:06brixenwhich part?
17:54:09evanbecause how does the rest args come into play?
17:54:16brixenoh, it doesn't
17:54:25brixenI'm looking at how the args are handled for inline methods
17:54:32brixento see how to do it for inlined blocks in 1.9 mode
17:54:40evanah
17:54:47brixenI was surprised we're not inlining methods with rest args
17:54:52evanyes, that will have to change radically
17:55:06evannever got around to it
17:55:11brixensure
17:55:19brixenjust excited about future possibilities :)
17:55:25evan:D
17:55:32brixenevan: do you have time to do the block inlining?
17:56:03evani'm confused again
17:56:04evan:)
17:56:15evanare we talking about arg process of a block when it's inlined
17:56:20brixenyep
17:56:22evanor when a block is JITd standalone?
17:56:30evanboth need work probably
17:56:33brixenyes
17:56:33evannow that I think about it.
17:56:48evancremes: 174.129.177.167
17:56:50brixenanytime we call a block, we have to set up local values for the args
17:57:20brixenevan: oh, do I need to update dns?
17:57:25brixendid that IP change?
17:57:27evanyeah
17:57:28brixenok
17:57:29evanso
17:57:34evancould you set it up as a CNAME
17:57:45brixenok
17:57:46evanto codespeed.rubinius.net
17:58:05brixenand an A for codespeed.
17:58:07brixenwill do
17:58:24evanno no
17:58:26evanremove the A
17:58:28evanjust a CNAME
17:58:38brixenok
17:58:46brixenoh you have that
17:58:48brixennevermind
17:58:53evanthe dns for rubinius.net updates instantly
17:58:56brixenyeah
17:58:57brixengot it
17:59:20brixenrubinius. and rubyspec. just blurred in my mind
17:59:30evanthursday does that to a person
17:59:37evanso
17:59:44evando you want me to do the block arg code for 1.9?
17:59:46evanJIT wise
18:00:24brixensure
18:00:30evanok
18:00:35evani'm working on this nokogiri perf bug
18:00:36brixenI'd like to work on it, but in the interest of SPEED
18:00:38evanthen i'll do it.
18:00:43brixenok
18:01:01brixenlinode confirmation button "Sure, delete that sucker"
18:01:35brixenrather "Yes, ..."
18:01:36brixenbut funny
18:01:53evanhehe
18:08:37evanbrixen: so, i'd like to fix this malloc/xmalloc/XMALLOC/ruby_xmalloc issue
18:08:52evanthe easiest way is to change XMALLOC to ruby_xmalloc
18:08:56evanand adjust some #define's
18:09:00evanbut that will break the ABI
18:09:07evanso people will have to reinstall their C extensions
18:09:10evanyou think thats an issue?
18:09:23brixenare you fixing it on master or 2.0?
18:09:31evanwas doing it on master.
18:09:55brixenperhaps then we should do it with 1.3 release
18:10:04brixenand announce that you'll have to reinstall C-exts
18:10:07evanI could make XMALLOC a pass through to just normal malloc
18:10:14evanand add ruby_xmalloc to have the current behavior
18:10:16evanno ABI change then
18:10:19brixenor that
18:10:34evanthe only diff would be that existing C extensions wouldn't force a GC when they allocate a bunch of external memory
18:10:38evanunless they recompile
18:10:42evanwhich I think is ok actually.
18:11:30brixenthat seems reasonable
18:11:39evank
18:12:23brixenwith 2.0, we should probably remove XMALLOC and friends though, yes?
18:12:40evanyeah
18:12:46brixenok
18:14:40evanARG
18:14:51evansomeone changed ALLOC to use malloc
18:14:53evaninstead of xmalloc
18:15:07evanwhich means that no C extensions has used the "GC after a lot of allocations" logic
18:15:17evanwhich could be the source of issues.
18:15:59evanzoinks
18:16:04evanI think it's been a long damn time.
18:16:07brixenhmm
18:16:09mrb_bktime to git blame
18:16:09evanmaybe I should just delete this logic.
18:16:46cremesevan: thanks for the ec2 upgrade; i/o is still pokey but at least it's *consistent*
18:16:55evancremes: cool.
18:17:12evancremes: am I fine to shutdown the other one?
18:17:20cremesevan: yes
18:17:23evank
18:19:19evangeez
18:19:28evanyeah, i think that ALLOC never used this logic
18:19:29evanwow.
18:19:33evanok
18:19:39brixenyeah, this is so confusing
18:19:50brixenI was looking through the additions of those macros
18:20:07brixenmemory management is hard, let's all be senile
18:20:50evanyeah, we never idd.
18:20:50evandid.
18:20:51evanzoinks.
18:21:36evanwell, wtf.
18:24:02evanthere are extensions that use xmalloc directly
18:24:09evanlike bigdecimal
18:24:16evani'll bet thats what i'm thinking
18:25:00brixenyeah, MRI stuff uses xmalloc/xfree
18:26:07brixenand at least 1.9 has 2 defines for xmalloc
18:26:16brixenregint.h defines it as malloc
18:26:25brixenruby.h defines it as ruby_xmalloc
18:26:50brixenthat's not confusing at all
18:31:07evansure, i mean in extensions
18:31:14evanthats why I added our versions
18:50:03evanOH GEEZ.
18:50:07evanI was wrong.
18:50:26evanlibxml2 has a way to register the allocator to use
18:50:35evanand nokogiri explicitly passes ruby_xmalloc
18:50:38evanok, thats better actually.
18:58:43dwaiteI wish they would hurry up with libxml3 already
19:01:22dbussinkevan: but you're wondering now about the strategy of gc'ing when allocating memory that way?
19:02:09Mon_OuieSo if someone uses this in a C extension, ruby (be it Rubinius, MRI, or JRuby) would know how much memory it is using?
19:02:39evanright
19:02:44evanso that the GC can be trigger
19:02:55evanso that Data_Wrap_Struct free functions can run
19:02:59evanand free external memory
19:03:04evanit's a kludge
19:13:37brixenheh, the rubinius tshirt expo photo is being used in Rubinius announcements now
19:13:47brixenso, I think people think that's the rubinius dev team
19:16:21evanhehe
19:16:26evanwell, when you're here next week
19:16:28evanwe'll take some pics
19:23:35brixenyeah, I'll be known as the one without the beard :)
19:30:45brixenevan: grabbing lunch, bbiab
19:31:05evanha
19:49:20pkondziorwhat is the fastest way to rebuild some part of rbx (for example after string optimisations that i want to benchmark)
19:49:29pkondziori can find step by step scenerio in doc ?
19:51:25pkondziornvm, found it
19:58:54cremespkondzior: run 'rake build' to skip running all of the specs
19:59:01cremespkondzior: that's the fastest way i know to rebuild it
20:03:19pkondziorcremes: actually i neede rake kernel
20:39:49brixenhm, we had at least one duplicate HAVE_ define in ruby.h
20:39:59brixensurprised we didn't get compile warning about that
20:41:58boyscoutAdded Rubinius::KERNEL_PATH and install kernel .rb files. - 0219009 - Brian Ford
20:41:58boyscoutMoved HAVE_ C-API defines to defines.h. - 83b0158 - Brian Ford
20:42:14brixenbanister`sleep: wake up, I added KERNEL_PATH for you :)
20:48:50scoutmasterrubinius#139: SUCCESS in 6 min 47 sec
20:51:41gaffobrixen, hola
20:51:48brixenhey gaffo
20:52:00brixenI think evan is at lunch, should probably be back soon
20:52:30gaffokk
20:52:34gaffoI'll check back in a bit
20:53:36brixenok
21:39:51evanok, i'm back
21:39:58evanwas talkin' with shane
21:40:06evangaffo: poke
21:40:07evanbrixen: poke
21:40:12brixenyeah
21:40:20gaffopoked
21:40:36evanso
21:40:39evanlibrubinius
21:41:05gaffoyes
21:41:06evanwhat is needed is a new .cpp and .hpp files
21:41:18evanwhich whould describe and implement an API that embedders would use
21:41:22gaffokk
21:41:33evanthe .hpp file would be installed into a rbx include directory
21:41:34gaffoand I'm guessing have the declspec / _dll on them
21:41:44evani don't know about that
21:41:55evannever needed those for unix shared libraries
21:41:59evanbut if you say so, yes.
21:42:06gaffofor windows you do
21:42:13gaffobut yeah but default EVERYTHING is exported
21:42:24gaffobut contine.
21:42:35evanthe idea is to consider all the existing classes/functions/headers as private
21:42:51evanand build a new API that would interface those private APIs to a public embed API
21:43:01evanthe embed API doesn't have to be C++, of course.
21:43:06evanit could be C
21:43:26evanwhich would make it possible to embed rubinius more places
21:43:27brixenfor embedding, is the idea just to be able to invoke the interpreter to run some Ruby code?
21:43:44evanyes, so brixen brings up the next point
21:43:44brixenor do we expect to twiddle a bunch of stuff at the C/C++ api level when embedding?
21:43:52evanwhat is needed from an embedding API?
21:44:13evanat the basic level, there are 4 primary functions
21:44:19evanrbx_create_context()
21:44:26evanrbx_require_file(ctx, file)
21:44:33evanrbx_eval(ctx, file)
21:44:37evanrb_close_context(ctx)
21:44:46evanrbx_close_context(ctx)
21:45:29evangaffo: is there anything else that you'd want?
21:45:32brixenit seems like if the embedding environment wants to expose stuff, it should provide that with a Ruby FFI lib that utilizes it
21:45:37brixenat least, that would be one way
21:45:57evanright
21:46:01brixenand then those 4 functions would handle the invocation of the interpreter+context
21:46:02evanthats actually a seperate API discussion
21:46:10evannamely, how does an embedded rubinius communicate with it's embedder
21:46:15brixenyeah
21:46:29brixenwell, those 4 are the minimum, is what you're saying
21:46:31evanin some cases, there won't be the need for that
21:46:37evanexactly
21:46:52evanthere are use cases where the embedded ruby code doesn't know it's embedded
21:46:57brixensounds like we should start there
21:46:57evanwhere there are no special APIS
21:46:59brixenyeah
21:48:27brixenevan: does the create_context load the Kernel?
21:48:34evanyes
21:48:36brixenok
21:48:48evanor it could be a separate function to do so
21:48:50brixenso it's fully booted and ready to run userland ruby code
21:49:03evancreate_context() + set_data_path() + boot_context()
21:49:08brixenyeah
21:49:14brixenwe could expose the others
21:49:17evansure
21:50:39brixenthis would be rad
21:50:40evanthe reason i haven't done this is time and knowledge
21:50:45evani'd like an embedder to guide the process
21:50:54brixenyeah
21:50:54evanembedder being someone who wants to embed
21:50:59evangaffo: you following along?
21:51:26brixenI want to start playing with android
21:51:45brixenI have a case-sensitive file system on my usb external drive
21:51:56brixenso I can actually run the sdk stuff
21:53:05evanok
21:53:07brixenmay need to use embedding for that
21:53:20brixenI'm hoping not, but the docs are rather confusing
21:53:30gaffosorry... had to step out for a sec, catching up. light fliped on our big brother
21:55:37gaffookay, so those basic functions sound like what we need. I've seen some other ones where you can get a value refernce to an object iniside of ruby /python, whatever but I don't think we need to go that far
21:55:57gaffoI was thinking at first that the embedded ruby would just call out to the embedded language with ffi
21:56:45evanwe can add the ability to call methods and get objects back and call methods on those
21:56:56evanwe can use the handle APIs for that.
21:57:12brixenyeah, an object lifetime API would be good
21:57:33gaffoyeah, I've usually seen like handle = bind_object("MyObject::Core") or somthing
21:57:39brixenor whatever you call managing object liveness when a reference lives in another GC's space
21:57:51gaffoaah
21:58:06brixenie, therubyracer use case
21:58:54evansure
21:59:00brixenwhere references to Ruby objects are maintained in Javascript objects
21:59:43brixengaffo: but yes, I like the FFI option a lot
22:00:00gaffowell, that's where you get a bit more complicated. but you can simplify by just keeping handles to Pointers (or whatever ffi's Managed Pointer is)
22:00:03brixenbut it does move the locus inside Ruby code
22:00:05brixenwhich can be fine
22:00:10gaffolocus?
22:00:20brixenif you have to drive a bunch from the C side, you need a C api
22:00:23brixenlocus of control
22:00:30gaffoaah
22:00:50brixenie, invoke the Ruby code and the embedding environment becomes more like a library to Ruby code
22:01:00brixenmost C-ext are the opposite, it seems like
22:01:05gaffoyeah, I guess our game usually fires events into the scripting language like OnUpdate
22:01:08brixenRuby becomes a library driven by the C code
22:01:25brixengaffo: you could do that with callbacks in FFI
22:01:48gaffotrue, register with things when you create the object
22:01:50brixenFFI adds an interesting dimension to this
22:02:06brixenRuby didn't have FFI when a lot of C-interfacing stuff was written
22:03:24evanwell
22:03:37evanit could be done with FFI callbacks, yes.
22:03:48gaffobut it does now :)
22:03:49evanbut I think that having an explicit reference API would be more useful
22:04:00evanthat could be used.
22:04:12brixensure, it's not either/or
22:04:13gaffoevan, so a handle to a ruby object in c and vice versa?
22:04:21evanand given it would only have a few APIs, it would be easy to implement
22:04:34evangaffo: you'd get a handle to a ruby object in C
22:04:40evanand you could call methods on that object
22:04:43gaffoinspecting ruby in c makes sense to me
22:04:52gafforuby's duck typed
22:04:56evanand there would be APIs to manage the lifetime of the reference
22:05:07brixenyeah, calling a method explicitly on a ruby object is just the dual of an FFI callback
22:05:09evanie, you'd have to explicitly release/retain them
22:05:14evanto keep the ruby object alive.
22:05:17gaffoaah
22:05:17brixenboth would be great depending on what you're doing
22:05:33gaffohrm, so I'd think geting a reference would just mark it as held
22:05:37evanbasically, it would be your responsibility to inform the GC what you're doing with the handle
22:05:45gaffoand you'd have to specifically release it
22:05:46evanso it can keep things happy
22:05:53evanyep
22:05:57evanthats the typical API
22:06:07evani'd throw a reference counting step in there too
22:06:12gaffoyeah
22:06:15evanto make it less painful on the user
22:06:20gaffomight make an autopointer style handle
22:06:25evanso you can release/retain as you go along
22:06:36evanand the last retain would clear the handle so the GC could collect the object if it wishes
22:06:50evangaffo: autopointer style?
22:06:53evanyou mean C++ wise?
22:06:56gaffoyeah
22:07:00gaffosorry, I think c++
22:07:02gaffo:)
22:07:09evanoh yeah, we'd have that
22:07:16evani'm thinking in terms of a simple C API atm
22:07:22evanthen we can layer some C++ niceness on top of that
22:07:26gaffotrue
22:07:35evanthat makes the embedding API usable to a wider audience.
22:07:49gaffoI thing c people (and c++) would like the more explicit control as well where they had to tell it to release
22:08:01gaffois rubinius mostly c or c++?
22:08:01evanyep
22:08:06evanC++
22:08:35evanbut the embedder shouldn't have to know that
22:08:41evanthey just know "there is this C API I use."
22:08:49evanif we want to implement it in haskell, we can.
22:09:07evanpaging dr. curry, dr. curry report to the operating room.
22:09:53gaffothat's a good point. I was thinking more that if they have the c++ compiler up then they can bind from c... but yes other languages can't talk to c++, just c
22:10:36gaffoso the other thing is the dependency on the filesystem
22:12:46gaffoas opposed to a java classloader style framework. I haven't dug that far into how it works though in rubinius.
22:13:39gaffocool, the license is bsd so that makes it good for embedding too as you only have to include the copyright. GPL / LGPL sucks for games due to the linking issue
22:14:13brixenyeah, we don't use [L]GPL stuff either
22:14:35brixengaffo: we can work out loading Ruby code however you need to
22:14:43brixennetwork, archive, whatever
22:15:49evanyes, loader wise
22:15:51gaffobrixen, cool. I'd think possibly just being able to provide a method that gives you the bytes for a given path would be good.
22:15:54evanwe can do almost anything
22:15:56gaffoer to the interpreter
22:16:00evanwe just need you to help guide us.
22:16:30gaffokk. just thinking games guys typically pack everything down and want it obfuscated :) dirty proprietary coders :)
22:16:38gaffoso should I just work off master or stable or what?
22:17:02brixenmaster is good
22:17:10brixenyou could also work in 2.0.0pre
22:17:47brixengaffo: yeah, what we serialize bytecode to/from is already pretty pluggable
22:17:54brixenwe use the filesystem because that's easy
22:18:03brixenand we don't do any obfuscation because we don't need it
22:18:10brixenbut we can easily support it
22:18:25gaffoyeah, I didnt' need to do it until I switched to a games development company
22:18:42gaffoand realized why people hate LGPL so much. No shared objects on the playstation
22:19:08brixenif you look at lib/compiler/stages.rb at the Writer stage, and lib/compiler/compiled_file.rb
22:19:16brixenyou can see how we write bytecode to disk
22:19:39brixenin the VM, we'd need to write some C++ load from a different format
22:19:49brixenwhat I'd actually like to do is make an API to the loader
22:20:16brixenie, load normal bytecode from this file, then invoke X method to load the loader bytecode
22:20:46brixenso we can support infinitely many loader schemes without modifying the VM loader
22:21:32brixenyour Ruby loader code could load a C ext with some fancy crypto-anarcho-super-duper-ofuscuatorilator
22:21:52gaffotrue, making the loader be extensible in ruby would be badass
22:22:09gaffovery much like the classloader stuff in java, which allows all sorts of tomfoolery
22:22:14brixenyeah
22:26:32gaffookay so compiled_file is doing the bytecode stuff.
22:27:22gaffowhat does the loading of actual ruby code > rbc?
22:27:48brixenso, we marshal out in Ruby, because we run that in eg MRI during bootstrap build
22:27:55brixenbut we marshal in in C++
22:28:02brixensee vm/environment.cpp
22:28:16brixenrun_file
22:28:28brixenand vm/marshal.cpp
22:30:31gaffokk
22:33:44gaffomarshall.cpp looks very much like the compiled_file.rb stuff
22:34:03gaffoso where would I put my C api layer? and what's the best way to include it in your build?
22:34:50evanwell, what do you want to do?
22:36:21gaffothe simple 4 functions I guess to start. It'd be nice to be able to just exec some ruby as well... lemme do a gist
22:37:54evanyou can put them anywhere under vm
22:38:04evanwe automatically compile all .c and .cpp files
22:39:59brixenperhaps vm/api ?
22:40:04gaffokk
22:40:10evansure
22:40:20gaffobasically I think the first step would be to have a trivial thing like this compile: https://gist.github.com/1043798
22:40:39gaffoand of course work
22:41:16brixenoh, you want it to work, too?!
22:41:20brixenkids these days
22:41:24gaffo:)
22:41:24brixenyeah, that would be rad
22:41:49gaffoso is there a decent way to hook it into specs?
22:42:02brixenhmm
22:42:03gaffowell, do you even have any c++ specs/tests?
22:42:09brixenwe have C++ tests
22:42:10brixenvm/test
22:42:40gaffoaah, cxxtest...
22:42:59gaffo(had to write my own testing framework for the ps3... that was enlightening)
22:43:05brixenheh
22:43:16gaffoI just stoled from cxx test and google test
22:43:19brixenyeah, we try to test the minimum possible in C++ tests and do the rest in specs
22:43:30brixenbut I think you'd need some C++ tests for this api
22:43:42gaffoyeah, especially binding
22:43:48gaffoand ffi stuff
22:43:49brixenyeah
22:44:01brixenwell, probably not FFI
22:44:35gaffowell, I was thinking a end to end test maybe to make sure it was working... just a simple sanity c > ruby > c , verify call
22:44:44brixenyep, sounds great
22:45:14Zr40ah, I need to register a 'debugger' thread.
22:45:15brixengaffo: you'll need to add some install stuff to copy the vm/api/embed.h to <include>/rubinius/embed.h
22:45:21brixensee rakelib/install.rake
22:45:25Zr40nevermind that
22:46:16gaffoso does rubinius run in it's own thread? is it blocking, what's the model do you think?
22:46:41brixenshould be able to do whatever you want in the embedding app
22:46:44gaffokk
22:46:45brixenwe're thread-safe
22:46:59gaffoas far as you know :)
22:47:02brixenin that we have explicit thread state that we pass in
22:47:05brixenyes, afaik :)
22:47:21brixenwe don't use globals
22:47:33evanthere are a couple places some thread locals are used
22:47:46evanso rbx_require_file should do VM::set_current(ctx->state)
22:47:52evanbefore calling down
22:47:56evanto set the thread local
22:47:58evanbut thats it.
22:49:19gaffoyeah, I could see an embedded app wanting to do either or. having c++ and rbx running at the same time (maybe the eval call blocks), or just step into and evaluate "update" on all objects in a game loop.
22:49:55evanyou can have both
22:50:00evanyou can easily spawn another thread
22:50:03evanand have it run
22:50:06gaffoyep
22:50:27gaffoyou guys are going with native threads, correct?
22:52:07evanyep
22:54:39gaffocool, well that sounds like a good place to get started. when I compiled rubinius before I saw it pulled llvm. What all dependencies does rubinius have and I'm assuming that you guys are just building it all into the executable instead of using .so's?
22:55:26evanyep
22:55:39evanzlib and llvm are the main ones
22:55:46evanextensions need readline and openssl
22:55:52evanwe should them listed in the readme
22:56:05gaffoso the trick will be getting that all to compile on android / ios / ps3 / palm :)
22:56:26brixenhttp://rubini.us/doc/en/getting-started/
22:56:32brixenthere's a requirements page
22:56:44brixenreadline is no longer a hard requirement, we can fall back to rb-readline
22:57:37gaffoI would think that readline is a special case for embedding, then again maybe someone is creating a scripting shell :)
22:58:01brixencould be
22:58:03evanfor an embedded platform
22:58:09evanreadline and ssl can be left out
22:58:09brixenI wish I had IRB on my iphone
22:58:11evanpretty easily.
22:58:22evanwe don't have switches for that now
22:58:26evanbut you can just comment out building them
22:58:47brixenI can add them easily too
22:58:56gaffoso how do you guys like c++ compiling in rake?
22:59:04gaffofirst major project I've seen do it...
22:59:04evangaffo: it sucks.
22:59:07evanwe built our own tool.
22:59:18evancalled daedalus
22:59:29evanthat we use to build the bulk of the C++
22:59:41evanbut it's run from rake
23:00:07evangaffo: also, you can disable using llvm
23:00:23evanwhich will just mean things are quite a bit slower
23:01:07gaffollvm is a vm framework I think?
23:01:23evansort of
23:01:28evanit's really a compiler framework
23:01:31evanthat we use for the JIT
23:03:46gaffoaah
23:04:29gaffonow I gotta figure out what ide to use for c++ / ruby coding. stupid aptana taking over all ruby eclipseishness.
23:04:56evani'll be of no help there.
23:05:23gaffoyou guys all mac guys?
23:06:03evanyep
23:06:39brixengaffo: gvim
23:10:18evanrad
23:10:24evanI added a Bytes configuration type
23:10:26evanso you can do
23:10:36evan-Xgc.young_bytes=10M
23:10:41evanfor 10Mbs
23:12:04brixenyay!
23:12:11brixenI was going to ask you about that
23:12:20evanSUUURE you were
23:12:20evan:D
23:12:21brixenbut everything was constants in immix
23:12:25brixenI was!
23:12:38evanRIIIGHT
23:12:38evan:D
23:12:43brixenI think 5mb may be a better "scripting" default
23:13:03brixenif people are really worried about rbx startup footprint
23:13:06evank
23:13:54brixenI think we're much closer to the neighborhood of MRI on startup
23:14:22brixenbut it looks like we're heavier than we are
23:14:54jdsiegeljust big boned, that's all
23:14:55brixenoh wait, you added that for young_bytes
23:15:03brixenI want it for mature_bytes!
23:15:15brixenBytes is handy though
23:15:22brixenwe also need RadioButton
23:16:46evanwhat did you want to tune, mature_bytes wise?
23:16:48evanthe chunk size?
23:17:29brixenyeah
23:18:40brixenpretty soon, the configuration code will turn into ActiveRecord
23:18:45brixencomplete with validations
23:19:15brixen"You have chosen a 10MB young generation. This will actually slow you down. Press Y to continue"
23:20:06brixenno wonder zed wanted to use a db for mongrel2 configuration
23:20:22tarcierihaha
23:20:35brixenit's actually a great idea
23:21:13evanhehe
23:28:31boyscoutIncrease the malloc threshold to 100M - b0bf4fc - Evan Phoenix
23:33:40scoutmasterrubinius#140: SUCCESS in 5 min 4 sec
23:43:53jdsiegelbrixen: then specs for your configuration!
23:45:43brixenjdsiegel: heh
23:46:49brixenif I never, ever saw the MRI parser again it would be too soon
23:55:30jdsiegelbrixen: is there ever a good time to use the "freeze" method? I'm a little fuzzy on problems with it.
23:55:50brixenjdsiegel: never a good reason, imo
23:56:53jdsiegelthat's what I thought. Just see it a lot in libs with constant strings
23:57:17brixenthat's pure cargo culting