 Is the size okay, or should I make it bigger? Okay. Like this, or even bigger? Yeah, in that case, I think I just open another window and clear or? Okay, I can see, okay. Yeah, so this is the second time I do the Ruby talk here. Like last time was really, really, really bad. After that, I feel that talk was so bad that I eat a lot of crap during the next months. So hopefully this time I can do it better. And yeah, I see I also need to make it faster because we are kind of running shuttle time. So this time I just share five random Ruby tips and frankly speaking, before this meetup, I actually don't know four of them. Yeah, so I mean, I mean like before yesterday, yeah. Before the day yesterday which I prepare, so. But after I prepare, like the best way of learning something is to actually show something. So yeah, it's like this five I feel, okay, it's very, very nice tips from what I feel. So let me begin. So the first one is binding and evolve. It's, let me just show you the, yeah, binding. Yeah, so binding, I will know like, okay, we can call the binding to get the binding of the current scope. I will say that correct me if I'm wrong. So basically, if you do a binding here, so you can do a, a binding has a few measures like local variable get. To put it basically from, if you get a binding, you can get the local variable from that binding. Or you can set a local variable for that binding. So if you create a new instance A and then you can get a dot get binding. So if you, yeah, probably let me just put my commands here. So, oops, yeah, so basically, yeah, so basically how you read this A dot get binding if you print out the local variable which is binding as a time then you'll get the binding. So basically what you'll get is this part because you define B. And then you can, and then if you call it twice like, for example, if you create another, sorry, if you get binding, B1 is the first time you'll get the binding and then B2 is the second time you'll get the binding. And turns out that B1 and B2 are different, okay? The local variables are the same, but the value of the local variables are different because you are getting it at a different time, so, it's the same, because I couldn't know. So from here you can see that the first time when we define, we define B as one and then the second time when we call the different B as two, so when you, yeah, you can see for clearly from here, okay? So this is bending and together with bending, I want to talk about evol if I pronounce it correct. Let me make it this part larger. So, the definition of evol is that it takes in a string which is a string that evaluates and then the next parameter is the bending. It's basically the bending that you are evaluating this piece of code and then the next one is the fail name and the line number. It's useful, I can show you later. So the first one is that, let me see where am I? Yeah, so you can basically evaluate something and this will just define A. It has a bit of trick here. I just skip the trick because running around the time issue. But later on, you can try it out for the trick itself. And then, for example, the use of the, so this random file corresponds to the file name and then the 32 is the line number. It's useful for debugging purpose. So if I run the code is on this side, you can see that it gives me the error and actually tells me that it's in the random file, 32 which is corresponds to the parameter I pass in here. Okay, so yeah, so, and then if we go on, so that, okay, together with evolve and bending, we can create something called. This is just something that I create when I was trained to do the demo. Like, I will use this class defined later on. So basically it's called explicit evolve. So basically what it does is, hey, where is my syntax? Okay, so what it does is it will initialize a sign of bending so that whenever we do the evaluation, we'll evaluate upon the bending. And when we run the evaluation, we have two methods. One is the implicit, which means we just run the evaluation suddenly. And then the next one is explicit, which means other than running it, we also output the expression itself and the result of the expression. So that it's easier, it's good for demo purpose. Later on, I will use it. So basically, I think it's quite self-explained. Yeah, sorry, I think I need to commend all the errors, the exceptions here. Yeah, so basically, from my left hand side, it has the, so basically if I call it implicitly, it just shows the equal and result showing you the result. And if I call it explicitly, it just tells you the result at the same time. So it's easier for you to show the results. So this is the first tip, the first long tip actually. Yeah, so come to the second tip with the terminal. Okay, so come to the second tip, which is the object space each children. I use it to get the descendant of the class. It's quite useful for getting the descendant of the certain class or module, let me show you the code. So for example, this is a setup. So you have a class A, and you have a class B which extends A. And you have module M, and then you have a class C which includes the module M, and then the D which extends from C. Actually, this A and B is not really used. So basically, when you run the object space. So the object space has actually only have a few methods. One of them is called each object. So each object will, what it does is for a given class, it will give you all the instance that is defined for, which are the instance defined for this given class and pass back to you. Since all the module or class are subclass of class. Not subclass, but are the instance of class. So, if you pass in the class, and you check if it extends M so that you can get all the class that which extends M. I'm not sure if I make it clear or, okay. If you are not clear, later on we can discuss. And yeah, this is the second tip each object is pretty useful when you are in the Reels console or huge Reels app. Like sometimes hierarchy is so huge that you want to get a certain children of a class, a descendant of a class is quite useful. And then the next tip is tail recursion. Like, I think it's like several months ago, I learned the fact that Ruby doesn't really like tail recursion that much. Because I think that was because of a discussion that, okay. If it's tail recursive, that means when there is an exception happens, then the stack trees will be very hard to understand because you only got one stack rather than, I mean, if you do the tail recursion optimization, then the previous stack will be gone because it has been optimized. But there is a way actually to turn on the tail recursion. So basically, this is the file that is with the tail recursion turns off at first. So this file after level 10, so basically just a recursion which if it's less than 10, it will just increase the level by 1 and do it tail recursively. And when it's about 10, it will just fail. So when you run, you just see, actually because the font size issue, so actually there are 10 levels, like if you run the code, there are 10 levels. And there are 10 levels because stack trees. So the issue here is that, actually I just learned this yesterday when I was trying to prepare for the talk. So there is a Ruby VM that instruction sequence compel option which tells you what the compel option that you are currently holding. So yeah, these are the set of compel options and for most of them, I don't really know what they mean. But I think if you Google and try it out, Google probably will not tell you. I tried some, it doesn't tell me anything, but at least for one, the tail recursion, a tail call optimization, yeah. If you set this to true, it will actually optimize for the tail call. Okay, let's try to set it to true, yeah, I'll comment out. Yes, yeah, now the statuaries only got one level, which indicates that it has been tail recursion optimized. Is this globally? Global, yes. But the thing is, one interesting fact is that if you put this definition here, then this will not work. If you do it this way, it will not work. It will not be tail recursion optimized because I guess the reason is because when you run the code, it will be loaded into the Ruby VM out together. So if you turn on the option, it doesn't work. But I haven't tried it out, but let's try. If you put evolve, I think that will work. Let's try, yeah, because it will evaluate dynamically, yeah. Yeah, just to review the evolve also. And then, yeah, the next interesting tip, which is the only one that I know before I prepare this talk is the array. Like, array got a few operators. Yeah, I think it's, since I have this explicit evolve, beautifully written, so you can just read the code, I guess. Yeah, so basically, I define A and B and then A plus B, you just merge them. A minus B, you just, like, it do a div. Times means repeat it several times and combine it together. And times with a string means join. And then N means union. And then, oh, sorry, it means intersect. And then the PEP is union, yeah. It's interesting operators upon the array. Yeah, so this one is quite simple. And then the next one is when I read the book called, oh, I forgot the book. Later on I'll show you, it's in the reference. So, I just realized, actually Ruby got kachan zero, which you will feel very comfortable if you are from Java background. Like, kachan zero is designed specifically for the float control. Like, if you have exceptions, exception will keep all the stat trees. So when, if you use exception for the float control, it will be a bit slow compared with this catch and throw. So I think the code itself is, it can describe itself. So basically, if you throw, you jump to the place with the catch and then you continue the evaluation. And if you do a speed comparison, you can actually see that catch is actually five, oh, sorry, two times faster than slow if my memory is correct. Yeah, this is actually from the, I learned this fact from the book called, where is it? Oh, the complete guide to reals performance. Yeah, it's really a nice book to read. Yeah, recommended by Vincent. So, yeah, that's all for the five Ruby tips and a few recommendations. Number one is a book. It's really a nice book. Yeah, thanks. I didn't like it. Yeah, he recommend me. So the next one is Ruby top pass. I guess it's actually a collection of Ruby tips. If you just, when you have lunch or dinner, you just go there and watch the video, it's really nice. And then the Ruby doc. Yeah, the Ruby doc is, actually all the things I mentioned is are from Ruby doc also. If you explore, it's a meta Ruby tip. It's a collection of a lot of Ruby tips. Yeah, that's all. Thank you. Yang Yu gave the point after this.