Okay, hi everyone. My name is Sanjay Varma. I've been writing Rust for just over two years now and I'm the author of a Rust library or crate called Turtle. The Turtle crate is unique in that it's designed to be usable by people who haven't learned programming before and it's actually a teaching tool that's for anybody who wants to teach Rust to other people today. So today I'm going to talk to you about my experience creating Turtle and tell you about the specific things that I did to make the crate as easy to use as possible. There's a lot of thought and care that went into creating Turtle and I'm really excited about sharing that with you today. I'm going to start by giving you an overview of Turtle what it is and how to use it. Then I'm going to give you a high level tour of how Turtle works and talk about some of the specific design decisions that I made to make Turtle as usable as possible and to make sure that we can grow the Turtle project as it matures. I'll talk about some of the lessons I learned as I was creating Turtle and give you some tips on how to make your own projects accessible to a wider audience. Finally, I'll finish off with some thoughts and a summary of what I've told you about. So there are a lot of resources online for learning about Rust. There are full books, online tutorials, websites, podcasts, and YouTube channels. So where does Turtle fit into all of this? Well, the vast majority of these resources, if not every single one of them, is aimed at about the level of somebody who's learned at least one programming language in the past. So while these resources give you a good introduction to Rust, not a lot of these resources give you a really good introduction to programming. So just over a year ago, Steve Klamnik, who's the author of the Rust book and the leader of the Rust documentation team, made this comment on Reddit. He said that Rust could be somebody's first programming language, but the resources and learning materials that are needed for that just don't exist yet. So I thought about that comment a lot because Rust has incredibly good error messages. It has a friendly, kind, and helpful community, and really nice features that make you productive and allow you to have a lot of fun when you're programming. My hypothesis is that Rust is going to make a really great first language for anyone wanting to get into programming. And so my goal with Turtle is to create the resources and community that we need in order to make the Rust language a language that anybody can learn. So now that you know what I'm actually out to accomplish, let's talk a bit about what Turtle actually is. The concept of the Turtle crate is actually pretty simple. You have this window, and in the middle of this window is this little triangle. And that triangle is actually a turtle. It's the turtle's shell. So this turtle is pretty special. If we enhance this image a bit, you'll see that this turtle actually has a pen attached to its tail. That's a real drawing that took me a lot of time to do, despite what it looks like. So this pen is pretty awesome because we can use it to draw pictures. If you look here, as the turtle moves, it drags its tail and the pen actually draws the path that the turtle takes. And so this is the central concept of the Turtle crate. And you can draw all kinds of amazing things just by telling the turtle where to go. All of these were drawn in Turtle, and some of them were actually contributed by people in the Rust community. You can find the source code for all of these drawings in the examples directory of the Turtle GitHub repository. The reason this is great for teaching is that the interface provided by Turtle is fairly simple without being limited in functionality. There are movement and rotation methods, methods for controlling the turtle's walking speed, methods for manipulating the pen, and even some commands for filling the shapes that you draw or controlling whether the turtle is visible or not. You get all of these different ways to draw with a very simple mental model to teach. It's just a turtle moving around the screen. So this type of teaching tool goes beyond the typical text manipulation of most introductions to programming. You can write lessons that produce really cool drawings without necessarily needing to dive into the more complicated features of Rust. The idea for this actually isn't even mine. If you look up Turtle graphics on the Internet, there's a pretty rich history of people using this to teach other people programming. In fact, one of the first incarnations of Turtle was a real physical robot. The robot would move around a piece of paper and draw pictures. A software version of Logo was created to be used with a programming language called Logo.  Lots of languages have built-in implementations of Turtle graphics. For example, Python has a module, a turtle module, that allows you to draw pictures just as easily as if you were using Logo. So in this code, Turtle.forward instructs the turtle to walk forward by 200 steps. By calling Turtle.right, you tell the turtle to turn to the right 90 degrees. The idea with the Turtle crate is that we can now do the same thing in Rust. Notice how both the Python version and the Rust version look almost identical. It was really important for me to make sure that this was a useful tool for teaching Rust, not just an identical copy of the Python implementation, and so the Turtle crate is written in idiomatic Rust and follows Rust best practices. One thing you'll notice in the Python code on the left is that we directly call methods on the Turtle module that we imported. We didn't create any Turtle explicitly, it's just there in the module itself. And so the Python implementation uses some global mutable state inside of the module itself in order to implement that. Global mutable state is this pattern that can lead to a lot of subtle bugs and cause problems in your code. So that's why in the Rust implementation, you actually have to create the Turtle explicitly as a local variable, and you even have to mark it with the mute keyword in order to modify it. Rust won't even let you use the forward and right methods if you don't declare your variable with mute because both forward and right modify the Turtle itself. So this is a tiny bit more friction than you had to experience with the Python implementation, but I think it's worthwhile because it teaches people good habits that'll help them in the future as they continue programming. And the wonderful thing about Rust, and this is particularly for Rust, is that even if they do, for example, forget the mute keyword, there's this really nice error message that'll tell them exactly how to fix the problem and tell them what went wrong. That means that even if you're new and you're still not used to things, it's very hard to get stuck if you just read the error message. I'm very proud of the fact that although there are a few differences, the Rust code is basically the same as the Python version. And accomplishing that took quite a bit of effort. So let's talk about how I did it. The Turtle crate has quite a bit of stuff going on behind the scenes. The crate creates a window, manages events like the close button being pressed, the window being resized, or someone clicking on the canvas, and still has to respond to all of your drawing commands with the appropriate actions. Behind the scenes, Turtle has to run a complete event loop while still allowing you to write normal looking code that is reasonably simple to understand. Well, what's an event loop? Well, basically, the idea is that both the program and the user are continuously trying to do things at the same time. A program written using only the Turtle crate might be trying to draw a picture or do some calculations, whereas the user might be minimizing or maximizing their screen, clicking on something, or pressing a key on their keyboard. An event loop simply manages all this continuously in a loop. Inside of an event loop, you take turns quickly switching back and forth between handling the events from the user and performing the internal processing of the program. This isn't actually too hard to grasp once you get the hang of it. And if I were writing a general purpose graphics crate, I would definitely allow the user of that crate to write their event loop themselves so that they could have full control over their application. But that really doesn't work the same way for Turtle. It's not that important here because we're really only trying to be a good tool for teaching rest. These kinds of details don't really help us, and that's why we hide all of that behind the simple interface that you saw before. So this is how the architecture of the first incarnation of the Turtle crate looked. When you create a turtle in your code using Turtle new, the Turtle crate spawns a new thread. That thread is where we create the window, run the event loop, and do all of the rendering and event handling that I described on the previous slide. Since all that is going on in a separate thread, the user's program is able to run normally on the main thread. When you call methods like turtle.forward or turtle.write, the main thread sends a message to the event loop thread to let it know what happened. The threads can communicate back and forth to do drawing and handling events as needed, and this is a great and relatively straightforward way to accomplish our goal of having an easy to use interface that hides all of the complicated details of the event loop and rendering. The event loop runs in the background, and the main thread goes on normally telling the Turtle what to do in each step. Now there are a couple of things to consider about this, though. Normally the program ends when the main thread ends. Now we don't want that here, because that would mean that the window would immediately close after it finished drawing whatever the user's program specified. To prevent that, when the Turtle goes out of scope, we actually wait for the window to be closed, and then we end the main thread. In addition to that, we need to make sure that any memory that's shared between these threads, any information we have about the Turtle or the drawing or anything like that, is available to both of them as much as possible. We wouldn't want the main thread to wait for the background thread or vice versa. So this approach actually worked really well, and it allowed me to get Turtle off the ground. I had a working crate, and I even published it for the world to see. However, given that the last slide was titled attempt number one, you probably already guessed that this didn't last long. Yes, unfortunately, the day after the crate got a lot of attention, someone came and found out that it didn't work on Max at all. See, I developed Turtle on Linux, which is apparently totally fine with you creating and managing application windows in any thread at all. But on Max, the implementation of window management isn't thread safe. That means that in order to manage a window, you need to create it and handle the event loop on the main thread. This is a huge deal, because the whole magic of Turtle is that you could write simple, normal looking code on the main thread without doing anything special in order to create the window. Like it would not be good to have to force somebody to squeeze an entire event loop in the middle of the Turtle code we saw before. The code on the right here is completely different from the left and way more complex for a beginner. So it was unacceptable for me to have to add this extra burden of complexity to Turtle. Turtle just couldn't be an effective teaching or learning tool if you had to learn about all of this just to write simple programs. So after a lot of thought and consideration, I came up with the second architecture. I needed some way to continue to allow the user to write their program on the main thread and also create and manage the window on the main thread as well. We can't actually do both of these together at the same time because the event loop has to be able to quickly switch back and forth between rendering the drawing and processing events. It wouldn't be good to have the user's program and the event loop compete for time. Now if only there was a way to have two main threads, that would solve all of our problems. Well it turns out there is actually a way to do this. While you can't have two main threads in one process, you can have two processes with one main thread each. And so the solution I came up with to give me everything that I wanted was to spawn a new process to run the event loop instead of relying on a separate thread. Now processes are a little bit more complicated to handle than threads, but if you do it correctly, it turns out to not be that bad. We're still sending drawing command messages, it's just that now we're doing it between processes instead of between threads, and we're still waiting for the window to be closed before we exit main thread number one. Instead of sharing state between threads like we were before, we now have to deal with synchronizing that state between two processes. The way we handle this today in Turtle is pretty simple. We just keep all of the state in one of the processes and then we make the other process request it whenever it wants to look at it. So this attempt actually ended up working great. It took me about two weeks and 59 commits to convert the old architecture to the new one, but that's mostly just because I was busy during those two weeks and I'm not afraid of commitment. In reality, it probably only took about a day or two of work to convert the old thread-based architecture to the new process-based one, and this has actually been so successful so far that this is still how Turtle works today. Now one of the greatest things about this is that it actually didn't require any changes to the public API at all. The entire Turtle crate stayed the same, but the internals of how it worked got completely switched out. The Turtle crate you see online today is in no way complete. It's fairly stable now, but there are still a ton of features that we could potentially add. I've taken a lot of time to carefully plan things so that we can reach a minimal viable product and then build all kinds of really cool features on top of it. Turtle has a really well-organized issue tracker with lots of good first issues and help wanted issues if you're looking to get involved. We're really open to anybody of any experience level with programming or with Rust and we'll help you figure things out as long as you're willing to work with us to do so. We especially love it when people come and contribute examples to Turtle and there's this great example idea label on GitHub if you're looking for inspiration. We really want to see it if you use Turtle to create something cool and these example ideas are just there to spark your imagination. If you're interested in contributing to Turtle, but you're not sure how to get started, we have a detailed contributing guide that walks you through the process of contributing step by step. A great way to contribute if you're looking for something to do is to read this contributing guide and tell me where you get stuck so I can fix it. Opening issues is fantastic. The future of Turtle has a lot of really cool features. I want to add things like multiple turtles, 3D drawing, text rendering support. We want more widgets like buttons and text fields for user input. We even want to add asynchronous turtles using async, await, and the futures create. And add web assembly support so that you can write Turtle code from your browser without downloading anything at all. These are all really exciting ideas and I'm definitely going to need all of your help in order to accomplish them. In particular, I need people to go and try Turtle out and see what you run into. If something in the API needs work, it's better to know now before we commit to a stable release. Trying out the crate today and drawing something non-trivial is a great way to help out today. As I was designing Turtle, I put a lot of thought into what kinds of things the crate needs in order to be accessible to people who don't know programming at all. I don't know of any other crates that try to do this, so it was particularly important that I think about it a lot and get it right. I'm now going to share with you some of the things I learned along the way and give you some tips to help make your own crates more accessible to a wider audience. So it's true that not every crate is aiming for as large of a group as I am. Most crates probably don't need to or even shouldn't try to cater to people who don't know programming. It would be way too much to ask of every crate author to teach basic programming to every user of their crate. That being said, the nice thing about at least thinking about it is that you have the opportunity to increase the number of people who can use your crate successfully. I've sat down and taught rest to people who don't know programming that well and managed to explain some pretty complicated crates. Sometimes you just need somebody to put in the time to write something that will teach you what you need to learn. When you put in some effort to make your crate accessible to an audience that might not be familiar with what your crate does, it benefits everyone, including the people who are experts in it like you. I'll give you a small example of something that I did to make Turtle accessible that actually ends up helping me a lot. Turtle isn't just meant to be a good teaching tool, it's meant to be a very accessible project for people who want to contribute to a Rust project. That's why if there are any quirks that might trip someone up when they're trying to contribute to Turtle, I take extra care to make sure that people get the information they need. In most crates, you can go in and run cargo tests to run the tests for that crate. But since Turtle has a graphical user interface, just running cargo tests alone would make a whole bunch of windows pop up unnecessarily. This is undesirable, and closing all of these windows is really hard. So I added a special test feature to the crate that disables any window creation during tests. The problem is that you can't just run the regular test command anymore, you have to run cargo test with the features flag and then add the word test. I didn't want people to get tripped up on this, so I used a special macro that Rust recently added called the compile error macro, and so with these two lines of code, if anybody tries to compile tests without the appropriate features flag, they get this really nice error message that tells them exactly what to do. This was supposed to be a small quality of life improvement that I only really intended to help new programmers, but it's something that's helped me a whole bunch of times as well. There have been plenty of moments where out of habit, I've run cargo test, and instead of getting a whole bunch of windows popping up and having to close all of them manually, I've gotten this nice error message that reminds me what to do. Thinking about less experienced people using your code can really help you as well. So some of the things I talk about today are probably going to seem a little bit obvious at first. This first one, good documentation is probably something you know to do already, right? Like want to make your crate more easier to use? Write some docs so that people know how to do it. The thing is, to make your documentation actually good, you need to put some thought into it. I find personally that the first time I write documentation, I only really end up writing it for myself. There are some docs, but really I'm just writing notes to myself so that I don't forget a couple of things that I want to remember. To write documentation for a wider audience, you need to actually think about the people who are going to be using your documentation. You need to think about what they know, what they don't know, and what you're going to need to explain to them in order to make your documentation as useful as possible. You don't want to bog them down with information, and you want to structure your docs so that they get the most important information first. It's also a really bad idea to try and write your documentation after having written all of your code, because you'll probably forget most of the important things that you want to write down by the time you get to your documentation. In the turtle crate, we take documentation really seriously. We aren't perfect yet, but we really make an effort to have detailed documentation that covers the information you need in order to use the item being documented. One example of a method that has some pretty good documentation is the set speed method. Here, we take the time to explain the most important information about the method, what it does, how to call it, when it might panic, and we talk about how to achieve specific effects using the method, using some special values that it can take. Since turtle is targeting new people who aren't familiar with programming and aren't familiar with Rust, we also take the time to explain some Rust concepts that the user might not be familiar with. Now, one way you can avoid such long-winded explanations is by linking to the many Rust resources that are available online. We do that a lot in the turtle documentation, and if you're a little apprehensive about writing docs yourself, this is a great way to cut down on the total number of things that you need to write. So don't hesitate to take advantage of the resources that other people have created to make your life easier. One of the final things that I'll point out about writing good documentation is that you need to think about how people will find the information that they need. The users of your crate will not always be experts in it, so they need to know which types, functions, or methods they should look at if they're trying to accomplish a certain task. One way you can help them is by putting something at the root of your documentation that directs them to the places they might want to go. You'll find that this is convenient for yourself as well, because you can reach the documentation that you want to see faster. Examples. Examples are really important, and it's really easy to write bad examples. There are quite a few methods in the turtle crate that need to have their documentation improved a lot. In fact, sometimes in my own haste to finish something, I've written examples like this. This example is more of a unit test than a real example. It doesn't explain anything. For an example to be useful, you actually need to motivate it and talk about why people should use it and in what situations it comes in handy. If you find this really difficult to describe for a particular item, you should really think about why it's in your public API in the first place if you can't even explain what it's supposed to be used for. A method with much better documentation is the set pen size method. Not only does it have a complete example that motivates the use for that method, it also gives you a picture of exactly what result is produced by running that example. Now, you may not be able to put pictures in your documentation, but you should strive to at least provide examples that show why an item should be used and then show what happens as a result of that item being used. Examples for individual methods are meant to show how a specific method is to be used, but what about complete examples that take advantage of more of your crate? Well, Rust has great tooling that allows you to create these kinds of examples easily. Cargo can run any Rust file placed in the examples directory of your project and you can use these to provide more comprehensive examples of the major use cases of your crate. Turtle has a lot of examples in its examples directory and we're always looking for more people to add examples of the things they've drawn. So far, we've talked about good documentation and examples, but our discussion wouldn't be complete if we didn't also touch on writing a guide. A guide is a tutorial that goes through the key pieces of functionality in your crate. Your guide needs to at minimum walk people through the first time using your crate. Now, once you've done that, you should aim to show them detailed examples of each of the major features and use cases for your crate. The difference between a guide and the examples in your examples directory is that in a guide, you're able to explain your crate and how it works in detail. This is essential for somebody to have a complete understanding of how to use your code, and a guide is actually one of the major pieces that Turtle is still missing. I want the Turtle guide to be an introduction to programming that incrementally teaches people programming in Rust by having them draw pictures. The final thing that I want to mention is that is the Rust API guidelines. These guidelines go through a lot of the different aspects of creating a Rust crate and tell you exactly how your crate should work in each category. There's a checklist that you can use to make sure that your code is idiomatic and follows Rust best practices. I highly recommend these guidelines for making sure you're writing the best Rust code possible. So thank you for listening to my talk. We covered a lot today including how the Turtle crate works and how you can make your crate successful to a wider audience. Please come and try Turtle out. We really need people to try and draw non-trivial things in Turtle so that we can see what breaks. If you'd like to come contribute, we have plenty of things to work on regardless of your skill level. I also want to take a moment and thank all of the wonderful people who have contributed to Turtle already. Many people come in and they've picked up the slack when I haven't been able to work on Turtle very much, and I really appreciate everybody who contributes code and everybody who files issues. The Turtle crate has a Twitter account so if you blog about Turtle or draw something and post it, I'll retweet you if you tag this account. You can also follow me on Twitter as well. I'll be around today and online if you have any questions. That's my time. Thank you very much.


