User:Zero Linden/Office Hours/2008 Feb 14

From Second Life Wiki
Jump to navigation Jump to search
  • [8:32] Morgaine Dinova: Hiya DrS, how goes?
  • [8:32] Saijanai Kuhn: hey all
  • [8:32] Morgaine Dinova: Hiya Sai!
  • [8:33] Rex Cronon: hi sai, hi everybody
  • [8:33] Morgaine Dinova: Hiya Rex!
  • [8:34] Dr Scofield: morgaine, pretty good
  • [8:34] Rex Cronon: i wonder. is zero going to hand out chocolate hearts today:)
  • [8:34] Morgaine Dinova: I need a lie-down-on-Zero's-couch anim
  • [8:34] Dr Scofield: making good progress towards opensourcing my bot stuff
  • [8:35] Morgaine Dinova: Oh, very cool. What does it do currently
  • [8:35] Dr Scofield: python library is qorking (login/logout, chat, im, walk, teleport)
  • [8:35] Morgaine Dinova: 'Morning Zero :-)
  • [8:35] Neas Bade: morning zero
  • [8:36] Zero Linden: Goooooood morning
  • [8:36] Tree Kyomoon: haldo
  • [8:36] Dr Scofield: adding support for export/import if possible
  • [8:36] Dr Scofield: hi zero
  • [8:36] Rex Cronon: hello zero
  • [8:36] Zha Ewry: Morning Coffee Cup attached Zero.
  • [8:36] Zero Linden: Welcome all to my office hours - tech talk gallore!
  • [8:37] Aargle Zymurgy: greetings and hallucinations, Zero
  • [8:38] Zero Linden: That's sort of a fun, SL, style greeting, Aargle
  • [8:38] Morgaine Dinova: Big turnout for the AM session :-)
  • [8:38] Aargle Zymurgy: hello, Lalinda
  • [8:38] Lalinda Lovell: ...
  • [8:38] Zha Ewry: The hour time change added a lot of peple, and we're getting more attention again
  • [8:39] Aargle Zymurgy:  :-) thanks Zero.... it's a RL greeting of mine, too.
  • [8:40] Zero Linden: Well, I have only one topic on my list: I've been going through a list of all the components in the system and have begun putting them into some semblece of order-of-attack
  • [8:40] Zero Linden: So, here's my list - tell me if anything is missing
  • [8:41] Zero Linden: Oh - I should state, these are only things that involve the agent domain, since it is my assumption that we'll keep the viewer <-> region communications the same, with the old message system, until the end
  • [8:42] Zha Ewry: cringes
  • [8:42] Dahlia Trimble: the end?
  • [8:42] Zha Ewry: Path of least resistence, and possibly least gain
  • [8:42] Saijanai Kuhn: need to understand eventqueueget MUCH better then in order to commment
  • [8:43] Zero Linden: Sai - we can talk about that in a bit -
  • [8:43] Zero Linden: first batch: [
  • [8:44] Saijanai Kuhn: KK thanks
  • [8:44] Zero Linden: second batch: [
  • [8:44] Zero Linden: third batch: [
  • [8:44] Zha Ewry: blinks
  • [8:44] Zha Ewry: Baked textures?
  • [8:44] Dr Scofield: better than cooked textures
  • [8:44] Zero Linden: AV baked textures are, right now, stored on the simulator host where you last baked them.
  • [8:44] Zha Ewry: right
  • [8:44] Neas Bade: this is all sounding pretty reasonable to me
  • [8:44] Zero Linden: Oh - you want to know what those are?
  • [8:44] Zha Ewry: Whiuch is where the clients who need them, need them
  • [8:45] Zero Linden: Well- but usually not - for example - I baked my outfit on another region
  • [8:45] Zha Ewry: Oh. Hmm. Are you assuming the agent domain will pass them along
  • [8:45] Zero Linden: all of you are fetching from this simulator, which in turn is getting it from that simulator
  • [8:45] Zha Ewry: Oh,jeez
  • [8:45] Morgaine Dinova: Are anims under Gestures in that list, or missing?
  • [8:45] Dahlia Trimble: so they dont become assets?
  • [8:45] Zha Ewry: shudders
  • [8:46] Zha Ewry: Lovely dependenc chains, and such.
  • [8:46] Zha Ewry: No wonder Ruth gets out so much
  • [8:46] Zero Linden: Gestures is int he third list, but yes, I missed animations
  • [8:46] Zha Ewry: And rebake happens so much
  • [8:46] Dahlia Trimble: do they survive a logout and relogin?
  • [8:46] Zero Linden: Dahlia - they do
  • [8:46] Dr Scofield: stupid question: why not store them in asset server or agent server?
  • [8:46] Zha Ewry: I htink Zero's suggesting agent
  • [8:47] Zha Ewry: They aren't really assets, in a deep sense
  • [8:47] Zha Ewry: Transitory caches of your visual presentation
  • [8:47] Zero Linden: We don't store them in the asset server because they are ephemeral - and garbage collecting them was very expensive
  • [8:47] Zha Ewry: sighs
  • [8:47] Zero Linden: Every time you adjust your clothes....
  • [8:47] Zha Ewry: I have got to stop channleing zero
  • [8:47] Dr Scofield: so agent server
  • [8:47] Neas Bade: As we start to look at login again, it would be really nice to encode the urls of services such at search instead of having them hard coded in the client
  • [8:47] Zero Linden: So we put them on the sim host directly - and let that be a cache - we can just clean out the old ones at any time .....
  • [8:47] Zero Linden: since you can always ask the viewer to rebake
  • [8:48] Zha Ewry: Right, and not burn a pile of asset transactions per bake
  • [8:48] Dr Scofield: k
  • [8:48] Dahlia Trimble: if you are using a viewer that supports baking
  • [8:48] Morgaine Dinova: If our "home" sims actually provided and controlled our objects and avs directly, then region sims wouldn't be as poorly salable as now. Agent domains aren't going to help much if it still goes through the single poor sim.
  • [8:48] Zero Linden: Neas - good point - I'll add a section for that in the internal protocol
  • [8:49] Neas Bade: I assume that a change of login to agent domain will also mean login becomes web based again?
  • [8:49] Zero Linden: Morgaine I think that was the original SL design, say, five years ago, but it turned out that people didn't use "home" in a way that made that make sense
  • [8:50] Tao Takashi: yo
  • [8:50] Zero Linden: Neas - this part of login is the equiavalent of login.cgi - which is web services based even today
  • [8:50] Neas Bade: The -loginpage was actually quite nice for providing customized entry point
  • [8:50] Dr Scofield: yep
  • [8:50] Zha Ewry: Well as long as we allow a sim to be cluster ot related services,
  • [8:50] Neas Bade: ok
  • [8:50] Zha Ewry: then things lke bakes textures, and such, are
  • [8:51] Zha Ewry: totally scalable
  • [8:51] Zero Linden: Think of login as having to parts: Acquring the credential, then presenting the credential for access
  • [8:51] Morgaine Dinova: Zero: how allocate a dynamic and hidden "resource home", distributed evenly among the available resources?
  • [8:51] Dr Scofield: it would be even nicer if we could get loginuri included in secondlife:/// uri
  • [8:51] Morgaine Dinova: Meant "how about"
  • [8:51] Zha Ewry: Since.. there is zero coupling between the physical simulation and things like baked aves
  • [8:51] Dr Scofield: true
  • [8:51] Tree Kyomoon: Tree agrees with Dr Scofield
  • [8:51] Zero Linden: So, the work from this fall was all about acquiring the credential ( and making the login credential be a token from the web site, rather than the user's name and password)
  • [8:52] Zero Linden: This work is all about using the credential to grant access-- and the current internal design supports multiple credential systems
  • [8:52] Dex Trenchcoat: tips his hat to cliff
  • [8:52] Zero Linden: (av name & password, account & password, openId, capabaility from the web site, etc...)
  • [8:53] Zero Linden: Morgain - I imagine that that is precisely what most large agent domains will do - I know we will!
  • [8:54] Cliff Eclipse: /salute
  • [8:54] Cliff Eclipse: salutes Dex
  • [8:54] Zero Linden: Since the plan of record is to make all services be reachable by caps, there will be little required coupling
  • [8:55] Leffard Lassard: What is the difference between "av name & password" and "acount & password"
  • [8:55] Zha Ewry: Right
  • [8:55] Zero Linden: and so "sim services" could easily be multiple processes
  • [8:55] Zha Ewry: the only thing you get stuck on, is the core physics simulatoin, and things which need to see a lot of the related state
  • [8:55] Zha Ewry: *everythign* else, pretty much can be spread out
  • [8:56] Zero Linden: Leffard - right now your login credential is tied to your AV name
  • [8:56] Leffard Lassard: Yes.
  • [8:56] Zero Linden: But I imagine that, like many systems, it is reasonable ot have a "customer acccuont" name that is just between you and the agent domain, and is independent of one or more AV names you might control
  • [8:56] Leffard Lassard: I see.
  • [8:57] Zero Linden: This adds some security as well - because to a random observer, they'd have no way of konwing what account they should try to login as to get to be Zero Linden
  • [8:57] Zero Linden: whereas right now, you all know!
  • [8:57] Zero Linden: Of course - if we all just usd strong passwords, then this wouldn't matter..... :-)
  • [8:57] Zha Ewry: And.. this also lets you start iaging
  • [8:58] Zha Ewry: *imagining
  • [8:58] Zha Ewry: sharing things between the clustered alts
  • [8:58] Zha Ewry: which would be nice
  • [8:58] Zha Ewry: Nothing like having to log in just to shuffle lindens, or move an object or texture
  • [8:58] Zha Ewry: (Why, why, is the texture I want to build with alays in the wrong ave?)
  • [8:58] Leffard Lassard: lol.
  • [8:59] Leffard Lassard: But it will be pretty bad for the business scene. No more twice sold things.
  • [8:59] Zha Ewry: I'd be happy, to just have it apply to trans obejcts and lindens
  • [8:59] Saijanai Kuhn: Thats a relatively trivial design issue I think.
  • [9:00] Morgaine Dinova: The concept of ownership would need to be broadened for that.
  • [9:00] Saijanai Kuhn: at most, you would just be sharing a single no-transewr item just as people can share designer jewelry among friends
  • [9:01] Dahlia Trimble: Im confident such a proposal would result in a designer revolt
  • [9:01] Morgaine Dinova: Might as well make it more generic, and allow inventory trees to be shared.
  • [9:02] Zero Linden: Well, let's not predict panic -
  • [9:02] Alvargi Daniels: There are other things that would need to be changed to support that concept, like the information in the http headers sent with an llHTTP call
  • [9:02] Neas Bade: ok, got to run a little early today, catch up with you all later.
  • [9:02] Morgaine Dinova: Dahlia: yep, the vested interests always try to stop progress :-)
  • [9:02] Aargle Zymurgy: when in trouble, or in doubt....... run in circles, scream and shout.
  • [9:02] Zero Linden: Alvargi - indeed
  • [9:02] Zero Linden: Later Neas
  • [9:02] Rex Cronon: bye neas
  • [9:03] Zero Linden: I think the concept of an avatar identity = one name & one UUID is a good one
  • [9:03] Alvargi Daniels: yes I do as well
  • [9:03] Leffard Lassard: Hmm.. what does llGetOwner then mean?
  • [9:03] Alvargi Daniels: in fact...
  • [9:03] Anamolie Poitier: what if we had a main user account with our alts inside of it?
  • [9:03] Zero Linden: I think it is reasonable to say that if you appear in world as a different name, you are a different avatar
  • [9:03] Zero Linden: Anamolie - I think that would be a feature some agent domains could offer
  • [9:04] Dale Innis: I thought we DID have a main user account with our alts inside of it...
  • [9:04] Rex Cronon: is one name that good? in rl quite a few people share the same name
  • [9:04] Alvargi Daniels: I would like to see a way to uniquely identify an instance of a prim forever - across rezzez
  • [9:04] Anamolie Poitier: like if i log in with a master password and then choose one of my alts from my grouping
  • [9:04] Zero Linden: But I would keep the permissions system tied to avatars, not master accounts
  • [9:04] Alvargi Daniels: hmmmm
  • [9:04] Alvargi Daniels: I may have an issue with that one Zero
  • [9:04] Zero Linden: so a non-tansfer item can't be transfered between your alts - even if you have simultaneous access to both alts inventory when in world as one of them
  • [9:04] Morgaine Dinova: Zero: one-ID/one-name isn't in conflict with object sharing. A person who owns something should still be able to share it with her friends.
  • [9:05] Zero Linden: At least, that would match the expectation underwhich items are sold today
  • [9:05] Zha Ewry: The seperatoin of idenity, is really important, as is, the matching of expectation
  • [9:05] Dahlia Trimble: or add a new permission level that allowed asset sharing between alts that the creator could assign
  • [9:05] Zha Ewry: One coudl also imagine allpwing "Shared objects"
  • [9:05] Zero Linden: No-copy transfer items could, of course, be easily moved between alt inventories
  • [9:05] Zha Ewry: between alts, ro groups
  • [9:05] Saijanai Kuhn: SL doesn't have to act like real life in every instance. Its a matter of balancing the pros and cons
  • [9:05] Zero Linden: Dahlia - yes, I think that will have to come about
  • [9:05] Alvargi Daniels: how about a fourth permissions attribute that would allow content creators to decide if an object can be shared across avies of the same user account?
  • [9:06] Aargle Zymurgy: that sounds like too much tweaking
  • [9:06] Saijanai Kuhn: great minds, LOLL
  • [9:06] Dahlia Trimble: lol
  • [9:06] Zha Ewry: Over time, Alvargi, I think one can imagine a range of sharing permissions, and let the sellers and buyers soet out which work for them
  • [9:06] Zero Linden: Well, to be worked out, I say, but I don't see a "sky is falling" scenario in any case
  • [9:06] Saijanai Kuhn: raises the concept of a open source license permission...
  • [9:06] Zero Linden: Zha - so long as it is clear to both sides - and I admit, even the current system is something it takes people time to get comfortable with
  • [9:07] Zha Ewry: Yes
  • [9:07] Morgaine Dinova: Sai: indeed, the virtual world is meant to be BETTER than the physical one, not inherit all its limitations. And bit copying is a freedom in the digital domain which doesn't (yet) exist in RL objects. We shouldn't try to retain constraints when they're not necessary in VW.
  • [9:07] Zha Ewry: I spent an hour a few days ago
  • [9:07] Zha Ewry: explaingin
  • [9:07] Rex Cronon: i don't thain that all people are comfrotable with it
  • [9:07] Saijanai Kuhn: Morgaine. Its all about the economy...
  • [9:07] Zha Ewry: why you cold get objetc X, tiehr trans or copy, but not both
  • [9:08] Zha Ewry: Why that was a sensible pairing for the seller
  • [9:08] Morgaine Dinova: Sai: it's all about greed, aye.
  • [9:08] Saijanai Kuhn: greed isn't inherently bad or good, IMHO
  • [9:08] Zha Ewry: Don't go there you two
  • [9:08] Zero Linden: Well, before we let this one go too far - I
  • [9:08] Zero Linden: I think we can offer a range of possibility and see what the community (hugh though it is) wants
  • [9:08] Morgaine Dinova: Aye
  • [9:09] Zero Linden: It is, after all, how Linden has always (well, almost always) developed SL
  • [9:09] Alvargi Daniels: what sort of timeframe are you thinking here Zero?
  • [9:09] Dale Innis: Each object would contain a piece of LSL that gets run when someone tried to sell it or give it to someone else, and that piece of code could say yea or nay. ( half-kidding )
  • [9:09] Zero Linden: For what, Alvargi?
  • [9:09] Rex Cronon: if i buy something in rl, i can give it to somebody else.
  • [9:09] Zero Linden: Rex - not a Gym membership
  • [9:09] Alvargi Daniels: the user account domain ...
  • [9:10] thomtrance Otoole: do people want persona boundaries, or multiple personalities? it seems this choice would define the world in terms ofthat.
  • [9:10] Leffard Lassard: At least the first standards definitions could be open to extend it that way.
  • [9:10] Rex Cronon: it could be possible to transefer a membership if u paid for it
  • [9:10] Morgaine Dinova: Dale: such constraints only work in a single managed domain. Once you have third parties, any such scripted constraints are no longer guaranteed.
  • [9:10] Zero Linden: Alvargi - I hope to have running code internally in Q2 - and hope to be able to demonstrate some amount of interoperability by Q3, earily Q4
  • [9:10] Tao Takashi: btw, Zero, is Linden Lab thinking of maybe joining the Data Portability Group? :)
  • [9:11] Dale Innis: nods. "To first order, anyway." :)
  • [9:11] Alvargi Daniels: ok thank you
  • [9:11] Zha Ewry: Oh. Hey. Zero..
  • [9:11] Zha Ewry: The odd libcurl 2000 handle issue that was found
  • [9:11] Zero Linden: Tao - to be honest, last week was the frist I heard of it - and I don't know - I'd probably be the person involved,
  • [9:12] Zha Ewry: Is that fix going to roll out before the stuff that was used to find it?
  • [9:12] Zero Linden: Zha - I 'm tottally out of the loop on that - don't know what it is about
  • [9:12] Zha Ewry: Ah.
  • [9:12] Zha Ewry: Ok.
  • [9:12] Tao Takashi: Zero: Well, it might not be much which involves joining. But it might be some PR
  • [9:12] Tao Takashi: I think it's mostly joining the mailing list and maybe doing some press release
  • [9:12] Saijanai Kuhn: you mentioned it I thought, Zero. That libcurl had null pointer issues...
  • [9:12] Tao Takashi: Google et al. are in fact not too much contributing at the moment
  • [9:13] Zha Ewry: In the texture load stuff (from http) they found that horrible libculr bug, and I was deeply curious about whether it hits other
  • [9:13] Tao Takashi: but at least they should all share some sort of common interest in this area
  • [9:13] Zha Ewry: parts of SL, with the same behavior (dropping requests silently)
  • [9:13] Zero Linden: OH
  • [9:13] Rex Cronon: what bug?
  • [9:13] Zero Linden: sorry, Zha, brain hiccup
  • [9:13] Saijanai Kuhn: libcurl silently fails when itruns out of file descripters
  • [9:13] Saijanai Kuhn: rteruns NULL
  • [9:14] Zero Linden: Yes, the bug is this, libcurl uses up a file handle to read the configuration file ... on every request!
  • [9:14] Saijanai Kuhn: and since libcurl is used internally for just about everythign in the servers
  • [9:14] Zha Ewry: Every freaking request?
  • [9:14] Zha Ewry: wimpers
  • [9:14] Zero Linden: If you make too many requests at once (which a simulator might do...), you get back a NULL curl_easy_handle or curl_multi_handle
  • [9:14] Zero Linden: with no explaination
  • [9:15] Zero Linden: Zha - yes, every freakin' request
  • [9:15] Zero Linden: What Sai said!
  • [9:15] Zha Ewry: right
  • [9:15] Zha Ewry: and SL uses libcurl.. like.. everywhere
  • [9:15] Rex Cronon: zero, didn't u talk aobut that bug before?
  • [9:15] Saijanai Kuhn: so.. we were wondering... when a fix for that will be implemented...
  • [9:16] Zero Linden: It doesn't affect the current sims because all use of lib curl is from higher level sub-systems that are themselves rate limited (like llHTTPRequest)
  • [9:16] Zha Ewry: Ahh.
  • [9:16] Zero Linden: We don't have a fix for libcurl at all -
  • [9:16] Zha Ewry: Enough rate limited?
  • [9:16] Zha Ewry: Ah. So you put the fix in one level up?
  • [9:16] Zero Linden: we basically added support for this error condition in our C++ wrapper around it, and then made things handle it
  • [9:16] Saijanai Kuhn: so its already in-place?
  • [9:17] Zero Linden: No - should be merging into code base in Q2, along with HTTP textures
  • [9:17] Zero Linden: Again, currently we never hit this case
  • [9:17] Zha Ewry: Ah
  • [9:17] Zha Ewry: sighs
  • [9:17] Saijanai Kuhn: ah, OK, Zha and I were disagreeing about the timeframe
  • [9:17] Zha Ewry: was hoping, this might be one of the ways SL loses things
  • [9:17] Saijanai Kuhn: so its a future bug, or does it hit now?
  • [9:17] Zha Ewry: And. fixing would fix various things
  • [9:18] Zha Ewry: No, it's futrue Saij
  • [9:18] Zha Ewry: if they never exercise it now, do to rate limits
  • [9:18] Saijanai Kuhn: ah, pro-active, which is nice, but not a fix for current woes...
  • [9:18] Zero Linden: We don't see any evidence of this happening now
  • [9:18] Saijanai Kuhn: OK, I thought that you aid it was happening already. My bad.
  • [9:19] Zero Linden: You need a really high concurrency of libcurl use to hit this, and we've never appraoched with except with HTTP textures
  • [9:19] Zha Ewry: Squid doesn't go via libcurl, it does it directly, doesn't it?
  • [9:19] Zero Linden: and then, only in a build with all the batching code turned off
  • [9:19] Zero Linden: so every texture piece is a separate request
  • [9:19] Morgaine Dinova: Not sure why the great furore over libcurl bug if it doesn't currently get exercised. We have enough bugs that DO currently get exercised to worry about.
  • [9:20] Saijanai Kuhn: we thought it WAS a current bug, Morgaine.
  • [9:20] Zero Linden: Zha - I don't know, but would assume so since Squid has been arond a very long time
  • [9:20] Morgaine Dinova: Sai: aha!
  • [9:21] Zha Ewry: Because, it wasn't clear, Morgaine
  • [9:21] Zha Ewry: SL has libcurl, all over the place
  • [9:21] Zha Ewry: If it wasn't rate limited.. it could easily be tripping on it, in peak loads
  • [9:21] Zha Ewry: classic spot to look for a intermitten at high loads
  • [9:21] Tao Takashi: once made nice hair with libcurl
  • [9:21] Saijanai Kuhn: and the behavior seemed like it would explain various issues. But, something else...
  • [9:21] Morgaine Dinova: lol Tao
  • [9:22] Zero Linden: It came up because it was the long-time blocker for HTTP textures - AND that change will be a big win for simulator stability
  • [9:24] Saijanai Kuhn: On the trans-grid front, what is going on these days?
  • [9:24] Saijanai Kuhn: any progreess on TP?
  • [9:24] Zero Linden: So, there is some internal taction on getting some header files, or at least the information contained therein, available via a non-GPL avenue
  • [9:24] Saijanai Kuhn: ah. llvolume.cpp?
  • [9:24] Zha Ewry: lifts an ear and listens closely
  • [9:24] Saijanai Kuhn: *math*.h?
  • [9:25] Zero Linden: Rob Linden is dragging this through and on the itnernal Jira I see nothing but agreement - now we just need to work out the details of how exactly -- and we'll have to have the broader company look at it.
  • [9:26] Saijanai Kuhn: OK. I'd volunteered to try to sidestep the issue and just document the stuff, but its a tad... complicated...
  • [9:26] Zha Ewry: Do you have a [proposed list... of the ones which you're looking at doing this for?
  • [9:26] Zero Linden: I think there are quite a few files that fall into this camp, but llvolume.h and math are among them
  • [9:26] Zha Ewry: Nice
  • [9:26] Dr Scofield: got to go, telco calling..cu you all
  • [9:26] Morgaine Dinova: Cyu DrS
  • [9:26] Rex Cronon: by dr
  • [9:26] Zero Linden: No, but if anyone does, e-mail me your suggestions
  • [9:27] Saijanai Kuhn: thing is, the only files mentioned are llvolume adn math, but math is really about 5 files and llvolume is related to about a dozen directly
  • [9:27] Zero Linden: And we've had requests here for the eventqueue code (viewer and sim sides)
  • [9:27] Saijanai Kuhn: the relevant code and headers are scattered in a bunch of different files for both series
  • [9:27] Saijanai Kuhn: (like I said... complicated...)
  • [9:29] Saijanai Kuhn: I think a comment to that effect should be put in the jira that launched this
  • [9:30] Zero Linden: Well friends - I must go
  • [9:30] Zero Linden: Studio Directors meeting where we talk about what is currently going on!
  • [9:30] Rex Cronon: bye zero
  • [9:30] Zero Linden: Thanks all for coming
  • [9:30] Results Tiki: bye, thanks
  • [9:30] Dahlia Trimble: thanks Zero :)
  • [9:30] Zha Ewry: Thanks,. lots of good stuff there
  • [9:30] Davie Zinner: Thanks Zero
  • [9:30] thomtrance Otoole: thank you
  • [9:30] Anamolie Poitier: bye zero, thanks for the meetings
  • [9:30] Saijanai Kuhn: thanks zero
  • [9:31] Dahlia Trimble: Saij is the author of that code listed?
  • [9:32] Saijanai Kuhn: the author of the code? Its several, I think. or do yo umean the jira requesting the code be open sourced?
  • [9:32] Dahlia Trimble: I meant whoever designed the prim rendering code