 Video equipment rental costs paid for by peep code screencasts Okay, my name is Bruce Williams. I'm gonna be talking about the next Ruby, which is Ruby 1.9 So first of all to give you a little bit of background on me that's my name in big red letters the top and I live here in Austin, Texas So Seriously, okay So as you can tell we have a very large and vibrant Ruby community here with very small voices So we are the community here is growing at a pretty at a pretty good rate and But it's nice to have all of you all of you here So, you know grab somebody from Austin if you're looking for a good restaurant or a good bar there's plenty of both I've been a Ruby since 2001 Back when you didn't make any money doing it and it was just a lot of fun And now you can make money doing it and it's still a lot of fun So that worked out really well. I'm a language tourist and what I mean by that is I'm a Rubyist by trade And it's the it's that my tool of choice, but I play with Erlang. I play with Haskell. I play with whatever makes sense Ruby has a long lineage and You know we owe a lot to a lot of languages and I think it Think we should you know float around a little bit and take a look at other languages as well So if you had to distill my life in a series of URLs, those would be probably them That's where I blog when I blog which is probably not as much as I should Can find me on github there using my name. I work at a company called five runs, which is here we have the tune-up and the manage products which you can see to the right and I Basically just annoy people and talk about what I'm eating for dinner and things like that at my my Twitter I can't claim that there's anything useful that comes out of that But there it is So why Ruby 1 9 why care about Ruby 1 9? How many people here are using 1 8 6 Most of the time MRI Okay, keep your hands up Okay Now if you're using 1 8 7 keep your hands up Okay, how about 1 9 how about 1 9 in production Dave Dave you don't count you're in a early early early a doctor So actually recently Yeah, okay Dave, I guess you do count but only because you paid So Ruby 1 9 Ruby inside recently did a poll. I don't know if any of you took part in it But they found a good pretty good percentage of people. Yeah, I guess about 10 10 percent 15 percent Last time I looked and now the polls gone so I can't find it Which is perfect for me because I'm speaking about it today But about 10 or 15 percent are using Ruby 1 9 on a on a regular basis so I Thinking back a little bit Ruby 1 9 reminds me a lot of Ruby 1 7 Because it's development version of Ruby so back when everybody was using 1 8 6 There was 1 8 7 and people played in the world of 1 8 7 before Sorry in the world of 1 7 before 1 8 came out a little bit different now because people have Businesses that rely on 1 8 so they're a little less willing to go forward willy-nilly and you know grab stuff Because we're very much into robust enterprise software in this community, obviously so 1 9 However, it does a lot of stuff for us so we get a whole bunch of new syntax language features Obviously, it's a Has the next version you it's not strictly backwards compatible with 1 8 There's definitely some issues when you're migrating code, which I'm going to go into It definitely has better performance characteristics And of course it has more bucks Because that's just the way software works Although it's probably easier to maintain these days So What I am going to talk about what I'm not going to talk about I'm I am going to talk about the new syntax and language features Because that's what I really enjoy talking about. I am going to talk about you know migrating stuff over I'm not going to talk about the performance That's something that you can people that are far smarter than me and more interested in performance You can find loads of numbers about the various implementations and various speeds out there and 1 9 as a whole is much much faster than MRI 1 8 So I'm not going to talk about that I'm not going to talk about the bugs that exist Besides the one that have immediately popped up to me because I'm not psychic and I don't know where they are If I was I would be helping not fix them, but that's not the case so Still on the thread of things I'm not going to talk about I'm not going to talk about the other Implementations of Ruby most of which target 1 8 anyways with the exception of Mac Ruby Which has the benefit of sitting on top of 1 9 anyhow? I'm going to be talking about you are so yet another Ruby VM, which is 1 9 So just the plain vanilla Ruby Not that I'm not excited about those other implementations because I am so Obviously don't go out and grab 1 9 right now if you if you could This is where you would go and grab it it's being 1 9 is in subversion these days I think 1 8 is a branch as well that you can track it's a version if you want to get it edge Still changing on a regular basis Certainly a more stable than it used to be Okay, the klaxon I guess was because it used to be very unstable so the You can get 1 I know Directly from downloads page and from subversion and that's essentially how you build it Make sure you build it with some type of program suffix or something like that So you don't get very confused about what Ruby is on your system. I use 1 9 as mine so a little bit about the a little bit about the standard library and I Apologize a little out of date because I've done this a version of this talk a Couple times and this one didn't get updated very well. So there there may be some stuff here. That's that's different, but in general what you have is Ruby Ruby gems are now part of the standard library. They're built-in sore rake json ripper, etc. That you can see here Some of these may seem a little crazy You may not know what pro profiler is for instance. I don't really either Secure random for those of you that are Srand Nazis this one is for you If you really want random, here's here's one for you to look at and of course the HMAC digests so CSV was replaced by the faster CSV implementation Which I believe we have someone to thank for that and That's a vast improvement and then in things that have disappeared at least the last time that I looked soap Wisdell and base 64 and some of the much older libraries So for base 64 you're gonna want to take a look at pack and unpack. Okay, so We're gonna talk about risk factors now. So parts of your code that You're going to have a problem converting over to 1-9 because you're gonna do it eventually and you should at least be looking at it So the first thing that I'll say is that you need tests if you don't have tests now on your code First of all, you should have tests on your code You have to have tests because people at conferences will annoy you to death anyhow if you don't have tests and Bdd bdd bdd because that needs to be said at least three times in every talk Because it's new and cool and life changing So actually yet I like it as a concept not as a buzzword. Yeah, right tests Actually, James Edward Gray had a great quote in a Ruby talk thread many months ago about when he was switching over faster CSV to 1-9 and Talked a little bit in that About the fact that there's a lot of issues that you didn't realize that were there That your tests really really helped you find so and that's something I Just keep coming back to when I've been converting some stuff over to see how it works But I didn't have my test would be a hell of a lot harder to find these things. I mean with Ruby Obviously, you're not going to find some bugs unless some branches of code are being executed so the idea is get those branches to execute and Tests are the way to do that So this is a really big one in 1-9. It's text processing So if you're writing parsers faster CSV is a good example of this kind of stuff Regal parsers for instance an H for caught and and mongrel etc Are also good examples Well, not necessarily with mongrel, but so you've got the issue now is That we have this first of all we have new encoding support and now when you're using the string sub method when you're indexing into a string With a single index You're gonna get a character back. You're not going to get a number back Which you know is kind of what most of us have expected anyhow This is the thing that we've brought up for years and years and said yeah Yeah, when you index into a string you get back a number back and that's okay, so that's gone now We don't have to have that conversation with people, but we do need to convert over the code that relies on it So we have some now you can actually have different encodings for your actual source files, which is kind of cool If you're also Thank you very much Yeah, I wonder who that is I have a wife and two kids And it's during my talk. That's okay. So Where was I? Thank you dear so Encodings yes So yeah, we have these new encoding encoding conventions That's kind of an extra feature that I'll go into in a little bit But you certainly do need to know about string ord and in various unpack unpack C star unpack you star Just be familiar with unpack in general and pack as well It's just they're very very powerful and they're good to know about some examples of this and action With Ruby one eight and Ruby one nine what you get out of things Generally in Ruby one eight to get what you see in Ruby one nine you do something like zero dot dot one or zero comma one Or this dot chr So major difference there not backwards compatible at all The approach that has been recommended for people at for instance that are doing regular parsers It's just unpack your string into numbers and use them So convert one way or the other way or use character or to pull stuff out Below that you've got a little bit of Arabic and I'm pulling the same kind of stuff out on the left hand side I'm only pulling out a bite. So it doesn't really work nicely for me on the right hand side On the right hand side it actually pulls out the multibike character just kind of nice This is obviously using some encoding trickery Now granted actually typing this in text mate with a bi-directional text and trying to put an index on the end It was a complete nightmare So what I've actually done is I've actually taken the string and then taken the thing next to it and sat it next to It so it looks like it should text might gets a little confused by bi-directional So for those of you who just are dying to type Arabic You know your time isn't here yet so Yeah, sorry. I know that that just cuts out half the audience. So You see some unpacked stuff here with actually point out the Unicode Multibike and you know, are I unpacked to see all all of the crazy options there? If you do C star you get a bunch of crazy negatives for the for the Arabic word, so it's very helpful. So this is another one This is one that should only really affect you if you're insane anyhow So There's this really neat trick. It's very clever I always put clever in quotes whenever possible because I it's a synonym for stupid but This kind of stuff And usually this is a bug that somebody just hasn't realized In 1a that they're accidentally assigning to a variable to outside the scope using a block argument Usually that's a bug. You do see some people do crazy things like actually assigning to an instance variable Inside of a block for some insane reason Because Ruby's a new toy and it's shiny and it's pretty and they can do crazy stuff with it So this shouldn't exist in any code that you ever show anybody else But so you see the output difference here. The very last loop is going to assign The very last yield is going to assign item and outside. It's going to exist as for after the loop on the right-hand side the The block the block variable it is it is going that assignments not going to take place because block variables are always local It is going to shadow. It is going to warn you if you're using Ruby dash w which you should be using so Yeah, you're gonna want to name your variables inside the Inside your block something different anyway, so you actually know what's going on Going back a step. There's anything here. That's yeah So in a solution, it's just don't do that We're not gonna talk about error lambdas quite yet We'll talk about those in a little bit or pointy lambdas, whatever you want to call them But there's a way of actually declaring a variable as local so that you can use it inside without assigning outside to just pretend that that little Little arrow there which rain cold Dash rocket which don't even get me started is Lambda so inside of there you can see you're reassigning D and on that side You aren't because you're declaring is local, but you will still get the shadow in warning Okay, this is kind of cool. There's another one of those things that Kind of the principle of least surprises has changed and it makes me happy So hash select actually returns hashes now Which is nice because now you don't have this an array of arrays which I used to just Dot flatten and splat to to to hash So that I can create a new hash out of it So you were doing this thing where you're creating an array and making a hash and this just basically follows a principle that when you You was select on a hash You really just want a subset of what the hash is and yes, you still want a hash So the good news is that you can probably remove code to take to migrate this code Because you're probably having to generate a hash again and go through it now you can remove that piece But you might be expecting an array back and you might be doing other things with it to be careful So the cool thing is now if you had a for instance a hash called conferences, you could select on it and pull stuff out and Another issue Is that it already does matter on? select so In the past if you only had one Block argument it would get both the key and the value assigned to it Nowadays it looks out Sam Ruby actually I originally did this Did this talk Scotland on rails and Edinburgh, which is another great regional conference on across the ocean and I? Put out a PDF and people looked at it was on Ruby inside and Sam Ruby recently came out and did another talk He's much more focused on the string encoding stuff, which is cool because it's not a strong area for me and But this is a really good point that he made is that one of the main obstacles for us as a community Deciding 1-9 is cool and we can use it especially in production applications the fact that we have all these gems out there who? you know, it's not like It's not like we're red hat enterprise Linux where we have some kind of idea of what the maintenance status is of any given thing at any given moment and These are just sitting around and they might have 1-8 code. That's not compatible So you get 1-9 you install some gems and similar dependencies aren't working right so that's a real problem for us So as a community we need to do something about that need to identify these now now certain things for instance rails Runs fine on 1-9 meaning its dependencies run fine on 1-9 and at least what 37 signals is using Probably runs fine on 1-9 since I know they're using it to some degree so and that's great but there's a lot of other stuff that you may be using maybe you do things like Document preparation or something like that and you have some crazy list of gems that you use that are really arcane that nobody outside of your industry uses and it had one maintainer who in 2004 slapped together a gem and tossed it out and then he disappeared off the face of the earth You're gonna need to do something about that if you want to continue to use your software with 1-9 So no easy solutions there So new features talk a little bit about the mostly the syntax changes some of the encoding changes I don't want to go too deep there And this is kind of the cool stuff So m17 and Obviously there's a lot of I try not to put a lot of text on the slide, but here it is so versus me just reading it read yourself Kind of the main points here is that strings have encodings nowadays that your source files can actually have an encoding You can actually read things in encodings That encoding affects a lot of things it affects things like regular expressions various methods on string You can't just do dot each on strings these days you've got each character in each line and Each bite I think is another one that's out there you can take a look at what the encoding is on a string you also have Different ways of setting what your encoding is on a source file you can use There's some while there's some there's command line stuff I think you can do from Ruby, but also from the actual CLI But there's also magic comments that you can throw up in various formats So if you have the emacs style comment because you're using max You can use that if you have the misfortune to use them. I'm sure there's something for that as well And if you use text made, you know, whatever else there's just plain basic basic versions that don't give any hints and Obviously I already talked to you a bit about string sub and how to pull stuff out of a string So it supports a lot of different encodings. This is this was a complete list as of a few months ago It might be different nowadays So there's a lot of stuff here UTF-8 is obviously the big one for for most people that want to do stuff across languages So being able to pull stuff out of files doing IO stuff with with different encodings That's not that's now possible directly and a nice You'll notice in the second example. I'm also using an open version of the new new hash symbol trick thing, which is a Kind of reminds you of keyword arguments probably maybe a little bit of json The drop script at least probably pretty self-explanatory So that's this is a really really cool feature and this is one of the features that's on that that on that enterprise Checkbox that people apparently pass around that you have to have checked off for you to make money So this is a good thing This is the thing people complain about a lot is the fact that we don't have support for For unicode etc etc and that's been a big complaint and a valid complaint for a number of years. So It's been worked on we're going to continue to work on it So this is really cool because if you're a text processing weenie like I am and you come from a background of having to do things like data mining on and natural language parsing and crazy stuff like that Having really good regular expressions is really important to you one of the main reasons that I went from Python to Ruby years ago is the fact that I felt that Python's regular expressions were just clunky and Hard to use they weren't as natural as pearls were for instance and You know Ruby married this concept of really quick there's a regular expression literal you could use it really quickly You know, but it's it was missing some really really cool features from this newer ideas of Regular expression engines and on a Geruma, which has been available and is actually built into into text mate text mate uses it and There's some other libraries like ultraviolet, which is syntax highlighting library, which which uses it as well You can use it from 1a It's now Integrated into 1 9 so it gives you cool things like name grouping and various look-aheads and look look behinds and Stuff like that. It also has support for encodings, which is obviously a really important feature So that's kind of a cool feature Some differences with enumerable so this really goes to and the enumerators So this concept of an enumerator object that you can get off of some enumerable method And in Ruby 1a you have to require a numerator and a little bit different In 1 9 All the enumerator methods all the enumerable methods actually if you call them without a block will return an enumerator And you can do things that enumerator you can call next on that enumerate on that enumerator I know at one point it actually held up. I think it held a lambda which actually held the operation that it was doing I'm not sure if that's true anymore But one of the cool things is you've got with index So now people can stop complaining about not having hash Each with index which has been a constant Complaint for four years. So now you have it. You can even add your own crazy Crazy things onto enumerator if you'd like and extend it So However, what this does and I didn't mention this in the I Didn't mention this with the with the risk factors that does change things like each with index and stuff like that So you have to be aware of those as well. So Dot instead of underscore and if you use our spec You're kind of confused about where to use a dot and where to use an underscore where to use a space anyways So you'll probably figure it out. Just fine Enumerable, so there's some other cool things that you can do Familiar with symbols of proc from from rails from from active support That's now in one nine. Some people hate hate it. Some people love it. It's not who you ask but There's also something reduced, which is essentially the same thing as inject Actually, I think it is the same thing as inject. I don't know. Yep. I'm getting a nod. So that's that's a yes and You can pass it either a symbol Or a symbol to proc and it will essentially if you're familiar with if you're familiar with functional languages You'll think of these as essentially kind of like a fold and it just flattens things down This is you can think of this like dots some as well. There's also a whole bunch of cool features like that It's a whole bunch of new new methods on enumerable that it it makes sense to take a look at Some of which are here So cool things like take and group I group I is now part of Ruby, which is which is nice Min buy and max buy so Back in the old days. You only had sort and then you got sort by and it was really excited and then now you have min buy and max buy You can do a count which I believe is essentially a select dot size So kind of new things there this is just take and drop way to just grab something out real quick So hash changes at least is the last time I checked Hashes are actually They track their insertion order so you can actually go over a hash in the order that it was things were inserted This is probably familiar to those people that these PHP and have Associative array is that kind of thing so You can see I'm putting stuff in I'm taking stuff out. I'm putting more stuff in and things are some things are staying ordered so Happens a little thing on object if you're familiar with active supports Returning this is very very familiar. This is very similar to returning This is another one of those things that people say is horrible because of performance because of you know those microseconds slipping away from them so Just be aware it is there And it's kind of neat So if you're not familiar with returning what it's really doing is it's passing itself To that block you can do stuff with that block and it gets returned This is kind of cool for for especially for things where you're fiddling with an object in a method and returning that object back And you're doing some type of configuration on that object. You don't want to have to You want the bounds of of the of the scope to be very very explicit You know even though the method you know it was pretty explicit It's kind of a neat thing So this is probably the thing that when people think when nine immediately comes to the front of their mind And it's this new proc literal and you'll forgive me if I use the words proc and lambda interchangeably because in my mind they are interchangeable and Lambda is what I actually usually call them. So So the the main the main thing here is and I'm gonna fall back into a terminal when we can go over this stuff and We can try out various permutations By all means I want to have you guys ask ask questions But one of the main things here is that we actually now versus us having Lambda, which is a method that you pass a block to But you get a proc out of you actually now have something that's built into the parser to create these and It is a lot more flexible than the Than the goal marker type And the blocks because you can actually do things like it can actually receive blocks itself Which you couldn't do before and you can do things like default arguments optional optional arguments as well, which is nice So you can pass blocks to them And you can do default arguments to them as you saw earlier You can do things like declare things as local variables, which is this kind of arcane thing which is very experimental and I'm gonna Well, I'm certainly going to Talk a little bit about a little more about those now in a while So I thought I had another slide, but I guess I don't know I will pop out to a terminal so simple changes We've got to proc now like I mentioned in general there's less sibling rivalry between symbols and strings which if you Have worked, you know rails created this idea that you use symbols all over the all over the place especially for things like keys and hashes But you also had stuff coming in from parameters that were strings and you were doing comparisons and especially when you were trying to do Things like index into the things It would fall all over itself. So now you can actually it will pretend to be a string In certain ways. I know they I know that the idea of Symbols actually being frozen strings were what's flirted with and I think that was Removed due to performance concerns and probably other concerns as well But now they at least kind of pretend to be the same We're not can't use double equals To check them because you know they are different objects. So that's That would probably be a little bit too much But triple equals does work so things like case statements work, which is nice so threads Threads move to a native threading model from a from a user for a model There are actually three different models who open up thread.c Because you do stuff like that for some reason you like see code a lot and and read through there's actually three different models That have been thought of and one of which is users user threads and one of which is one of which is native threads with a big giant VM lock and another one is with finer grain locks When I believe that's been built in right now as model 2 I Don't read a lot of C. You know as in my leisure time So I And I'm also not a VM guy so I haven't dug in very very deep with exactly what the status is I know that's been changed back and forth over various various times But when 191 comes out hopefully this Christmas You know maybe we'll we'll have walked down a little bit this is it's kind of cool to have it's kind of cool to Run Ruby kick off a bunch of threads Performance being much better and then going to take a look at top and and seeing the difference in the thread count so this has been another one of those checkboxes that we've needed and Especially for people coming from the Java world. This is something that like it They couldn't believe that they were in this wonderful language. It didn't have this feature that would they absolutely need it You know, and it's it's been something that That's kind of hounded us. So fibers Fivers are essentially semi-co routine and You can kind of think of them as lightweight user level threads that you manually schedule I guess is kind of a way of thinking of it Semi-co routines is I believe a phrase that comes out of the Lula language originally there are a few projects that use it Reeve actor, which is an actor framework for familiar with Erlang and actors It's really neat to me especially Primarily focused on on the IO side of the house But pretty neat never block which recently came out. I believe also The one nine version at least it's on top of fibers. I think they have some 1-8 stuff Also, this isn't this is a really one of those cool things I think it's really really cool, but in a very abstract way of oh someday. I'd like to have a problem that that will solve Generally when I do Ruby stuff, I'm not doing stuff with threads Maybe born out of some kind of fear of the old thread model But also those aren't my the problems. I generally solve if I did solve them. I might think about Other languages because I like having a toolbox. So there are a number of Good blog entries to read on fibers There's a number of articles that are out and info queue has a fairly decent article Dave Dave has a really good series of Articles on fibers and Dave and Flanagan have kind of an explanation. So we're going to go into questions You have about 15 minutes looks like So questions yes, I don't think I can explain the history behind the tap method Matt's may be willing to talk about that Here later this week, but I will tell you that a little bit of the history of I guess I guess The tap method was driven at least in part by returning I would assume there seems to be Yeah, this kind of reminds me tap kind of reminds me of small talk to semi-colons for some reason as well The ability to chain things on to the same to the same object it I can't really tell you why it's called tap Yeah, I guess you tap into the chain It also kind of reminds me of jQuery the end stuff and jQuery you can kind of go back But in a less way that makes a way that doesn't make me Bomb it as much, but although I like jQuery So yeah, I don't know I don't know about the entomology of it, but the from a from usability perspective It owes a lot of at least Why it's cool to people to to returning there's there's a good subset of people in the rail community that they use returning as a pattern Yes Sorry, I Wondered if you could give us your opinions just your personal opinions on the changes that happen to lambda specifically Well, just just the the formatting changes. Yeah, okay So At first I really hated it. I really hated it I think partial partially that's because I Have been using Ruby so long that I see any changes a scary thing to some degree But so yeah at first I really hated but the same time I use functional languages and functional languages usually build a Senate a much closer level than object-oriented programming languages do I Love lambda I love because I have a background in functional languages. I I love them so At first it kind of took me back because I also worked in work in the pearl world for a while and I really hate the mentality that we should try to make things as obscure as possible to read I Really like elegant code and I felt like the more puncture, you know The idea of the more punctuation that you add to your code the less readable it is It's the whole brevity versus clarity kind of see-saw That being said the the one thing that the thing that kind of Over time has made me feel more comfortable with it and now I really really like it is Well, first of all the utility So aside from bike shedding Matt's in the the team on whether or not the argument should come before the arrow after the arrow because I'm a language designer And I know all that stuff Everybody's a language designer So besides that discussion the utility is it's There's so many more cool things that are possible because you can do stuff Like have blocks being passed land of whole new thing whole new Use cases well not in these cases, but but whole new patterns are going to emerge out of this in the Ruby community The Ruby community is really good at building patterns. So that's really exciting to me And I'm hoping the Ruby community self-regulates to some degree when we you know do things like I Don't know I recommend ostracizing people for for horrible lambdas I don't know maybe we can come up with some kind of punishment And I know some schedule of punishments that we that we can do It does bring up the possibility that people are gonna come up with this crazy crazy stuff I have always hated the fact that there's this word lambda that doesn't flow Dave in a in an article a few weeks ago talks about name scopes And the fact that that arrow is a lot clearer because you can just read across and there's no Lambda word that catches you up. It's like when we're reading blocks and sometimes you hit do and sometimes that do make sense And sometimes it just seems weird Landas are a little bit cleaner now granted when you do things like our declaring variables as local and You're using some of those advanced features Landas become hell With this I mean it just I didn't even talk about dot-call really let me go back a little bit. So Yeah, I totally just glossed over this So looking on left-hand side or we pick pick one See the first line there what I'm doing is I'm assigning a new lambda to M The second line there What I'm doing is and I'm invoking M and in 1-8 what you would do is you'd say m dot-call This is a shortcut for m dot-call. I call this dot-call just because I'm really hoping that you know people will pick it up and I Don't know I'll have some kind of some amount of fame out of coming up with a name for something like hash rocket Maybe I'll build a company out of it It'd be really cool dot-call I could spend $15,000 on a logo. It would be neat. Um I love those guys. So the uh So that's a nice shortcut. It's weird though, you know, it it takes it takes a bit of time So I recommend that you let this stuff before you come up with any Really strong opinions that you kind of just let it sit there for a little bit and and uh, you know Play with it and get a feel for it before you decide you hate it or you love it so That kind of answer your question Hello We got questions on the mic, please. Can you hold off? Oh, sorry. I'm gonna let Jim I'll let Jim do it cool. So Hey, so I'm you and I do murb some of the time. So what I'm worried about these days is that um Sort of the jasification the javascriptification of ruby where so a lot of people are like it's going to become fragmented and things are going to get out of control and We're not going to have ruby But if you look at javascript something else actually happens, which is that there's a core that is Javascript and then every interpreter adds stuff to it and what people end up having to do is writing Code that says if you're in ie Do it this way and if you're in firefox do it this way and if you're in safari do it this way And so that's my personal worry is that people will have to write if you're in j ruby do this and if you're in Um, if you're in rubinius do this and if you're anywhere I do this and it seems like one nine has the potential to Further complicate that mess of it doesn't seem like one eight is going away But if one nine actually has any adoption it seems like Code is going to have to exist that forks Yeah, and that seems like it would suck. Yeah, um Actually sam sam ruby slides one of the things that he Mentioned in several several cases is he guards sections of the code by checking something like whether or not string response to encoding and things like that Um has a really easy way. Of course, you can just check ruby versions. Um Yeah, I mean that's my fear in general. I think that fear is almost completely separate of of one nine It's my fear of implementations um Let's not pretend that the ruby parser is Is easy reading in one eight either because it's not read parse dot y but Yeah, one nine is a whole new set of syntax features that people will add or won't add um Yeah, and if you're if you're trying to work in one environment and push up to another environment or share code via gems Yeah, I mean that's a real problem. You already have that problem in You already have that problem in h precot And you already have that problem in j song where they've taken the regal parser and made java versions of the regal parser and native versions of the regal parsers Um So that yeah that already exists and I don't know I don't know if there's any easy answer to that I don't think one nine really makes that worse Besides the fact that one nine is just another version That we'll have to wait to see if people ever catch up to their implementations Because like I said, everybody's targeting one eight right now anyhow, and I'm sure one eight will exist for a long long time Especially in production environments I think it's it's a reasonable It's a reasonable concern Next question jim So with um hashes having an order Is there a way to control the order? Sort reverse unshift I don't know if there's any way to make indexing. I don't I don't know if there's any way to make the order To restick it some other way Besides removing elements and adding elements. This is assertion order or declaration order. I guess when you're When you're when you're putting it together. I don't know if there's in php if anybody's really familiar with php Which also has a similar kind of structure? um Yeah, I'm not certain I'm not certain on that Matt's might be able to answer that question Latest later during the conference Every now and then when I'm paying attention, um I see a a deprecation warning of invocations without parameters Oh, okay. Well, what is that and is that gonna happen? I don't know if we're always getting that Even with a single argument or you're getting it with multiple arguments. I've I just I don't really I didn't really pay attention I've seen this I've seen the text come across a console But I'm wondering if that's actually something that's going to be you know for real layering your methods without parentheses, right? You know definitely bark is that's verboten. Yeah, don't do that But yeah, I mean certainly in cases where you're invoking a method and you're passing multiple arguments And rubies of worry that it's going to be a little bit ambiguous or it might change the rules I haven't seen any for invoking, you know period You know with with with a single argument or something that's very clear simple argument less. I haven't seen a warning Um, it's possible. I just missed it That's another thing that maybe we can okay It's really handy by the way to have to be talking about one nine and have match right here Maybe able to look over here and have him nod and then if I don't know the answer to a question say talk to him later I just love that system. Can we fly him in every time? That'd be great. Um Great. We got time for two more questions two more questions, please Anyone else? Got a surplus Awesome, okay, so um If anybody has any questions about one nine later and you're too embarrassed to talk in public, um, You can you can talk to me later. So thank you mats. Um, very much And uh video equipment rental costs paid for by peep code screencasts