Jerry of the circus, well, I've got to say that man Nemo is the most dangerous lion I've got out of my way folks.  Oh, thank heaven. Oh, so there you are Listen young man. I'd thank you to keep your toothless old lions out of my wagon. What? Toothless. Oh Where is he? Why it's an imposition. That's what it is the idea of letting those old cats around loose might scare someone to death You might but but mr. Bradley, you know, but young man. Just keep those manger more feet and lions out of my way There he is again now here was I reading summer Shakespeare's finest sonnet and that cowardly lion leaped into my wagon So startling me that I reached for my shoe and gave him a well-deserved cuff on the ear I'm herring things. It can't be true. Well, where is he now mr. Bradley crouching back of my trunk for yellow liver to jungle cat Why I was to overcome with anger and being disturbed did I fear I lost control of myself and threw everything at him that I could lay My hands on well, if you'll get out of the doorway, mr. Bradley, we'll get him into his cage now It was preposterous to let him out in the first place. Yes, of course now if you'll just get out of the way Men move that cage close to the openings and take no chance this time. You understand. Yes, sir Of all the crazy things I ever heard of one of one of you hand me that long pole I'll poke him out of from behind that truck I must say I see no reason for not going in and taking him out by his ear But mr. Bradley, that's Nemo. There's no difference to me what his name is. He disturbed my rest and I'm very annoyed But Nemo is Jason's most dangerous cat. Stop it nonsense, but he is really mr. Bradley Dangerous? Middlesticks?  Well, that's right boys. Stand by Nemo get out of there. Nemo, scat, beat it Oh good there he goes watch out there. Oh right into the wagon. Oh, that's well At last I'm glad that's over with push that wagon on back where it belongs over there in a minute I want to talk to Johnny. He was Jason. I bet you're sure glad to have that lion all safe and sound. Oh, you bet I am. Oh Johnny, I'm terribly sorry that line upset you Well, just so it doesn't happen again Well, you don't think I'd let a thing like that happen if I could help it. Do you well I always liked you Jason and I must admit it seemed kind of careless careless You don't seem to realize that Nemo is my most vicious cat and Jerry's been trying to tell me some such foolishness Oh, it's no foolishness that cat is the most treacherous one. I've got well It would seem to me that that would be all the better reason not to let him around loose Of course, I must admit them all to somewhat out of my line Johnny You certainly take the cake Jason. Why didn't Nemo hurt mr. Bradley? Well because he was too scared, but you just said Gee Jason that that doesn't make sense. I'm just getting you all balled up. I guess I'm not very good at explaining now Look, it's like this now. You weren't scared. Were you Johnny? No, I was too mad to think of being scared Well, not if Johnny had been scared Neal would have sensed it the moment he had got inside that door Well, you know that animals can always sense when you're scared, don't you? Yeah, I know that well He was plenty scared what with all the yelling we were doing and trying to catch him and then rags barking like mad Yeah, I guess he was too scared to think when he lets a little pup chase him across a lot what Do you mean to say that young animal of yours chased that big lion right into your wagon didn't you right? You're the fellow who's to blame for putting me to all this trouble He certainly is in all the years. I've trained animals. That's the craziest sight I've ever seen Go on with what you're gonna say. Well if Johnny had been scared Nemo would have leaped on to him and hurt him Boy, oh boy, but instead Johnny jumped at him and threw things at him and well you see what happened Carly that's your something and a pretty lucky something for me You don't know how lucky listen Johnny when you came out of there and began balling us out about that toothless old lion I could hardly talk I expected that cat to jump out at you any minute Yeah, he stood there in the open doorway just talking a long time. Didn't he I'll say he did I admit I was scared stiff for you. Well, it's all over with now and I apologize if I was a bit tested Jason Yes, the cage is back where it belongs. Oh, thanks bike. I'll be over there in a minute And who is spiked one of the new stakers? Yeah, I got a missed job. You got him a job Sure that day Zeke jumped the show Murray need another man. So I found well good for you I guess I'd better get back to Nemo and see if he's quieted down yet I'll see y'all later better be sure those cages are checked over so nothing like that will happen again Oh, you can bet I'll be sure. Well, so long. See you later Jason. Oh spy Something wrong. No, I just wondered how Nemo seemed after all excitement. Were you heading someplace special? No I just thought I'd drop by and see if Murray needs any help. Yes, there'd be plenty of cleaning up to do Yeah, Nemo sure cause an awful rumpus. Oh say you you don't know mr. Bradley I know you mr. Bradley, but I guess you don't know me. I'm glad to meet your spike I'm indebted to you for finishing up what I started with Nemo say you didn't tell me how Nemo is now It's all over. He's kind of tuckered out. I should say he's crouched way back in the corner of his cage He's just sort of staring wide. I'd like guess you and rags scared the stuffing out of him mr. Bradley Well, I better get going You should have heard Clara signing off over there in the wardrobe top. Well spike glad to met you think you'll stay with us Jerry here was telling me you're new on the job. Yeah, I am Sure, hope I stay won't be my fault if I don't mr. Randall's a mighty fine man to work for spike And if you treat him right he'll always treat you right. Well, I'm satisfied say you're beginning to look better already spike Oh, how do you mean Jerry? Oh, I don't know you look kind of pale when you first came well spike working out of doors soon Puts color into your skin.  You'd get lots more sun that way. Oh, I don't know. I guess I'm just used to working a cap But you wear it so far down over your left ear and and it covers your head all up. Yeah Well, I couldn't work without it. I'm afraid Jerry. So you're a creature of habit to my man. Yeah, I guess I am Well, sorry, I gotta get to work. I'll be seeing you. Yeah, bye. Bye until we meet again spike. He's nice I kind of like him. Yes Yes, of course. What's matter something wrong? What no, no, no, I was just thinking It was a funny thing. There's something vaguely familiar about that young man's confidence But somehow it keeps escaping me Yeah, people are always reminding me of someone I know too. Yeah, but that young man Funny, I can't just place him. Well, you couldn't have seen him before because he just joined the show Well, it'll come to me. I never forget a face. I Tell you my boy is a younger man. I had a phenomenal memory. Yeah, you must have had now Why do you say that Jerry? Well, look at all the poetry, you know by heart. Oh, that's nothing son Why in my prime I used to know most of Shakespeare's plays by heart every line really indeed I did not to mention many many other plays Sometimes the school I I can't even remember my lesson for the next day We used to do a different play every night and not just two hour plays like in our theaters nowadays Why often our plays would last for four hours You mean to say you'd know enough plays all by heart so you could do a different one every night indeed Yes, it was necessary to know from 30 to a hundred or more parts if a man wanted to get a job in the theater in my day Collie and nowadays they hire an actor and teach him the part after he's hired see mr. Bradley Yeah, I just thought of something. Mm-hmm. Well, what is it Jerry? I got a letter from my lawyer today You did you mean that young man back in Jackson City who gave this spaghetti party? Yeah, my case is coming up before the superior court he hopes tomorrow at least that seems to be what he is trying to Tell me yes. Well, well, it was kind of mixed up and knowing you're pretty smart about things like that I wondered if you'd like to read it for me and explain exactly what it means. Oh, of course Jerry I'd be glad to I left the letter in the wagon. It's right over here. Want to walk over might be glad to good Come on rags. We're going places Rags say rags. No, he was here just a minute ago. He can get out of sight quicker than anything. I ever saw Rags. Oh There he are what you doing a mr. Bradley's wagon of all the curious mutts. Come on. We're heading for our wagon See he's happy just as long as we're going someplace So you got a letter from that nice young lawyer. Hmm. Do you hear from him often Jerry? Sure, he writes me every week just to keep me posted on the case Colley, I'm anxious about that safety deposit box. I believe you said once it was in your father's name Yeah, seems like it's sure taking a long time for the course to make up their minds to let me open it Well, that's the trouble with the law my boy Always a lot of red tape seems like a lot of foolishness to me It just makes common sense that if your dad leaves something behind he'd want his only son to have it instead of a lot of Strange yes, I know but of course the law is meant to protect its citizens and that's why they want to be sure They don't make mistakes.  I'll run in and get the letters No one here. They're probably hanging around the mess stand waiting for the flag to go up. Nice doggy. Nice doggy. Oh, come on, Rags That's right. Yeah, you like to have your ears Here's the letter shall we sit here on steps fine Now, let me see what that boy has to say. I mean that lawyer Can't you see mr. Bradley's busy Well, Jerry, this is simple enough young Grayson says he hopes your case will come up. Let me see yes That would be tomorrow. Yeah, that's what I thought it said But what was that stuff about if they didn't have time to do it tomorrow? They'd have to wait till the next something or other. Let me see Well, yes, this is it if they don't get to your case tomorrow It will have to be laid over until the next session. Yeah, but what does that mean that the next day? No, I'm sorry I'm sorry Jerry, but that means that all the members of the court are adjourned until they're called together again But Jiminy workers. Well, when will that be? Well, I guess that depends on the custom of that state Oh, gee, I hope they get it through it tomorrow. I feel terrible to have to wait much longer to see what's in that box


So by this time, they just made it down the stairs. So the other boy was the one that just got shot. He already pernored. You know what I'm saying? He heard gun, he never, he tell them to go, he told Charles he ran in the restroom, but the dudes is already ran out the door. So that gave them enough time to get out the way.  And by this time, I see Charles and run, I ain't never seen no gun to Charles in the head. Okay. You know what I'm saying? But as I seen him run, he saying, where that motherfucker at? So he run, I just like, don't shoot, don't shoot with everybody. Like, don't just, I'm like, don't shoot. You know what I'm saying? So I ain't never seen a gun to Charles in the head, but it's one. Yeah, we on boss talk one on one, one on one. Yeah, we gonna talk. Man, you playing on the world right now. You playing with my livelihood now. You see what I'm saying?  Yeah. I just got attacked by Kevin Spencer asleep in the barber chair. Hit me outside the head with a gun. Trying to hit him with a spray bottle. I ain't the smallest detective in the world, man. Like I told the tip because I lied to the tech and told me it wasn't no tape. Yeah. You know what I'm saying? Really why I told him it wasn't no tape because I felt like, hey, that was right here. Yeah. You don't like that. Let that die right here, man. For work already. They think we crazy out here. But what may, okay, after a while then, what made you release the tape now? What made you release the tape now? Because this man with the jail, he come out and said, Trace Slack. Now before he went to jail, he said, yeah, Trace Slack, release the tape, Trace Slack, release the tape, Trace Slack. So I'm still like, so by this time the detective won't call me. So when the detective won't call me, he say, he said, you got a wifi. I said, now I ain't got no wifi.  You know what I'm saying? I didn't know I had no tape. So as a, he keep talking, I say, there ain't no tape, it's my phone. You know what I'm saying? He say, you say it on your phone. I said, yeah, it's on my phone. He said, well, can I have, I said, no, you can't have my phone. I don't want you to have, that's mine. You know what I'm saying? So at this time now, I'm thinking about Tarzan, I don't know if Tarzan's smart. So I don't know if he playing no games, right? If he won't release the tape, so he really can get them in trouble. But couldn't they get a warrant to get your phone anyway, that you had to give it up? I could have just threw my phone away. Yeah, you can. Right? But at the same time, I still got in my ear. And this is my ear and my head saying, this man hitting with a gun. Yeah, I just got attacked by Kevin Spencer sleeping in the barber chair, hitting him outside the head with a gun. That's where I come into play. Cause it incriminates you and his brother. It incriminates all of us and it's putting a look on my shop. So I get something and I say, well he hit him, but it wasn't no gun. Because when I get back in, see don't nobody like y'all camera right here, right? So everybody is over this way. You saw I said, don't nobody even know this camera on. Don't nobody know the camera isn't here but the camera. So don't nobody know what's on the camera, but the camera until I walk back in. It seemed like it covered a lot of stuff. So if there was, I've heard all type of things. I hear there was, you hear him in the video and say, get the pistol, get the gun. You hear that at the end? To Chas? Yes. Um, like when he ran out of here and he heard a holla at the end of the video, people are wondering what happened after this, after the camera goes, after we stopped seeing what you revealed to us. Wait, what? No, no, no, I'm gonna tell you.  I'm gonna tell you. Hey, no, come on.   Right. So as I say, I can get them out the door, right? So by this time, I can kinda close the door but Chas and wife, he's trying to get through those. She blocking Chas and so he don't get out. He ain't really trying to get out. You know what I'm saying? He really did, but he got to put on the show cause this is his wife. Wait, what? No, no, no, I'm gonna tell you.  I'm gonna tell you. Hey, no, come on.   You know what I'm saying? So as he got out the door, his car is parked right at the door.  So by this time, they even made it down the stairs. So the other boy was the one that just got shot. He already pernored. You know what I'm saying? He heard gun, he never, he tell them to go. He told Chas he ran in the restroom but the dudes is already ran out the door. So that gave them enough time to get out the way. So I'm kinda just sitting in my shop now, like, man.  And by this time I see Chas and run, I ain't never seen no gun to Chas and head. Okay. You know what I'm saying? But as I seen him run, he's saying, where that motherfucker at? So he run, I just like, don't shoot, don't shoot with everybody. Like, don't, I'm like, don't shoot. You know what I'm saying?  But it's one. Because I told you, the video, it's another video. Wow. So it's the other video. It's a video on the back side of the building. That covers everything and it may have picked up. That's what picked up. And that's how Chas and God, this is a soft case. Oh. So basically they got the both footages. They got, the laws got every, that's why I come on there and said, nigga, I don't cut the laws already. Got it. And they ain't got it trapped in the screw. They got it how it go. And that's why they picked him up. And that's why they, see he called the laws trying to get Kevin Spencer called up with the aggravated side with the deadly weapon. Yeah. So Kevin says, hey, I need that tape. I'm like, bro, you ain't getting this tape. I'm in bag up too. This one key points. So after this fight happened right the next day, I show Chas and white brother the tape. I, I, I, I text him the tape and shows him say, ain't nobody hit your brother with a gun. I got it in my phone right now, November the fourth. That's what, yeah. You text him the video. So he had the video. I text him the video. I tips him a 40 four seconds snippets of the video of the actual hit because he know he was helping. He was coaching me how to put the down. Yeah, y'all were both there. We were both there. So he coaching me how to do it. Cause I don't know. I ain't never died. Nobody hurt. Well, that was the first day you were there. That was my first day ever. So I really was in this. Do you think that you might have put a little too much on there? No, it was a lot. It was a lot, but then her was pretty in the morning. It was nice in the morning. That's why he did that video on the back of the ambulance. He looked at good. If you look in the comments when he was back there, people say, boy, your head's up straight in the mud. That was telling me. So you telling me that you sent literally this video to his brother? And what did he say? November the fourth at nine, 13. If you go back and look at this message, it's right there. And if you try to say that it ain't, it's another text up on it. Cause we keep on responding every day, every month. That's probably the first person I talked to every day was Kevin White. Kevin. You know what I'm saying? Say when you send that video to him and he saw it. I don't know. I showed it to him. That's how I sent it to him. He didn't say, oh yeah, you right? No, this is how I showed it to him. I showed it to him in my shop. And I said, I'm going to send this to you. And I sent it to him. You know how you show something? I'm going to send it to you. So when you showed it to him in the shop, what did he say? No, it wasn't no gun. That's the exact words. No, it wasn't no gun. So I'm trying to figure out how do you say I set you up for one? Charles made a tape when it was an impromptu stop. I didn't know what that word was until he said it. I had to go look it up. It's a stop made where nobody knows I was coming. Exactly. So how can you say you made an impromptu stop? What that mean? Yeah, we on boss talk one on one, one on one. Yeah, we going to.


Pertama, terima kasih banyak untuk kawasan kamera saya. Terima kasih. Jadi, saya perlu berikan diri kepada saya. Terima kasih kerana menjadikannya. Terima kasih kerana menjadikannya. Okey. Kamu berasa sangat distan. Kamu berdua mahu datang dan melihat nafas. Helo? Hello? Kamu berasa sangat distan. Kamu mahu duduk di belakang. Kami mempunyai lemah di antara kita. Okey. Sebelum kita mulakan. Terima kasih kerana menjadikannya hari ini. Jadi, ini apa yang kita nama Rumi Christmas Party. Saya cuba menjadikannya. Sebenarnya, ini adalah sebuah tahun yang berlaku. Jadi, terima kasih kerana menjadikannya untuk menjadikannya. Terima kasih. Kita takkan tahu apa Cik Mendang apa?  Adakah anda menikmati makanan di kanak? Oh, These or No? Adakah anda menikmati makanan di kanak? ok, jadi makanan diisi latihan kerana referral candy adakah anda mahu bincang sobre referral candy? terdapat mengenai software Stylabet dan Singapore kita membangun app software yang membuat penggunaan perniagaan membuat penggunaan perniagaan dan mempunyai Dropbox atau Uber, bagaimana anda beritahu kawan dan anda mempunyai Freeride atau FreeSpace. Kami melakukan perkara yang sama untuk SME Online di seluruh dunia. Mereka adalah pelanggan di U.S. Over 1,000 pelanggan menggunakan kita. Orang yang lebih besar adalah Uniqlo, Tommy Hilfiger, Webox di seluruh kampanye dengan kita, Dr. Martin, dan banyak syarikat di seluruh dunia. Orang yang kita berpunyai untuk itu. Mereka juga mencari penyelamat dan penyelamat di seluruh dunia. Jadi, menggunakan penyelamat juga. 20% menggunakan penyelamat. Dan tentu-tentu, PEPPUL juga mencari penyelamat.com. Saya tidak fikir sesiapa-siapa pun ada di sini hari ini. Tapi jika anda tahu tentang penyelamat.com, mereka akan membantu anda mencari penyelamat. Jadi jika anda fikir anda ada peluang yang baik, mereka akan menghargai untuk memakai anda untuk membuat perniagaan. Mereka melakukan ini di U.S. Di Facebook, Google, etc. Mereka akan mencari perniagaan anda. Mereka akan mencari anda untuk mereka. Dan anda akan membuat penyelamat.com. Dan anda dapat melihat yang mana yang lebih baik untuk anda. Dan ia mencari penyelamat. Jadi, sejauh-jauh ini, mencari penyelamat di U.S. Dan mereka sudah dapat menghargai orang-orang di syarikat yang baik. Mereka sangat berharga. Jadi, mereka akan datang ke Singapura dengan cepat. Sebenarnya, mereka sudah mulakan operasi mereka. Jadi, hari ini, mereka juga mempunyai perniagaan dan perniagaan di sini. Pada masa yang sama, saya akan membuat perniagaan yang baik. Saya akan membuat perniagaan yang baik untuk membayar perniagaan. Jadi, saya akan menikmati perniagaan dan perniagaan. Terima kasih banyak untuk datang. Jadi hari ini, kami tidak hanya membuat perniagaan dan perniagaan di sini. Saya ingin melakukan sesuatu yang berbeza. Terutamanya, kami mempunyai banyak perniagaan di sini. Mereka tidak mempunyai peluang untuk bercakap. Kadang-kadang mereka terlalu penat untuk bercakap. Mereka mungkin tidak mempunyai perniagaan untuk bercakap. Jadi, saya membuat perniagaan untuk membayar perniagaan di sini hari ini. Kami membuat perniagaan dan perniagaan untuk bercakap. Untuk bercakap dengan perniagaan dengan perniagaan. Jadi, ia adalah sesuatu yang berbeza. Kami membuat perniagaan untuk pertama kali. Semoga pada akhirnya. Semoga kami tidak dapat melakukan ini untuk membuat perniagaan di RubyConf. Kerana, ia adalah perniagaan saya untuk membawa kamu ke sebuah perniagaan di Indonesia juga. Mereka seperti pengalaman, Jadi, hari ini, ia seperti beta-MEP. Kita akan cuba dan bercakap. Bagaimana cara ini? Mereka berjawab kepada pertanyaan yang susah. Baiklah. Jadi, tanpa lagi, saya akan memulakan perniagaan. Saya akan membuat perniagaan dan tanya beberapa pertanyaan. Lepas itu, saya akan memulakan perniagaan supaya anda dapat tanya pertanyaan yang susah. Jadi, kami akan memperkenalkan perniagaan saya. Pertama, kami mempunyai Ryan daripada GrabTaxi. Mereka adalah dari Flow Zero, dari Rivero Candy, Microchain, dari Neo. Untuk sederhana, saya ingin bercakap dengan mereka lebih sedikit tentang apa yang mereka lakukannya. Bagaimana mereka menggunakan Ruby at work, etc. Jadi, apa yang kita mula dengan Ryan? Hai, nama saya Ryan. Saya selalu memperkenalkan perniagaan Ruby at work seperti GrabTaxi. Tapi sekarang, saya melakukan lebih banyak pengalaman perniagaan engineering. GrabTaxi menggunakan Ruby at work untuk banyak perkara. Jika anda menggunakan pengalaman perniagaan, ia sebenarnya bercakap dengan Ruby at work semula di belakang. Dan itu adalah bagaimana kita menggunakan Ruby at work. Baiklah. Sam. Baiklah. Hari ini, saya menggunakan Flow Hero. Flow Hero adalah perniagaan menggunakan juga perniagaan produk yang sebenarnya adalah jason base perniagaan workflow. Dan ia mempunyai Ruby at work. Baiklah. Saya memperkenalkan perniagaan yang tinggi dan saya menggunakan pengalaman perniagaan untuk memperkenalkan itu juga. Sebelumnya, saya juga menggunakan untuk membuat perkara yang sama. Perniagaan pengalaman besar untuk menggunakan pengalaman perniagaan. Tapi ia bagus kerana ia sangat mudah untuk membuat perniagaan dan membuat semuanya. Kemudian ia akan membuat perniagaan dan anda akan membuat perniagaan. Baiklah. Dinesh. Ya, seperti yang saya beritahu tadi, kami membuat perniagaan SMB berdasarkan dari Singapura. Kami mempunyai sekitar 30 orang di perniagaan. Saya membuat perniagaan di Singapura, dan juga di Philippines. Saya membuat perniagaan untuk membuat perniagaan dan saya membuat perniagaan di Dinesh. Bukan. Saya beritahu tentang perniagaan. Maaf. Saya membuat perniagaan. Ya, saya membuat perniagaan. Saya membuat perniagaan. Baiklah. Bersiap. Saya membuat perniagaan. Baiklah. Terima kasih. Hai, saya Michael. Saya penyanyi. Saya membuat perniagaan di Ruby selama dua tahun. Sebelum itu, saya membuat perniagaan. Sebenarnya, saya membuat perniagaan di Singapura. Selama dua tahun, saya membuat perniagaan secara profesional. Saya membuat perniagaan. Sangat bagus. Ia sangat berbeza dari perniagaan. Saya boleh membuat banyak perkara. Ia lebih efisien dalam membuat perkara. Di perkara yang lebih besar, ia lebih mudah untuk dibuat. Mereka boleh membuat perniagaan. Mereka boleh membuat perniagaan. Bagaimana yang boleh saya membuat perniagaan? Saya membuat perniagaan. Saya membuat perniagaan. Saya membuat perniagaan. Baiklah. Pada pertanyaan, saya membuat perniagaan lebih banyak kepada perniagaan. Saya membuat perniagaan dan perniagaan. Jadi, kenapa kamu membuat perniagaan dalam perniagaan pertama? Membuat perniagaan kamu. Kenapa tidak P.S.P. atau J.S.P. Sebenarnya, saya membuat perniagaan. Saya atau perniagaan saya membuat perniagaan. Jadi, kami tahu perniagaan lebih baik daripada Python. Dan itu merupakan perniagaan yang lain. Pada masa itu, Rails datang dan keluar sekejap. Ia adalah sebuah ekosistem yang besar di Ruby dan banyak jams yang membuat perniagaan dengan cepat. Jadi, berapa lama itu? 5 tahun? Saya rasa sekitar 4-5 tahun. Sebenarnya, kami membuat perniagaan untuk membuat perniagaan di Ruby dan menggunakan perniagaan. Okey. Bagaimana dengan Sam? Kenapa kamu membuat perniagaan? Sebenarnya, saya membuat perniagaan. Tetapi, Ruby Erase membuat perniagaan untuk membuat perniagaan. Jadi, banyak perkara itu adalah untuk membuat perniagaan. Jika perniagaan membuat perniagaan, kamu harus menggunakan. Dan kamu perlu fikir terlalu banyak. Ruby Jam adalah hebat. Dan tentu saja, kerana semua jams yang sebenar adalah membuat perniagaan dengan perniagaan dan membuat perniagaan dan bermain. Dan sangat banyak orang membuat perniagaan. Dan ia membantu membuat perniagaan yang membuat perniagaan untuk membuat perniagaan. Dan kamu membuat perniagaan sendiri. Ya. Okey. Sebenarnya, mungkin bahawa saya akan menjawabnya. Jadi, saya dengar saya adalah perniagaan juga. Jadi, perniagaan kadang-kadang akan berkata, Oh, saya ingin membuat perniagaan di Ruby. Kerana perniagaan beritahu saya ia akan membuat perniagaan yang lebih tinggi. Jika kamu tahu, saya akan beritahu perniagaan saya. Adakah ini benar? Adakah kamu dengar perniagaan yang lebih tinggi untuk membuat perniagaan yang lebih baik dan perniagaan yang lain. Adakah ini benar? Pilihan saya dan itu saya tidak fikir ia bergantung terlalu banyak kerana perniagaan akhirnya hanya melihat perniagaan kamu. Mereka tidak melihat apa yang kamu gunakan. Jadi, jika kamu beritahu mereka bahawa kamu akan membuat perniagaan yang lebih tinggi. Okey. Kamu mungkin lebih mudah untuk kamu membuat perniagaan yang lebih tinggi. Tetapi, daripada itu, ia tidak sangat bergantung. Okey. Biasanya perniagaan tidak sangat bergantung. Perniagaan yang lebih tinggi mungkin membuat perniagaan dan membuat perniagaan. Tetapi, kamu berfikir bahawa pilihannya lebih tinggi ini lebih berkelihan tentang perniagaan.っぺennya, jika kamu mendapat perniagaan, kamu perlu memadamperkannya ke kecil mereka, dan mungkin ada considerasi di sana. Tetapi, keunggangan ini tidak meio betul-betul berkelihan. Jadi, kamu beritahu tentang perniagaan yang lebih tinggi. Apakah ini susah? Adakah kamu akan memikirkan sedikit bahasa yang lebih tinggi kerana lebih mudah dan lebih susah dan acabat keberangan? Biar semua itu tidak mudah dan Ia ada alasan yang kita cari. Jadi, itu adalah sesuatu yang kita perlu berlainan. Tapi saya akan kata, Ruby di general beri anda lebih baik untuk membuat orang yang menolong saya menggunakan Haskell atau sesuatu yang lebih baik. Dan itu menyebabkan startup yang digunakan. Dan itu berlainan dan berlainan. Jadi, Haskell mungkin lebih susah untuk membeli keadaan, tapi mungkin sesiapa pun yang mencari ia akan terpaksa dan mengembar dengan cukup untuk buat apa yang kamu buat. Jadi, saya rasa membeli keadaan adalah sesuatu yang anda kira-kira. Dan Rup, ia berlainan dengan Ruby. Jadi, Ruby tidak lagi adalah perkara yang berlainan. Jadi, ia lebih berlainan dengan orang yang mainan. Jadi, itu menurut saya, anda hanya perlu memastikan. Mereka tidak mencari perkara yang sama. Kerana GrabTaxi menggunakan banyak bahan yang berlainan. iOS, Android, Go. Jadi, Ruby. Jadi, GrabTaxi menggunakan bahan yang berlainan adalah ia sebenarnya sangat susah untuk membeli keadaan. Terutamanya, sebab kita pertama bermula di Malaysia dan Ruby sebenarnya bukan bahan-bahan yang berlainan. Mereka seperti seorang pelajar yang tahu C sharp, ASP.net dan sebagainya. Jadi, ia sebenarnya sangat susah untuk membeli keadaan. Kerana ia bukan perkara yang lebih susah, tetapi itu perkara yang paling berlainan. Jadi, kita seperti di antara. Jadi, itu bermakna anda mempunyai keadaan lebih baik untuk iOS, Android, Go. Saya akan berkata, ya. Saya akan berkata, ya. Menurut saya, ada apa-apa kata-kata anda? Untuk saya, apabila saya mempunyai perkara yang berlainan, saya dapat memasakannya di JQuery. Sebenarnya, saya dapat memasakannya di CoffeeScrip. Mungkin saya akan mempunyai perkara yang berlainan di JQuery. Dan ia tidak akan perlu memasakannya di JQuery. Jika saya cuba lebih banyak perkara yang berlainan, seperti java.net, ia akan mempunyai banyak perkara yang berlainan. Apabila anda meminta mereka sedikit lebih banyak perkara yang berlainan, sebagainya, saya tidak mengenai perkara yang berlainan. Saya akan menggurungkan perkara yang saya membuat dengan resimu saya. Memang, untuk memasakannya, mungkin ada suatu perkara yang berlainan. Tetapi dengan perkara yang berlainan, perkara yang berlainan adalah kecil. Sebab perkara yang berlainan sudah berlainan tanpa banyak perkara yang telah diri. Mereka dapat membuat perkara yang berlainan. Mereka semua akan tidak menjadi berlainan. Dan ia dapat membuat perkara yang berlainan. Jadi apabila saya memasakannya, ...saya tak perlu meletakkan segala-galanya. Atau saya perlu meletakkan... Jadi itu bermaksud jika anda dapat... ...pengalaman daripada orang yang tahu Ruby atau Rails... ...biasanya mereka lebih baik. Macam mana saya interpretannya? Itu berbeza antara mengenai segala-galanya... ...dan menjadi sangat baik dalam bahasa seluruh. Sebenarnya, pada masa yang awal anda ada C dan C++. Jadi anda dapat mempunyai pelajaran roket yang sangat baik. Tetapi, ia tidak dapat mempunyai segala-galanya. Ia tidak mempunyai segala-galanya. Rails menyebabkan segala-galanya yang sangat baik... ...untuk membuatkan banyak masalah dan segala-galanya. Jadi anda tidak perlu mempunyai... ...seorang pembangunan roket-scientist. Anda dapat mempunyai seorang lelaki yang lebih muda... ...dan anda dapat menghubungi dan memasukkan segala-galanya. Tetapi, ia mempunyai segala-galanya. Jadi ia tidak mempunyai segala-galanya. Apa yang anda fikir? Jaku. Cerakkan? Saya tidak tahu. Saya rasa orang lain itu adalah satu residential. Jadi tak Meineh dari yang kena berbunuh hanya kerja sikap-sikap di Singapore mmah... compute carrier. Tetapi di kawasan kita, saya akan kata bahawa ia tentang pengalaman, dan sesiapa-siapa yang berada disini akan menyebabkan. Baguslah, terima kasih. Jadi kita tahu bahawa Grapp Taxi dan SuperGrow berkongsi, anda fikir bahawa Ruby berkongsi dengan itu? Atau sebenarnya ia menghubungi anda daripada bergerak lebih cepat? Sebenarnya saya fikir Ruby berkongsi dengan banyak untuk membantu Grapp Taxi berkongsi. Satu-satunya orang, dia memutuskan lebih kecewa dan membuat kerja semula, bila saya menggunakan kemukahan atau menggunakan kesan dash dan sebagainya, dia berkata, anda akan melakukan ini dan itu saja yang anda akan lakukan. Anda tidak akan pergi dari keadaan ini, yang mengajar pengalaman untuk memutuskan masalah dan tidak terlalu jauh. Anda berfikir tentang semua kes, semua kecewa yang anda sepatutnya menggunakan. Baiklah, jadi pada masa itu, tidak ada apa-apa yang menggunakan, tapi kita perlu menggunakan kemukahan. Saya akan bercakap sedikit tentang bergantung dengan PHP. Anda ingin mengelibangkan kemukahan itu. Jadi sekarang, bagaimanapun, jika anda ingin memulai projek baru, anda akan menggunakan PHP atau menggunakan PHP? Sekarang saya akan menggunakan kemukahan yang menggunakan. Saya akan cuba menggunakan. Sebenarnya, saya akan menggunakan, sebab sekarang saya akan menggunakan kemukahan yang lebih jauh untuk saya, seperti pada perjalanan hari-hari saya, ialah Ruby and Ruby on Rails. Jadi, saya rasa jika saya perlu bekerja dengan projek baru, saya akan menggunakan Rails, yang saya telah melakukan dalam dua projek yang lebih kecil, yang saya telah melakukan sebelumnya. Sebenarnya, saya akan menggunakan kemukahan yang berjauh dengan baik, yang saya akan memasak dengan jauh dengan cepat. Saya rasa Ruby on Rails adalah sangat cepat untuk mempunyai projek baru. Saya akan memainkan kemukahan basic dan MPR dengan cepat. Bagi saya, pula pula beritahu P.H.P. Saya akan mempunyai sistem bergantung yang saya telah melakukannya. P.H.P. adalah pandangan. So, the reason it's flexible is that all the tools are there and it's very easy to protect with them quickly. And for me to go back to learn something like Laravel or some of the other PHP frameworks which have progressed very much since the last two years back. So for me it was a practical thing. If I need to take some time to relearn all the Laravel's framework or kick PHP framework conventions, it's going to be very difficult. Or rather you're going to take time and I think there's something I don't want to do as say if it's going to be a side project or something that will go on weekends or big nights. I really want to be productive and I think having something like moving on rails, I mean I'm not saying that you can't get the same productivity on PHP. If somebody who has been using Laravel or kick PHP for a while, which I had in the past, I could actually put together very quickly in the weekend. But then again, I was young. I was much younger. But nowadays I just want to focus on, my time is precious. I just want to focus on getting productive and getting a concept out. Just to get something out there and get some traction or get some feedback from people who might be willing to use. For example, when I worked on the ticketing app, I wrote it out very quickly. When I found the bug and when it went live, there was a bug and I was able to fix it very quickly. Just following the logs, telling the logs on the Heroku. I was able to find, oh right, because there's a problem with this regular object or this big pastin and stuff like that. I was able to debug it very quickly, which is something you can't really get out from PHP. Until recently, only until recently that PHP introduced like a debugger. They can just plug into your code very easily. They had x debug before but it wasn't as good. It's nothing to the level of tooling that you have in Ruby on Rails or Ruby overall. So I think, yeah, so Ruby on Rails is pretty much my choice about doing something right now. It's like sub-inspect, for example. Okay, thank you. So before I continue to ask more questions, I want to open up the floor now. So y'all have a chance to ask them any questions about Ruby or non-Ruby, but a company as well. But grab taxi. Oh, I'm sure I've done that, you know, for Ruby, right? Because it happens to exist in these little gems. So once you put it in the top of it, it's going to have to find small bugs that exist in the gem. So what do you do about that? It's a general existence. It's still a big trend. It still feels so large. Use the right gems. Yes, yes.  We can. Y'all look at the gem? Occasionally we do. Because sometimes the documentation of some gems are just not very well done. So you just need to look at the code and see how it's done. For example, I was using Active Merchant. I was using Active Merchant for e-commerce. And the documentation for Stripe was very sparse. So I do look at the code. Alright, this is how this is done. This word is perhaps being fasted and stuff like that. So I guess you can... The good thing about being open source is to open it up. Look at the code. If there's a bug, you know there's a bug, which I found a bug, actually. On Active Merchant, I actually found a cool request. And it was eventually merged into the main branch. So being open source has its benefits. We see a bug. We see it at the code. We can make a fix. And we can submit the fix, which is we should then, you know, everyone will benefit from that fix. Ya, I think looking inside the library is pretty common. Especially if you're using it and you see kind of behavior that's not expected. For maybe the smaller libraries, like the more well known ones are usually pretty well controlled. But maybe the smaller ones, if they're using something it's quite normal to look in there. Again, like Michael mentioned, because it's open source, it makes it much easier. And again, the Ruby community is pretty open to things like code request and fixing it and answering questions if you have. So that helps. Even if those doesn't work out for you, you can actually debug the underlying gem that you're using and it's actually very easy to do it. When did it solve the problem? Sorry? In the bug that you found in the FX machines. It was... Because they didn't run the PHE conference. It wasn't actually a bug. It was more like a flag which was in stride. We can actually pass a flag which would trigger an email receive to be sent to the payer. And I tried to pass a flag into the options object, the hash. But apparently, that option was dropped as it was not accepted. It's not passed on to the request which I found would be strange. Because I would think that sending an email receive would be a usual use case for subpoint e-commerce thing. So apparently, they didn't think about it. Or, it could be a new flag. For whatever reason, it was never there. Because the gem that I won't use in merchant is actually pretty big. So there are many different components and it's like one library that supports PayPal, Braintree, Stripe, so many others. So, it's a fairly huge library. So I looked into gems all the time that's one of my evaluation criteria for using the open source libraries. Check that. It doesn't have a lot of issues. Check that. It doesn't have a lot of open pool requests. Check that. The commit is pretty recent. Check that. There are specs for the open source library.  Sometimes, the gem could just contain 50 lines that it might be better for you to just code it yourself and put it in your code. Rather than just a gem. I recommend checking out Ruby 2 Box. Ruby 2 Box is a website which shows you the different gems that can be sorted by categories. So, a particular category of gems like login or logging or whatever stuff, you can even show you the gems that are in the same category and tell you how recent was their last commit, how many bugs was filed, how many pool requests was there, what issues. It's a very good tool for evaluating gems. And if the gem has a GitHub repository, you can check out whether they have Travis, CI, so that at least they are running their chats and it's still green and not red or ember or something else. And also, we can say when it was last commit. Although last commit sometimes can be seen, but because I use some of the Ruby gems that are actually wrappers for C++ libraries. And they are maybe like 5 different developers roundable using it only. So it's probably like last two years and then nobody touches it. It's popular stuff. It should be well maintained and everything. So, looking at the code like what Michael say is for me, because I know the C++ library forever, I know all the prams on command line, I would ask myself should this option be in the hash that I pass in through the wrapper gem. So, and I look into the code to see whether do they just pass whatever I pass into the gem to the library or do they to exclude or accept or whatever else. So, just full request and put it in here. Jay? What is your benchmark for too many full requests? Depends on the gem. Ya. I mean, it depends on whether they actually answer the full request or not as well. You know, whether it's just stale as in nobody cares and then they are always trying to ping, you know, where's the maintainer, where's the maintainer or rather it's like people try to make full request and the author is trying to answer them and it's just not moving because of differing views and opinions. So, like rails, right? Obviously, people want to make a lot full request but there's always differing views and how the core team wants to work versus number of people who wants to make, you know, commits the code. So, there's a balance. I don't think there's a hard number, say. And I suggest looking at the branches because they may have accepted full request as an embroidered but not mastered. So, they could have like branched out the code and then try out the full request and say, Ya, it's not quite what we want, right? That's why they didn't allow that on master. Question? Yes. This is my question but we mentioned really interesting to know why I'm allowed to take a survey there and be there in architecturally or an idea that you'll probably be ready to work and, you know, how you look back at it and sort of actually today was an action. Ya. Don't be late. I'll pass it on to someone. Don't be late. I think I'll take a bucket. Sessh. So, I'm no longer part of our engineering team but they have to live with some of my um, wrong choices. I think one of the top lines right now would be we take data mapper. Oh. Ya, so, at some point the reason we picked it initially was you know, at that point they were kind of about the same stage and the same stage data mapper was more as skill like no-stakes so we were looking at some kind of new as skill databases but I mean, I guess the way to think about these things is you if you look back on it and like why do you choose this part versus that part you'll be beating yourself up a lot of many, many things not just language or library choice, right? You have to think about it in terms of where you were at that point where you have 10 parts in front of you and you know, all the right choices you make is what matters at the end of the day and just make sure you you know, make decisions in a way that you can fail gracefully so don't try to not make mistakes try to make decisions where even if the decision turned out to be suboptimal your startup isn't going to like die, right? I'm not going to not be able to find developers to improve it so it helps to think about it that way, I guess Is it available for app or available to people? So right now we are 3.2 3.2 okay but it's some strong thing So for me it's not really failure it's just not efficient code let me share with you I wrote a massive important like many years back and the reason why I started Ruby because I wanted to access on-pack rails I wrote it as a red task and then it has to access the models because I want to insert those lines every row into the model and because the source data is junk I have to like use a really good parser, right? a really good parser that's non-indexistence so I chose Ruby because it's fast I can do red jacks I can do all sorts of stuff on the strings and I insert them but years later then I figured out that it's actually a better way to do it so could I have done it earlier on with a different method that is more down to C or more down to Postgres Direct I could have but it will be harder to debug because I took like one and a half months to debug that parser alone because the source data is really junk so if you run something at really low level where you cannot debug you cannot pull out the debugger in spec and everything but it's more efficient but then you will never finish your code and then it's not going to help you in your work I rather get it done it could be slow it could take like two hours to run but it's there you can debug it and everything and then knowing the logic with those specs with those aspects now you could reconstruct the whole program in a separate language or a different language that's more efficient I go as Delish said don't be afraid of making mistakes I think we work with a we work with an understanding that with the knowledge that we have at a point where we implement the code the knowledge that we have right now at a point we wrote the code we think it's the best that we can do and based on what we know and what we think the client wants we build that piece of code for the client or for your company so I think we take that approach as best effort in getting things done I think when we build things iteratively we have always opportunity to go back and refactor I guess everyone should take a point to write tests for the code so that if you run when you go back you do some refactoring it will be much easier when you do that I will even go as far as thinking about feature test as well if you build a web application feature test on top of unit test which will make it easier for you to look at behavior of your vector code because to be honest when you work on a code for the web beginning you won't know how you scale or how you use it like I wrote for a client of ours we wrote a the RS API we tested it with the test data that we had it ran very smoothly there was no problem with the migration the data but we tried to load it up in snapshot of the production data that's when we found some bottlenecks so it's only when you look at when you actually test it with production data that you realize oh wait we should actually do it this way we should do it that way because if you don't want to know what to actually test it with actual production code and in the particular situation it wasn't the fault of the Ruby it was just I was meeting some index in the database so you could the problem may not even be in your code somewhere else like in black cases it was just that I was doing a full table scan on a table which didn't have that data index that I needed for the columns that I had so adding the indexes sped up the migration job much in fact of 10 to 100 which is amazing so it's about doing your knowledge that you have now build something to get that out of the door get the client to accept the idea or even accept the story and then when you start having problems take another look at it right I think I think one thing to do really have test courage is very important nothing is making sure that you write the code in a way that it's easy to fix easy to change things yeah that's done a whole discussion altogether how to write code in a more maintainable manner there's a whole other discussion I always talk about the term called spaghetti code which you when you first prototype your app you have this only one method class and everything is inside now but then you shouldn't go to the other extreme like Java developers where you orchestrate like 50-200 methods in the class before you even write a signal of code so Ruby allows you to write something make it okay refactor refactor refactor if you want to test you're very safe I'm going to give one more example on that practically it's for the use of tools use the right tools for the right tasks that's number one number two when I'm writing a little background app that will scan all my HTTPS connections to ensure that the signal that's certificate is not some government elsewhere in the world I first prototype the parser in in RRB because it's fast it's easy I just fire up RRB and do my parser so once I get my regex correct then I rewrote the whole thing in Node.js because I wanted to so yeah so that's how I come like switch between the two okay yeah so one of the biggest failures that I had was something was that last year grab taxi actually attempted a major rewrite we wanted to move a lot of our stuff into rails instead of the whole rails and Node.js architecture that we had at that time and then that rewrite would require would require a very it requires a very high concurrency setup and that is not something that Ruby is very good at so that I would say rails is good for Ruby or rails is very good for a lot of stuff but it's not good for high concurrency stuff so and also so when you when you consider what technology you want to use think about the characteristics of that technology and then decide on it and also don't take rewrite lightly like when someone tell you that you want to rewrite rewrite something think about it before you actually go and do it so you have to rewrite it actually failed because it require it require a lot of high concurrency so if you just stick with what your head or you rewrite it in another language or whatever so we we learn a lot from that attempt at writing from Node.js to just rails and then like about about 6 months further from that point 6 months down the line we actually started writing parts of it in Go so now some of it is in Go right now I have a failure to share so I've been doing Ruby for 8 years now so in my first 3 years I wrote code without writing test so some people is still maintaining my code I'm so sorry but I'm always writing test now I know my mistake so please don't please start to write test okay do we have other questions yes your favourite way to deploy Ruby app to production braver way to deploy Ruby app to production hero code hero code the one second answer hero code it's the simplest for now I mean for prototyping part prototyping deploy straight up to hero code and then it works then case close move on next hand technically it works but for your wallet I'm not quite sure but technically it works very well ya it works a bit differently I grabbed actually because our real stack is so complicated like it connects to multiple databases and stuff like that so we actually have Ansible scripts to handle a lot of our deployments right what do you do for deployments? so we have a rate script that the team has written that I use but say that if I was starting from scratch against haroku or elastic beanstalk and that gives it a bit more control especially if you need something customer I recommend that you have AWS if you need more control and more I have apps on digital ocean that's because haroku wasn't able to support the app I was trying to run so I deployed it on digital ocean why didn't I use AWS because it just felt easier to deploy on digital ocean so I'm still with digital ocean for that app but I'm using for the database I'm using RBS in AWS because I don't want the database to be on that server and that makes sense in the initial days though you should initial days you should ask yourself if my app cannot live in haroku why there isn't security decision that haroku guys made and it's good for you but at the later stage after like half a year one year when your app is mature then maybe maybe you'll leave haroku and all but in the initial days 3-6 minus if they want you cannot run in haroku so it's really really wrong yeah unless you're doing some rocket science I think for those of us who work in agencies usually process the main thing and so immediately go for AC2 but I thought agencies usually transfer the cost to the client so no you can always run in the free tier just for testing and when it goes live just switch it on to one of the hobby tiers when it's really go live easy for prototyping and testing so I think one of the pain points I feel when I use my digital ocean is right now like ruby is upgraded and then ubuntu is upgraded right I have to do it myself like I don't have time you know can someone help me to do it for environment haroku you know these are all invisible to me so it just works so I don't care otherwise I might be facing security potential security problem which I think there was one with the I can't remember what it was but I have to patch it passenger I was using passenger so there was a bug with passenger I have to patch it on the OS level instead of you know just letting someone handle it for me when I do consulting or when I work for somebody depending on the budget level which is like from zero to like $6,000 for infrastructure I recommend also some stuff and I recommend even running on Mac mini you know last time as well and I still do if you have like not much budget to run away but yeah folks at Nectars I.O and Hiroku they have done new packs they are really really good for your apps they solve a lot of issues so even if you are not going to use it you should look at the new packs how they configure the stacks other questions? we need one or two more questions so can real scale can real scale almost specifically how much does the extra server cost how does it affect the bottom line so maybe the question can you tell us how many servers you are using for us we are using about 30 servers 3.0 okay 3.0 okay so it's not just it doesn't just come down to the amount of money you are paying for infrastructure it also comes down to how much time does the engineer need to spend to learn this new language how much time does the engineer need to spend to get a particular feature out whereas when you do rails there are like 10,000 different gems out there whatever you are trying to do it's very likely that the gem already exists but in terms of so do you think that I'm sure grab taxi has a lot of traffic so do you think 30 servers right now is like is it a buffer already for you know more traffic from I don't know Indonesia or whatever so so grab taxi's traffic actually has a pattern so you can estimate how much how much instances you want to prepare for but 30 instances is definitely overscaling we are we are just setting it more so that we can have a good holiday right so if it works for grab taxi you should work for your start um this question is always asked right many many times and you have to understand the nature of the app it's not to say that Ruben Rose cannot scale if you don't know your pattern of the app the nature of the app and you write it in a different way of course it's not going to scale very well like I don't represent Viki anymore but Viki uses layers and layers and layers and layers of cash because they know their app so well they know it's more like one guy contribute 100 guy 1000 guy so they cash it so well and it provides CPU power for the contributors along CPU power for the contributors but everybody else reads from layers of cash so if one layers of cash is busted it takes another layer of cash reconstruct the first layer of cash if the second layer is busted it takes a later layer of cash and so on so if you do that then the request never hits your controller that's the bottom line you don't want any request you don't want to hit your post-dress or your application controller so the things that come before it will help I'm not saying caching is like performance but it's perceived performance your users but if you're on the app where read and write is very important that you need instantaneous write broadcast and everything then you should really take your DB very well and scale your DB very well Action cable runs on a bit of read is right so ya you should you should you can tell from why didn't they use post-dress it's not that post-dress is not scalable it's probably not the best DB for the job ya so what about the next? I doubt that so I would tend to agree I think the architecture for scalability it's not so much a language or framework issue it's very domain dependent so what we do now and full candy it's a very different type of app so you know we for us right now in terms of scalability just pay more and get additional server because that's a minor cost compared to say what we can do and stuff but I used to get greener and that there's no way you could build that and something like rails for what we did that has to be a C or C plus server that we build ourselves so because the thing is the traffic patterns are different the way the service is used is different so it's a very domain dependent kind of on-site architecture think about you won't know where the bottleneck is until you actually you can architect it very well but you have zero users so so look at build something quickly MVP get it out of the door get some users to hit your app and then from there you can tell where your behaviour of the app should be the kind of app that is is it more CPU intensive is it more database intensive is it more IO intensive or whatever finding out where the bottleneck is and then attack those bottlenecks I mean I wrote an app I wrote an internal app recently so at the end one of the bugs in Tripido Tractor was the job the job to run it again with baskin timeout and can't run it anymore like what happens going on it turns out the job took a bit longer than it's supposed to on your Google and you're going to queue with the process she's like okay so there's no way around this which is things like getting jobs so like getting jobs which basically you click it you fire off something to a queue and you run it in the background from user perspective it's like wow it's already running you get responsive the app queue is more responsive as in perception is more responsive but actually what it's doing is it's firing off something in the background to trigger that job so ya very simple optimisation but knowing where the bottleneck is helps a lot and designing the application so if you want to know Shopify Shopify is also a Ruby on Rails app they've been running on Rails for a long long time even a CTO tweeted that Rails can scale because they are still on Rails okay maybe one last question from the floor before I any other questions from the floor yes how mature do you think the Ruby ecosystem is what the features of the language you do not like features of the language you do not like and how mature is the ecosystem so I work on occasionally I work on the GoStack in GraphTexy also so when I compare it with the Rails ecosystem I actually think the Rails ecosystem is much more mature like just now Michael mentioned that Ruby's cooling is very very mature like all the Go guys still envy the Rails developers for the amount of metrics of it for free and then it's been around so long that you can just see it that when you compare it to a new language like Go a fairly new language like Go the maturity is just there and what feature I don't like about Ruby I would say the inclusive and non-inclusive dots like if it's two dots it means one it's yeah I don't even remember yeah the range okay Sam For me I've always liked the concurrency languages very well and the way that Ruby does it concurrency is resonate with Python-tested if there's any Python guys here so kind of hope that that will improve where the VM understands that AI need a threat it figures it out I need more CPU power I figure it out which is more efficient more like but otherwise syntax-wise and future-wise I cannot complain I think it's really very elegant how it's done the decisions that the core team do is not not silent to any area not performance not syntax not wow factors not this not that very balanced and which is why which makes real even better right so I cannot really complain yeah and because I think it's relative you know my perspective is more is there enough of you know so much of language is there enough of a community around this can you find developers can they adapt to speed quickly can they start becoming productive with the language quickly and I think that to large extent is yes in terms of what I don't like I mean nothing comes to mind you know the syntax the thing is again probably a different perspective I see the language one of the tools to achieve some purpose a business purpose making the customer happy in a certain way and when you look at it from that perspective kind of syntax issues kind of melt away that relatively easy ways to construct solutions around bad syntax or bad language feature or whatever let's see so we use rails a lot we find that there are some um behaviors which are only specific to rails and active support active support gives you like for example a new class you can't use a present dot present on a new class outside of rails and you guys use a dot present pressure mark so anyway there's only in rails and only in active support that gives you that kind of thing you don't find it outside of rails so for somebody just working on moving on its own as if maybe using Sinatra or something else that doesn't actually have active support sometimes it's a bit of a culture so that's that's my only kind of like fear the fear of using a framework like rails is that you might get vendor locked in like oh shit I can't move out of this but so far the decisions that the core team has made in terms of rails and active support and all these other things I think it's been pretty good and we agree with them and I think all the convention you get things done very easily and very quickly yeah but it does give you a sense of lock in as you move out of that comfort zone you end up having to reinvent the wheel a fair bit in terms of stuff ecosystem wise I think as a php developer I think the php community is also moving trying to emulate the Ruby community as well like under having gems make it really easy to build your dependency management so easy in Ruby and on rails with php they've only recently gotten around to doing dependency management using dancing core composer so I think for them for the php community it's a kind of like we're trying our best we're trying to we understand what TDD is but we don't quite have the right tooling to get this thing done or other language itself may not just support the things that we could actually do in Ruby right now so I mean yeah so I can only compare from the php perspective person I think Ruby the Ruby community is definitely more mature for looking and always always pushing the boundaries in that sense php community is following some power play and catch up but I think there are some legacy issues that the php community are going to deal with like there's still there's still people who aren't using php4 so you know fragmentation fragmentation is yeah hard to deal with I think one thing I really like about Ruby is that you can create virtual environments you can run multiple versions of Ruby easily on your machine if you're using rbn for rbn in the php community there's no accepted way of doing this right now even python this is it's also quite advanced in that sense you don't use have your virtual ad which makes it easy to create virtual environments where you have python or a certain version running on your folder which is quite cool php3 doesn't actually have that no actually have it's okay you don't have to keep bashing I don't have an DM an DM doesn't have that in fact equal system-wise our only comment that the node guys has caught up very quickly within a rush of period of time I cannot really compare the two equal system as in how mature how big how big because they constantly change but close enough what's interesting to note is that bundler and jam wasn't the first packaging system around right the Java days the guys has it as well but implementation is very different and the equal system didn't really think alike as nobody forces them in one direction so you have packages that kind of conflict with another packages versioning didn't work very well and then you could have packages that you install and it's there but you can never include a class never import a class so but I've never had that problem with Ruby so long as the germ is quite decent as in desk code if it's a real gem it normally from forms of convention it forces itself in red places you can always require them whether it's copy script or Ruby classes so it's very different and also I think because of Rails because of Rails Ruby Gem developers so far encouraged to solve different problems in the MVC stack or MVC pattern but you don't have to worry about a lot of things right whereas say in node if you the first thing in node you have to ask am I an express client or not express client right that's number one that's already put off sometimes so what happens is there are a lot of node developers when we build MVC we build various specific MVMs that does one function very very well and that's it but the number of huge packages are fine few that has zone of languages because it allows us to go really modular right but okay I need to bring it back to the question about the maturity of the community to add on to what they have said so far I think the Ruby community is really doing well what you should do is really go to the conferences so this is one of them but at the same time we can venture out to the conferences in other countries especially go to Japan so next year they will be doing in Kyoto in September if you can go and visit and talk to the people that get to know the community they are all very friendly people go read Chiyon's blog post if you want to know why you should attend conferences you can share the link and at the same time I think the Ruby community is very open to helping people there has been around for so many years so I think we all just want to play a part in making the community even better what I don't like about Ruby I really can't think of anything maybe the new try syntax maybe that but nothing else so let me bring back the panel so that we can close it soon final question from me what do you think can improve with the local Ruby community but if they need to improve with the local Ruby community I can start first I actually like hope that during the college days the NUS days or whatever you say that they also pick up rubellarios and not wait until they finish their degree they graduate and they were looking for a job and they try to pick up whatever's up there because the schools normally teach them Java or .NET and that doesn't really really help unless they're trying to look for a job in the bank anything else you all see that you feel needs to improve in the local Ruby community so maybe what I would add is so there's a lot just like an incredible incredible amount of talent locally and regionally I think one thing that we can do better and is and I say this at the same point I grew up here I was born here at that the Asian mindset is to be less vocal and you know less out there less public with stuff discover less public about you know talks to give it's good that we have kind of conferences coming up but I think if more people in the community just show the rest of the world that hey you know there's a lot of cool stuff cool stuff happening in Singapore and Asia or Southeast Asia you should come check it out you know that would go a massive way in terms of making the community be seen in a better life internationally for me my general experience with Rails the first in Singapore in Malaysia they are generally generally more quiet they are not they don't speak up enough like and the other thing is that I will I think I think being able to bring Rails to the college community the high school community is very important because once you show them that there is something else other than dotnet they will be oh okay there is another word out there okay Michael or a car like I was was talking to this name just now about to see if it chasm between people who are beginning Rails and people who are intermediate or really make a decision to make a career doing that as in you see a lot of people attending Rails Girls and all these other you know beginners beginerish kind of kind of things nubish kind of things like the movie, tea party and all that stuff and how many of them actually progress on to become hired or go into doing this as a career something I'm kind of concerned about I think it's concerned across the board about Singaporeans or even the locals choosing to become an engineer rather than rather than going to work at a bank or something like so I think making a conscious choice to make this a career and to be good at it become craftmen and doing software being a software craftman basically and getting better at what you do I think sharing sharing the knowledge of what I think so far we've been really good at sharing knowledge I think we should continue to do that sharing knowledge about best practices things you've done and invent more, create more things and share with us and I think it will be exciting to see Okay, so I think that sort of sums up the mentality of mine Yes, yes I would just like to mention that I live in the United States and the way I found out about you guys is by googling and seeing the video that you've been posted so I've seen Winston and watched the video a couple months before he was coming to Singapore if you like the world to know more about what you're doing make more videos Okay, so So thank you Michael for doing all of the hard work in translating This team are doing a great job in pushing out our community to the outside world so thank you so much to him and this team and we're looking for volunteer but I guess across the board we hope that everyone can speak up more participate in the meetups more so that we have more talks scheduled for everyone to learn from one another Alright I hope you guys enjoy the session today if you have more questions feel free to approach them individually some of them are hiring right so talk to them see if you can get your job today interview that there are rooms to do it Alright If not can we give another round of applause Thank you so much to them and again thank you to our sponsors today thinkoblogs.com Q3 do you stay around is there still food? I don't know Ya, there's still food So please continue to stay around have food minggu around come to each other stay Merry Christmas Alright Thank you so much Thank you so much Thank you Thank you Thank you Thank you