In this video, let f of x equal the square root of x plus one and we're gonna find the Taylor polynomial, the fourth degree Taylor polynomial of this function centered at zero. So we're gonna grab the first couple of terms of its Maclaurin series. We wanna use this to approximate the value the square root of 0.9. So notice making a connection to the function right here that 0.9 is really just one minus 0.1 which is our function evaluated at negative 0.1. So that's gonna be the connection we want to make there. And so using the Taylor polynomial, we're gonna see that f of negative 0.1 is approximately the same thing as t4 of negative 0.1. We'll make that estimate and then we'll see how good that estimate's gonna be. Now, before we go into the details of the calculation, let's look at the graphs of these things for a little bit. So in all three of these graphs, the yellow curve right here will be our function y equals the square root of one plus x. This first reddish function, it's magenta, is our tangent line. It'll be the line at the point one comma, sorry, zero comma one. Like so, this is the linear approximation. You now see here in cyan, this bluish color. This is our tangent parabola which is doing a little bit better than the tangent line. Then in the next graph over here, you see this, the degree three Taylor polynomial. It's a cubic graph. It fits the curve even better. And then finally, this violet graph you see in the third one, it is going to be the degree four Taylor polynomial which we're gonna look for in just a second. And so graphically, you can see this thing does pretty good. Now, of course, you're gonna be really good near the point of tangency. Now, the farther you get away, the worse it does, but it does pretty good inside of these green lines right here. So where did these green lines come from? Now, one thing I wanna mention is that this function f of x right here, it could be written as one plus x to the one half power. And this helps us recognize that this is in fact a binomial series, a binomial series for which k equals one half. Now, for this binomial series, we can then very quickly see that the radius of convergence is one, that is our x value needs to sit between negative one and one, our interval of convergence. The function will equal its Maclaurin series when x is between negative one and one. Outside of that, the Maclaurin series diverges and therefore equality is not possible. So notice that between the values x equals negative one and x equals one, the fit between the function and the Taylor polynomial is really, really tight. But outside of that, you don't get any, you don't expect anything to happen here because only between negative one and one is the function equal to its Maclaurin series. And therefore only between negative one and one would we expect the Taylor polynomials to approximate this function. So we see that in this picture here. So like I said, our function is a binomial series. Therefore f of x, which again equals one plus x to the one half power, we can very quickly get its Maclaurin series where it equals zero to infinity. You're gonna get one half choose n times x to the n. You get this thing very, very, very quickly. And so remember this binomial coefficient has the following properties. That if you take k choose zero, you're always gonna equal one. If you take k choose one, it's always equal to k.  And so you'll then continue on until you end up with k minus n minus one like this. Although this last few bits are typically written as k minus n plus one. And this all sits on top of n factorial, all right? And so we're gonna use this formula in the consideration for the above. Now we don't have to do all of the series. We just want the Taylor approximation degree four. So we are gonna say that this is approximately the same thing as t four of x. And so we just have to grab the first couple of coefficients. So like I said before, k zero is always one. So you're gonna get one plus k choose one is always k. So you're gonna get one half x. For the next ones, we need a little bit more to it perhaps. So you're gonna get k, which is one half times k minus one, which is actually negative one half over two factorial x squared. The next term will be one half, negative one half. And then you're gonna take the negative one half and subtract another one from a negative three halves. This will sit above three factorial times by x cubed.  And then this sits above four factorial. Don't forget your x to the fourth right there. Now let's try to simplify these things. The first couple of coefficients we already did, of course, so you get one plus one half x. For the next one, you do see there's a negative sign and so you'll get a negative right here. For the next one, so if you check all the twos, you have a two, you have a two. Two factorial is itself just a two. So this is gonna be one eighth, negative one eighth times x squared as the next term there. For three factorial, notice three factorial is three times two times one. The three on the bottom does cancel with the three on top. You have two negatives, which double negative actually makes it a positive. And then if you grab all the twos, we have a two, two, two on top, that's an eighth. There's a two on the bottom. That's gonna give us a sixteenth, so we get one positive, one sixteenth x cubed. And then finally, if you look at the last one, again, the four factorial becomes one times two times three times four. The three will cancel right here. You have a negative, negative, negative, so it's actually a net negative like so. And if we keep track of all the twos, you have a two, two, two, two. So there's four twos on the top. I should say four, one half's on the top. That's gonna give us a one sixteenth. And then you have a two and a four, that's an eight. So 16 combined with the eight that's in the denominator already. You're gonna end up with one twenty-eighth, or I should say one twenty-eighth on the bottom. And then the only other coefficient on the top that we haven't interacted with is the five. So you're gonna get five over one twenty-eight x to the fourth. And so this is our Taylor polynomial approximation of the function. So like we said earlier, the square root of point nine is a, this is equal to f of negative point one, which will be approximately the same thing as t four of negative point one. And so we have to shove this into the function above in all these different places for x. So we end up with one plus negative point one over two. Sorry, we're gonna get a minus negative point one squared over eight. And then we're going to get a positive negative one point one cubed over 16. And then finally minus, minus five times negative point one to the fourth over one twenty-eight, like so. All right. And so again, there's some tedious arithmetic that needs to go on here, but in the end, this thing would approximately become zero point nine four eight six, eight two six nine four, if I did all those correctly. So you get your estimate right here, that's good, that's good. What are we gonna do next? So the next thing is we have to estimate how good this thing is gonna be, which when you look at this thing, notice, well, how are we gonna estimate this thing? Well, since we estimated this thing using the Taylor polynomial, we're gonna use Taylor's inequality to help us compute the possible error, sort of worst case error here. And so the thing to remember with Taylor's inequality is the error is gonna be bounded above by m times the absolute value of x minus a to the n plus first all over n plus one factorial. And this is gonna happen for all x's, which are sufficiently close to a, that is the distance between x and a is d. And also remember that m is an upper bound for the n plus first derivative. Of the function on this interval as well. So what is the n plus first derivative here? Now remember our series we were using, we got about from the binomial series. So we kind of skipped all the derivative steps, step by step by step. And if you wanna see those, you can actually look in the lecture notes that are linked in the description of this video for a full detail here. But as it's a binomial series, the derivatives follow a basic pattern. We don't have to compute them step by step by step. The nth derivative of this binomial series, that is the nth derivative here, is gonna look like k choose n times one plus x raised to the k minus n power. k minus n, that's the pattern we got. And so when we plug in x equals zero in the center of this Maclaurin series, we end up with, I'm sorry, I got, let me back that up. Well, what we have here is fine, but this should be over-infectorial, excuse me. So the nth derivative over-infectorial is gonna equal this expression right here. This is the pattern we get when you do those derivatives after derivatives after derivatives after derivatives. So therefore if we choose n to equal four, we then have to look at the next piece going on here. And so the next piece to help us find this m value right here, m has to be bigger than the nth derivative. But then if we slap this n plus, if we slap this thing on the bottom right here, right, we see that m over n plus one factorial, it needs to be greater than or equal to this k choose n times one plus x to the k minus n power there. And so let's put in the specifics for our function. So we're gonna get one half choose n, sorry, n plus one. That's what I meant to put in there, n plus one. And then this one plus x, we're gonna raise that to, I guess I don't have to be so general here. The n is a four, right? So all of these should just be five. So let me kind of back up there and fix this. So m over five factorial, this needs to be bigger than the, this is gonna be bigger than one half choose five times one plus x raise to the one half minus five right there. So with that in mind, m is gonna be this value. Well, I guess we can just leave m over, m over 120 here is, we'll just move to that side. m is gonna be very equal to 120. And then when we do this one half choose five, like we saw before, we're gonna get one half times negative one half times negative three halves times negative five halves. And then one more, you should have five factors on the top, you're gonna get negative seven halves right there. And this will all sit above the five factorial, right? So you see that those ones are gonna cancel out. And so then what do we have? Now we're gonna have one plus x raise to the negative nine halves power, like so. And so how bad can this thing get in this interval in question? Let's try to clean this thing up a little bit because we're taking absolute values of all these things, all the negative signs don't really matter. If we keep track of the twos, you get one, two, three, four, five twos. So you're gonna get a 32 on the bottom, in which case then you get a three times a five times a seven, multiplying all those together should get 105 times one plus x to the negative nine halves. Now this function is a decreasing function on the interval in question here. And therefore the biggest that this can get in terms of absolute value will happen at the left end point. And so that's gonna happen at the point x equals negative point one, right? So our d value from before that we had this d value, we're taking the absolute value of negative point one. So how far can x, how big can this derivative get as x ranges between negative point one and point one? Well, because the function that this derivative here is decreasing, because it's decreasing, the biggest is gonna happen on the left at this negative point one. So we wanna insert that into this expression right here. And so when we do that, m needs to be greater than or equal to 105 over 32. And then when you plug in the negative point one, you're gonna get this point nine to the negative nine halves power like so. And so again, this thing would look like 105 over 32 times the square root of point nine to the negative nine. So I'm actually gonna put it in the denominator. That's gonna be raised to the ninth power. So we have somewhat of an issue right here, right? Because if we can compute the square root of point nine, why are we doing this whole exercise, right? So we're gonna have to think of a sort of a clever way of getting around this situation. And so what I'm gonna offer is the following. This right here is gonna be less than 105, 105 over 32 times the square root of point 81 to the ninth. Why is that a good choice? Well, because point, if you make the number point nine gets smaller, that actually makes the fraction get bigger. And now point 81 is actually a perfect square. And so this thing becomes 105 over 32 times, we're gonna get point nine again to the ninth. And so taking something to ninth power, although it can be kind of difficult, just use a calculator, this is just basic multiplication there. We're gonna end up with 105 divided by 32, 32 times, point nine to the ninth, you end up with point three, eight, seven, four, two, zero, four, eight, nine. That's gonna be even more difficult arithmetic here. I'm just gonna say that this is less than 105 over 32 times point three. That is this number right here, I'm just gonna replace it with something even smaller, point three, voila. And then that cleans up very dramatically. You're gonna end up with 175 over 16. So again, these are error bounds, these are inequalities, right? You can sometimes fudge the numbers a little bit to make life easier for you. So 175 over 16 is a much better value to use. And that way it doesn't actually require any sort of the reason, we don't actually have to compute a number that we haven't computed yet. So going back to our error, the error which is equal to the remainder of some four of x right here, this is gonna be bounded above by 175 over 16. Divided by five factor, which is 120 like we saw before. And then you're gonna take a point one here because that's as far away from the centers we're getting and we're gonna raise this to the fifth power. All right, a little bit tedious at this moment, the arithmetic might be, but as it just requires addition, multiplication, really just division of multiplication right here, these are four functions of arithmetic, well, two of those functions. This will be approximately 9.115 times 10 to the negative seventh. And so we see that this answer would be accurate to about six decimal places. Remember our calculation from before, where is it, aha, here it is. And so we can see what that will be accurate to about six decimal places, at least this much right here. And it turns out that the error we did with this article actually, it's a little bit better than what we estimated. The error bound tells us it's gonna be about, about nine times 10 to the negative seventh. But if we did a slightly more accurate calculation, we can see that this is actually a 6.041 times 10 to the negative seventh. That is our error bound gave us this, but the actual error was this illustrated in green right here. And so oftentimes our estimates can do much better than the error bound gives us.  And so this brings us to the end of lecture 48. And this actually brings us to the end of our lecture series calculus two here. For those who stuck around for this series, congratulations, give yourself a pat on the back. Calculus two is a very, very difficult course. I'll give you that. And so way to go making it to here. Now I do wanna mention that even though the series is gonna be officially over in the future, it's very possible that I actually might include some new videos that are related to calculus two that are sort of optional that students can look into if they are interested. So take a look for those things. You know, feel free to subscribe so you do get updates about those additional videos that might be added, not just for calculus two, but for other college level mathematics classes or questions you might have in the future. Feel free to hit the like button and hopefully I'll see you for next time, right? With the end of calculus two, I think the very natural thing to go to next was, well, we could go into differential equations. We did a little bit of those in our series. Calculus three is another way to continue on. We saw a little bit of that when we talked about polar coordinates and parametric curves. Calculus three is typically about finding, finding, working with multiple variables in your calculus problems. We did a little bit of probability in this course. So calculus based statistics class kind of makes sense. Or my very favorite, it would be linear algebra. In fact, we have a, this channel has a really good, not just video lectures, but also a free digital textbook based upon linear algebra. It's known as linear algebra done openly. And so if you are interested in learning kind of what's the next step in these, in your mathematical journeys, take a look at some of the links that hopefully you see on the screen right now. And I will hopefully see you in another, another lecture series sometime soon. Keep on calculating everyone and I'll hopefully see you next time. Bye.


I think a good relational skill to develop, to age well relationally I've found, is to know you never ever look good, trying to make others look bad. I think it's a mark of great relational integrity to refuse to do that. It doesn't mean you can't be critical and you can't make observations and you can't have insights about other people, which may not be great. It doesn't mean I'm not talking about living in unreality, but I think there's a way to talk about someone else's failings or mistakes or shortcomings. There's a way to talk about that, that doesn't have the energy or doesn't have the tone of it being at their expense. It doesn't come across arrogant and prideful and finishes it where you're really trying to make yourself look smart and good and cool and better at their expense. It's that that I think relationally takes its toll on you as you age.


I started the communication masterclass some years ago because I felt concerned that there was nothing available for communicators, especially emerging communicators, the next generation of communicators, not only in the church world but generally, generically. I was concerned that communicators in all walks of life, politicians and people in the corporate world, people in the church world, that we don't get better at this by ourselves, that if you have the gift of communication it is your gift and it doesn't improve by itself no more than any other gift does. I think especially in the church world we have been lazy about that development of gift assuming it'll just get taken care of in some sort of mystical way but we have to commit to growing ourselves for the benefit of those who are the recipients of our giftedness. If we were singers or musicians we will perhaps understand this much more readily than we do as speakers, as communicators but it is no different and I am committed and convinced as you probably know that a thing said well is just as much a work of art and just as much beautiful to behold and be part of and listening to anyone sing or play a piece of music or any other expression of communication. I had no help, I wish I had had a communication masterclass to go to when I started as a communicator. The day is really not about things you can find on the internet to do with technique. I found that technique was really not the things that I majored in struggle with nor what most communicators struggle with. We mostly struggle with confidence, with being comfortable in our own skin, we struggle with a sense of a right to be heard, we struggle with what it is that we feel we have to say and is that valid and is it an important you know thing to say to stand up and take people's attention. Therefore the day is really focused on helping you the communicator rather than speaking to you about the technicalities of communication. I figure if I help you to grow and help you to get better at what you do then what you do will almost be a secondary consequence of you becoming more confident and more clear in your communication skills and more intentional about that. So the day really is about helping you to learn how to speak from your heart. Something all the best communicators do that is why we feel such a great connection with the people we most listen to and follow as communicators is because when they speak they speak to us from their heart but that is not something I assume you can do or I would do. I certainly wasn't doing that. Who does speak from their heart? How do they know whenever does? Certainly politicians don't till they've retired and so I want to teach you and speak to you about the importance of speaking from our heart then I want to help you understand how to find your message. What is the thing that drives you to want to get up and risk rejection and risk to be misunderstood and risk people misunderstanding your motivations and so on and put yourself out there for opinion and judgment which is what we do we stand up as public speakers. There must be something that drives you to do that more than just having a great idea or a great subject and that is what I call your message your why that undergirds the what and the how and the who you may go on to talk about. I want to help you figure out what that is for your life. I want to help you understand how people listen because as a communicator we have to spend a lot more time in the shoes of people that we speak to than we just do in the shoes of ourselves as the speakers. How people listen is very complex and I want to spend some time in the day helping you understand that in this mystery of exchange of ideas between you and your audience or between a speaker and you as a listener there's some very complex things going on and I think understand that has made me and we make you a better communicator helping you understand the art of capture how to how to wire yourself to capture images mentally take a mental photograph then develop them into a concept an idea that transforms people's lives because of the way you captured it in the first place then help you figure out how to find your voice what is your voice it's not just a sound you make it's a distinctive signature note a vocal fingerprint only you have on this planet and I want the day to take time to help you to find your distinctive voice that there is an audience somewhere waiting for but I'll never find you until you find your voice it is simply a brilliant day the feedback we get from these days is phenomenal and people come expecting I think something very different more technique based stuff and go away delighted it wasn't that but go away feeling that they got to understand themselves and got to look inward and develop self-awareness of how to become much more of an authentic genuine heart-to-heart communicator which is I believe what all the best communicators have figured out so keep an eye on us keep tracking with us on social media where we are letting people know where these masterclasses are taking place around the world and I hope you can attend one with me very soon


Hello, and welcome again to another OpenShift Commons briefing. This time I've invited Ray Sang from Google to reprise a talk that he gave in the developer room on microservices and containers that caused him earlier this year on GRPC and microservices. He used a lot of great demos and things. I think it will be really interesting to all the Java developers and folks using IntelliJ and other things. So I'm hoping we can have a good conversation afterwards and do some Q&A to pick Ray's brain about this stuff. So without too much further ado, I'm going to let you all ask questions in the chat, and we'll try and answer them, and we're going to let Ray take it away. All right. Before having me, we're happy to be able to present on this OpenShift Commons briefing, and let me get started. My name is Ray. I am a developer advocate for the Google Cloud Platform, and what that means is I love to bring Google's greatest and latest technology to developers all over the world, but I also like to get your thoughts, your feedback, and how you're using our technology today, whether it's the cloud or whether it's the open source projects. So if you have any thoughts, feedback, questions, or just wanted to chat or need any help, just ping me on Twitter at Saddenism, OK? So aside from developing, I love to travel. I love to travel all over the world, and I love to take photos, and this particular photo is special to me because I was backpacking in Asia, in northern China, and being a cheap backpacker, I wanted to find some of the most cost-effective place to stay, and there was this one city where they told me I could stay for free if I go to a desert and hike into the desert for about four hours, and I would actually find an oasis with water and I can stay there overnight for free, and I don't know if anyone on this call actually hiked in the desert before, but it's not very easy, right?  Anyways, it is a very tough process for me, and well, it kind of reminds me of writing a J2ED application back in the day, but the end was beautiful. Once I got through to the oasis, which I'm happy I found, I was alive, and the end is beautiful. Beautiful sunset, and I was very, very happy I made the journey, but this is how I look at my job, right? I'd like to take all of you, I want to take you onto a helicopter and airdrop you into the oasis rather than having to go through all the troubles, so let's get started. We have talked about microservices and microservices architecture for the past year or two years or so, very heavily, and we are seeing a lot of adoptions in this architecture today as well. Whether you are migrating to microservices or whether you are creating a new microservices architecture project, there are some things that you have to really think about. Well first of all, if you're breaking things down or if you're just building microservices, you will have more and more components you have to manage independently, right? And very importantly, it's you need the resources or the team, the small teams to create and maintain these microservices and operating it, but you also need the technology to be able to keep all of them up and running and actually know what's running in your environment. And with this type of architecture, you will be adding some overhead, and luckily, we have tools that we can use to orchestrate and manage all of the microservices instances that you may actually spin up. So for example, rather than having just two instances of something, you may end up with 10, 20, 50, 100 instances of different services, right?  However, one thing that we don't really think about is how do these microservices communicate with each other? I see it in two types, right? We have services that you need to consume from the browser, right? And for that, the browser can only consume REST, though that is the default protocol that we use. However, in between services, we also defaulted to using REST or JSON over HTTP to have these inter-micro services communication, but is that really the best way to do it, right? And we really need to think about how and why are we choosing and picking the technology and also what type of technologies are available to us. And this is where GRPC come in, and you might be thinking, RPC, well, that sounds a little familiar. I think we have tried RPC before, and I thought nobody liked it, right? But RPC has been around for a long time in distributed systems from the past, and I don't know if anyone on the code remembers Corba. Corba is, of course, one of the prominent RPC technology where you can define an IDL, so you can define an interface definition language where you can, you know, say what it is that you are trying to build, what does the message payload look like, and it's going to generate a stop for you so you can implement it, just the operations you want to implement. But then I remember that if you want to connect to the server from the client, it's like 100 lines of code or something like that, and it gets a little tricky when you look at RPC and having to go through all the troubles to implement it, similar things with Decom, but Java, Java, we traditionally had a really good RPC support with RMI, and it's really, really easy to implement an RMI server, an RMI client, however, it is not really interoperable. Now, what happened then next is that we introduced SOAP, right? There was SOAP in the industry, and it is interoperable because we use the most interoperable format, which is literally text and XML, for that matter, and a lot of people think that, well, in hindsight, SOAP was slow, SOAP was slow because of all the XML processing we have to put in place, so you couldn't really live up to the problems that they are trying to solve, right? However, just like what we have done before, which we defaulted our services to SOAP protocol, today we're defaulting literally to REST, which is JSON over HTTP, but if you think SOAP is slow, REST is actually not much better, I mean, it's definitely better than SOAP, but it is still text-based, and you still have to go through the parsing, you still have to go through a lot of marshaling and marshaling, and you still need some kind of definition language if you need to be able to generate the client, so you don't need to write your own client error again, and so rather than using with SOAP, we needed to use Swagger, for example, to document and define what does that REST endpoint look like? But why RPC? Well, in addition to performance, RPC is going to be more efficient, because most of these RPC frameworks are going to be transmitting over a binary protocol, and most importantly it's going to be strongly typed, because you have to define your interface definition language upfront, you have to define your message payloads upfront, and then the generated stops for you will have strongly typed semantics in there. However, more importantly, when we default something to REST, we are locked in by the REST semantics, which are basically based on HTTP, which are generally CRUD operations, like the put, the post, the patches, the delete, but there's just some operations you cannot simply express in CRUD manner. For example, if you need to deduct a balance from an account and transfer it to another account, how would you do that in REST? Potentially, you have to modify two resources, and what you end up happening is we will potentially end up with some kind of JSON RPC, so we're just going back to RPC in one way, one for more another, where we're just using a text protocol to do that, but I think RPC can be really great if it is simple to use, just like RMI, but also interoperable, just like REST or SOAP, and that's what we actually have developed. At Google, we use an internal technology called Stubby. Stubby is what we use for most of our services, for service communication. In fact, we transmit 10 to the 10 RPC calls per second via Stubby, and that is an incredible amount of service calls per second at Google. Stubby is a binary protocol, and it is made to be very efficient in the usage of the bandwidth and all that, but just imagine if we use something else that's text-based, the 10 to the 10 RPC per second, we will be using a lot more bytes to transmit that. Even for Stubby, if we just take one more byte than necessary, that would be 10 to the 10 more bytes we have to transmit per second, and that is a mind-boggling amount. So what happened next is that Google wanted to open source Stubby, and I heard this company, Square, wanted to also develop the next generation of their internal RPC framework as well. So the two joined forces and decided to open source this GRPC together. So GRPC is really the next generation of Stubby. It's based on the experiences and the code that we have internally developed, and we open source it, and we call it GRPC. The G in GRPC stands not for Google. The G doesn't stand for Google. It's actually a recursive acronym. GRPC stands for GRPC Remote Procedural Code Framework, and it is simple to use, it's performant, and it is also made to be interoperable. And we are able to achieve the performance interoperability by basing it on standard technology and newer technology. So the transport layer of GRPC is not just a straight up TCP socket, right? We actually decided to use HTTP2 on top of TCP to provide this transportation layer. And why HTTP2? And what is it in HTTP2 that makes it compelling? Well, first of all, HTTP2 is binary. Rather than having to transmit the headers or the methods, whether it's get, put, or post or whatnot, rather than transmitting all of those things in plain text, with HTTP2, they can be encoded in binary. So the get that puts the deletes, they're just going to be encoded into a binary format rather than the entire string. And the headers are going to be compressed as well. If you ever look at the payload of an HTTP request, what you will find is that sometimes the payload is very small and the header is actually taking more bytes than the payload itself. And in HTTP2, we can compress it with HPEC. Now, more importantly, in HTTP1, we have the issues of keeping the connections alive. You can't really do streaming. And if you need to make multiple calls, you've got to do pipelining and all that. In HTTP2, we solve the problem by just you are able to have a single connection and we can multiplex multiple strings through the same connection. So rather than having to open multiple connections, you just open one. And we can also do streaming. We can do streaming from the client to the server and the server to the client and also both ways at the same time that you can multiplex it. And for the payload, we're using PortableBuffer3. And that is a way for you to basically marshal data into this portable format. It's binary encoded as well. And we can then transmit it to multiple different languages and every one of them will be able to parse it. And there's a quick comparison between the two protocols. There's binary, which is GRPC. You can see the throughput is, of course, faster than JSON over HTTP. But of course, it is faster. Anything that's binary that doesn't require a lot of parsing and marshaling is, of course, going to be faster than something that requires it. So that is not so interesting to see. I would be really concerned if the graph is the other way around. But what's most interesting to me, though, is that if you look at the per-CPU throughput, GRPC really all shines the regular text-based protocols by multiple folds. And this is important, especially if you're moving into a cloud-native mode, where you want to run your applications in a scalable fashion. And as a cloud provider myself, I rather than telling you to use as much as you want, I always argue that you want to use your CPUs as efficient as possible. And to achieve that, you have to pick efficient technologies. And in this case, GRPC will be really great if you run it on a server side. But not only that, we can also run GRPC clients on the mobile devices. So what that means is rather than costing the mobile device a lot of CPU cycles to perform the parsing and transmitting textual data over HTTP, you can actually use GRPC and transmitting binary data over HTTP2 from mobile devices. And what that translates to is actually more efficient usages of the mobile device CPU and power, for that matter. Here's a quick overview of the languages that we support. And I want you to focus on three, which is Objective-C, C-Sharp, and Java. And these three languages are the primary languages that you would otherwise use for mobile development. And GRPC was really made with mobile first in mind. So enough of the overview and the slides, I'm just going to go into the code and show you what it feels like to write something in GRPC. So here I have a bootstrapped project. I have a few demos I can show. The first one I want to touch on is actually a simple unary request and response. What that means is all I want to do is to send in one request. I want to say hello back. And we'll see how this works with GRPC. And you can also compare this with other frameworks, whether it's RMI or Corba, if you like, if you still remember how to do that. So with GRPC, the first thing that we needed to do is to define the IDL. We need to use the IDL to define what it is that we can actually transmit, what kind of service are we going to create. And the IDL is going to be created with the Kotl3 language. And so to do that, let me into my microphone down a little bit. So to do that, first of all, you've got to create a Kotl file. And in this Kotl file, we need to say syntax is equal to Kotl3. That is because we needed to make sure we're using the Kotl3 syntax. Otherwise, it could be using an older version of the syntax. And then, just like Java, we can put classes into specific packages. So can we in GRPC? So we can say something.com.example.grpc. And what that means is everything that we define in this IDL, what we generate is going to be generated into the corresponding Java packages. Now, with GRPC, this file, this Kotl file, will have to be compiled, basically, or translated into actual code for the target language. And there is what we call a KotlBuffer generator compiler, or Kotl compiler, a protogen compiler. They have many names for it. But through this compiler, you can give it additional options. And so you can specify different knobs where you generate into different languages. So for example, for Java, by default, it's going to generate everything into a single large Java file. But written in half doing that, what I really want to say, Java multiple files is equal to true. And what I would do is that when the compiler compiles this into Java code, it's going to generate individual Java files for individual classes. So that's just bootstrapping the IDL. The next thing that we needed to do is to define the request and the response. So to define the request and response, what we needed to do is to define the message payload. So we can define the message that says that's called hello request, for example. And what that's going to do is to generate the current spamming pojo code hello request in Java, in which you can get access to all the properties or attributes that you define in this message payload. And the way you define the message payload is simply define the type that you want to use, because everything is strongly typed. This is great. And you can say the first name. So I'm defining an attribute of first name or a property equal first name that is of a string type. And very importantly, you have to give it a tag. A tag is the number that uniquely represents this field in this particular message. And this tag, this number, is actually what's used to be transmitted in the binary encoding of this message. So rather than sending the whole text called first name, like people do with JSON, where it takes a lot of bytes to transmit over the wire, we just send over the number in binary format. So that would be just one byte to transmit this one number. And so we can define another one. Let's say last name equal to 2. I can also use integer 64 for the age equal to 3. For example, I don't think anyone would live that long. But I'm just going to use integer for now. And we can also define enumerations. In Java, we have enums, where you can define a set of possible choices for your value. And in Java, you see I can do a very similar thing. So I can define an enum called sentiment. And this is how we feel right now. I feel pretty happy. So I'm going to do happy is equal to 0. Hopefully, you are not sleepy, but you could be, because it is 9 AM in the morning. Not to say sleepy is equal to 1. By the end of this talk, you could be extremely angry at me for having spent an hour here. Then we're going to put angry equal to 2. Well, hopefully, that's not the case. But just in case, just in case, hopefully, you would choose happy in the end. So once you define the enumeration, I can go ahead and say sentiment is equal to 4. Done. I can also use other types. So if I have other messages that I defined, you can think of them as other structs or other classes. I can just use those messages nested in here as well. So for example, I can say if I define another message called language, I can just use language type here instead. But I don't have that right now. In addition to some of these basic types, we can also do a list. So if you have a list of something you want to return, you can say repeated, for example, hobbies is equal to 5. So you repeated the string. You need to strongly type this. So repeated string, hobbies is equal to 5. And we can also do create strongly typed maps. And this is quite nice. So if you have a bag or a map or a hash table of something you want to transmit, you can say map, the key type, and the value type. And this is very similar to Java, by the way. So this should be no problem to just picking this up. Now say back of tricks, OK? Like coding is definitely not in my back of tricks in this case. So once you have defined the request, all you can do is to define the response. So I'm going to say hello response. And I can, again, define the property. And in this message, I can define the tag. And of course, I can use tag number 1 in this message because they just need to be unique to the message. Once you have defined the payloads, the request and the response, then what you can do is to define the service. So I'm going to code this greeting service. And I can define the operation I want on the service. So the operation is going to be greet in this case. And it's going to take in a hello response. And it's going to return a hello, oh, sorry. I'm going to take in a hello request. As you can see, this is really early for me. And I'm going to take a return a hello response. There we go. OK. Now, so this is what we call a unary request. What that means is there's a single input and a single output. You give the server one request, and the server is going to give you one response. If you want to return multiple responses, you can return that in a string. And so what that means is the server can stream the data to the client. So the server can stream the data to the client at will. And to do that, all you need to do is to add a stream keyword. If you're building an IoT device needed to stream data, like metrics, to the server, then you add a string to the request parameters. So in this case, the client will be able to establish the connection and then stream multiple requests to the server. And in the end, the server will give you one response. Or you can return no response if you don't want to do that. OK, so that's great. That's the IDO. And the next thing we need to do is to compile this. Now, usually what you need to do in the past is you've got to figure out, OK, am I running on Mac? Am I running on Windows or Linux? And then let me go and download the compiler, the Protogen compiler, and then you have to pass in these low and complicated communes. We really streamlined this whole experience really, really well. So now all you need to do is go to GitHub, for example. And let's find the gRPC. So here's the gRPC GitHub repository. If you just scroll down, it actually gives you all the things you need to get started. So because I'm using Maven, I'm going to go ahead and, first of all, add my dependencies. So I'm going to go to my Maven palm. And here we go. I'm going to add the dependencies, dependencies. And there you go. But these are just dependencies for the code to consume, because you need the gRPC API. However, in order to compile this portal file and translating that into the Java code, what we need to do is by using the plugins. And we have plugins for Maven. We have a plugin for Gradle as well. I don't know what the breakdown here, but usually I see 50-50. If you're using Gradle, here's the code that you can use. And if you're using Maven, here's the code that we can use. So because I'm using Maven, this is what I'm going to use. And I'm going to go ahead and paste it in my palm.xml. This little snippet of code does a lot. Well, first of all, it determines which operating system you're running on and it's going to put it into a variable. And then it's going to be able to download the right binary based on the operating system that you're running. And then it's going to execute this binary and by binding into the different Maven build phases. So in this case, I'm saying whenever I'm compiling this Java code, I want to go ahead and make sure my portal file is also compiled and so my classes can reference and use it. So let me try it out. I'm going to go to my here and go to my terminal. You want to say Maven, clean and package. And maybe I made a mistake in my portal file. Maybe not. It is early in the morning, but we will find out. Ah, everything worked. Well, that is great. And if I see target and if I go to generate sources, there's the portal buff directory. And here I can go into Java, GRPC, and you can see all of the messages and also the services that I defined. So it generated all the stops and all the approaches for me just from a simple IDL. That's good. So let's go ahead and implement the stop. So what I'm going to do is to create a new Java class, I'm going to call this greeting service input, for example. No, let's not add this to it. And so for this stop, just like many of the other RPC frameworks, when you implement this stop, you need to extend or implement an interface. You either extend the base class or you implement an interface. In this case, we're going to extend a base class. That was automatically generated for me, which is greeting service input base. This base class actually implemented the greeting method by default. And the default implementation is just going to store an arrow that says there's no operation. It hasn't been implemented yet. So for you to make sure that this works for the client side, you have to implement. I'm going to say greet. And here's where things get a little tricky. And this is why I'm here, because I want to make sure you have the best experience when you're using this. So if you look at our initial definition, it is a request and a response. Now, if you look at the generated stop, it looks slightly different from what I would otherwise expect. Because usually when you have a request and response, you will say hello response as return value. You would say greet. And then you will have the hello request in the parameter. But if you look at this implementation carefully, I'm getting the request in the parameter. And I need to respond by using a response observable callback. I need to use a stream observer callback. And the reason that we're doing this is because we want to make sure the server side is as efficient as possible. And that's why in the server side implementation, everything needed to be implemented and synchronously. And because it is an async implementation, so we cannot just do the return in return value because that could potentially be blocking. So rather than doing that, we ask everyone to just use the stream observer to pass the data back to the client. So this is one of the most important concepts here is by using the stream observer. So I can say the name, for example, is equal to let me say is the get first name plus let's just say get last name. I can say the greeting message is equal to let me say hello last name. So you can see the request object has been generated for you that has all the setters and getters and the executor actually. And I can just simply use it. In fact, I can do something like this. I can say system.out.cleanline the request because we actually implement and generate the two string as well. So you can debug this very, very easily. You can log your request if you want to. And then what we can do is to create a response. So I can say hello response is equal to now the thing in GRPC is that everything uses a builder. Everything is almost immutable. And for you to create and construct a new instance of something, you have to use the builder pattern. So to create a new response, I need to create a new builder. So we can say a new builder. In the end, we say build that's going to construct me the actual instance Apollo response. But in the builder, we have all of the same fields that we can actually set. So here I can just say greeting is greeting. So I'm just setting the response back. And to give it back to the client rather than the return value, we have to use the callback. And this is interesting now because if you see the callback, we have three. There's onNext, which is to give a valid response back to the client. We have onArrow, which is if your service ever caught the exception, you can use onArrow to give it back to the client. And you can also use uncompleted, which will terminate the string. And if you look closely on these three methods, this actually closely resembles a reactive paradigm. This is pretty similar to RxJava and many of the reactive callbacks that you have seen in the past as well. That is because when you string something here and also asynchronously, this literally is implementing a reactive service. So I can say onNext and the response. The response, there you go. And that will send the response back to the client. However, this is not done yet because what you also need to do is to terminate this request session or string. So you have to call uncompleted. If you don't call uncompleted, even though the client is only expecting one response, the string will be held open until you call uncompleted. So you must do this no matter whether you're returning a string of responses or if you're returning just one. Not only that, if you do string observer call onNext, you can actually call it twice. But that is invalid in this context because you are supposed to only be returning one response. And in this case, we will actually give you a runtime exception. So just be very careful when you work with the API, where you could potentially make a little error like that. Just watch out for it. Now we have the servers implemented. All we need to do is to go back and implement a little server runtime to start and listen on the port to respond to the requests. Now because GRPC uses HTTP2, and HTTP2 support doesn't come into Java until Java 9. And also, GRPC comes with a server. So what that means is you don't really deploy this service into a container, like a web container. So you don't really run a GRPC server in Tomcat or Jetty, for that matter. What you do is to just run the Java Java files directly. So you need to implement potentially your own main methods, and then you need to start the server yourself. And so to start the server, first of all, you need to create a new server. And to do that, you can use, guess what, a buter. Everything in GRPC uses a buter pattern. So I can say, I want a new server that lives in some port 8080, and go ahead and build it. That's really it. And I can potentially assign this to a variable. So bear with me with my recently messed up key binding. So I'm going to click on the UI instead. I'm going to introduce a variable code server. And I can add the server's implementation I just created. So I can say, new greeting service input, and that's it. So this is interesting too, because you just need to give it one implementation instance. And you can somehow create this instance with dependency injection or passing the necessary constructor parameters. You can construct this service elsewhere, and then pass it in and register it. If you have multiple services, you can just register multiple ones. Once you have the server's registers and the server built, you have to start it. And what this is going to do is to start in the background threads. And because it is in the background, if I don't do anything else, this main process, which is exit, and all the background threads, which is die all together, so we're not really running the server anymore. So what we need to do is to await termination of the server. So I'm going to block these main methods. And that should be it. Now I really took the long route to get here, because I want to show all the details of implementing a service. But once you get started, just remember, first thing you do is defining the IDL. Second thing is make sure you have the palm where you can just generate the stops. Then you implement it, which is really straightforward. And you run the server, and that takes literally a couple lines of code. Once you have this, then we can go ahead and try to do this to run it. So I'm going to run a command line queue up here. I'm going to do maybe install, execute, and in the main class, I just create it. So let's see if this works in the first try. So compiling, that is good. Executing, and this is actually working. This is actually just listening on port. I'm not clicking anything. That's why you don't see any logs. But this is just listening and waiting for connections. Great. Now the next thing we can do is to implement the client. And the client is really, really straightforward to implement. This is nothing scary. In fact, I will argue this is probably more straightforward and definitely more straightforward than Corba, potentially even as straightforward as RMI. This is really easy to implement. So let me show you how this is done. Well, first of all, we need to be able to specify a connection. We need to connect to somewhere. We need to connect to the server. To do that, we need to specify the IP and the port. And rather than having you to deal with the underlying TCP and HTTP to connections, what we wanted to do is to hide all of these complexity and give you a higher level abstraction code, a channel. So I can create a channel via, of course, a builder. I can say I need this channel to connect to localhost on port 8080, in this case. And because I am running this in development, I don't want to deal with SSL, because that could take a whole other hour or of top time to talk about using SSL in Java. I'm not going to do that, but I'm going to say context is equal to true and I'm going to build. Okay. Now looking over here, in this many channels, it can also handle load balancing for you. So if you ever needed to load balance on the client side, you can specify a load balancer factory on the client side where we can actually perform run-robin load balancing for you. But if you want to load balance your request, what you also need is you needed to know a logical name and how it maps to the actual server addresses. Because for a single service logical name, you may have two, 10, 20, 100 different IP addresses you can possibly hit. So to do that, you can specify a implementation of a name resolver. And what the name resolver needs to do is to turn that logical name into a list of IP. And I have an additional code on this. You can look it up in my GitHub where I actually will type a name resolver into say Eureka for name resolution. Okay. And you can implement your own. Once I have this channel, let me assign this to a variable. Hope channel. Once you have the channel, then you can start to consume it and you can consume from a pre-generally stop. And the stop is called greeting GRPC. And I can create a new stop that we're taking a channel. Now, again, look carefully here. This is cool. On the server side, we implement everything as sequentially, that is for performance. But it is up to the client to decide whether the client wants to block the operation or not. So the client has a choice in terms of the stop that they create. So you can create a fully asynchronous stop by calling new stop. You can create a stop that returns the future by calling the new feature stop. You can also create a blocking stop instead. So let's use the blocking stop for this example. So I'm going to create the stop. Oh, and assign this to a variable somehow by clicking on that. I'm going to call this stop. And because this is a greeting stop, what I can do is I can give it a request just like how I envisioned the original stop would look like. And I'm going to get back the response. Like, oh, there we go. There we go. So I can get back the response. And this operation will then be blocking. And I can go ahead and do a system out of the clean line and I can print out the response, okay? Now, in the request, what I can do then is to construct something just with the builder. So for example, I can set in the first name. I'm going to say I'm Ray. Set the last name, same. I can also set the age, it's a low value, but I'm just going to say I'm 18 for now. And remember all the repeated fields, we added like an array of data or a map. Well, all of those things has convenient methods you can call. So you can say add hobbies. I can say photography, for example. And I can put something into the map, put back off the trick. Live coding, definitely not good. All right, so that should be it. And this is the moment where I find out whether I can live code or not because I'm going to try to run this and we'll find out. So I have the server running here. Here I'm just going to say, maybe I'm clean. So I'm going to clean everything just to make sure I'm not cheating. Package it up. I'm going to execute the client-side code and let's see what we get back. So here we go. Ah, there we go. It actually worked the first time, which is not bad. So it connected to the server, it sent in the request vrgrpc over hdb2 binary encoded. And here's the server side. And like I said, we implemented the two streams. So you can see all the details here as well. Pretty nice, right? Now that is actually too easy because it's just request and response, right? But I really wanted to show you what that feels like. But the real power here is you can implement bi-directional streaming services, streaming services just as easily with exactly the same paradigm, okay? So to demonstrate, I'm going to do this fairly quickly in the next 10 minutes or so. I'm going to implement a chat server. In a chat room, a chat server, right? We can really leverage bi-directional streaming because the chat messages are coming in continuously. And whenever a new chat message appears, we need to broadcast it and send it out to all of the connected clients in a streaming fashion as well. So here is the video that I created to demonstrate this. So we have the payload chat message, which has the who sent it and what message is being sent. I created another payload just to clarify that this response is actually coming from the server. Okay, so we have two types. If you look at the definition of the service, I just add a stream to both ends and now we have a bi-directional streaming service, okay? And if you look closely on the top, you can also import the types or messages from another proto file. You can import another IDL. And this is almost like importing a package in Java, right? You can import a package or a class from another package. And once you import it, you can actually refer and nest those types as if it's your own and you can use these types to specify typesave attributes as well, okay? And this is going to generate a stuff for me that I can implement, okay? So this is the server type stop. And if you look at this stop carefully, this is all generated for me, right? I added a few code here, but here's the trick. Because it is streaming both ways, what that means is I have to deal with stream observers both ways. And we have two observers here. That means there are two streams going on, okay? And there's where you really have to pay attention, okay? The request that's coming in to the server is going to be listened on by a streamer server. And that streamer server is what the server returned because the server returns a code back implementation where it's going to be listening to request, okay? So rather than having the request in the request parameter and the response in response parameter, this is actually reversed. So the chat request parameter is actually an observer that you need to use to send data to the client, okay? So for me to implement this, I need to first of all return a new stream observer, okay? And this is what the server will be using to listen to the data coming from the client, okay? So as the new message come from the client, it's going to trigger this on next, okay? And then this is receiving data from the client. When I receive the data from the client, well, what do I need to do? I need to broadcast the message to every connected client here. And every connected client will be an instance of the response observer that they pass in from the request right here. So what I can do then is say, I can create a new chat message from the server, gotta use the builder, right? And I can set the message to the chat message that just came in. And I can assign this to a variable, so the from server message from the server. And then I can either way through all the observers that I have. So I can use a stream, I can say for each of the stream with observer, I'm gonna say oh, on next, and the message from the server and I will then send everything to the client, okay? And then you need to handle errors if the client ever giving an error, it's going to trigger the unerror callback. And I'm going to do what all the good Java developers do. When you catch an error, we do nothing, all right? Not just kidding. In this case, we can do something else. We can disconnect the client so I can remove my current connection from the list of connections from the server. And we can do exactly the same thing when the connection has been completed. And that should be it. That's all I need to do to implement the server side. So let me go ahead and run this. You wanna run this server, do a clean install, and there we go. My server should be on print running. Now, in case you're wondering what a second, he didn't implement the main class. Well, I actually implemented already and because it takes so few lines of code, it's exactly what we have done before, okay? So that's all you need to do to register service and make this service bi-directional. Okay, now the last thing I need to do is to show you this works. If I don't show you this works, this could just be an empty while loop main class, right? But I wanna show you this works. So to do that, I'm going to do a main and clean and on the client, I made this Java FX client GFX wrong. So this client does nothing right now, but it is a Java FX application, there it is. I can say Ray and hello. If I click on send, it should actually send a message to the server, to the chat room, and everybody else connected should be getting the message as well. Of course, this doesn't work right now because I haven't implemented it, okay? Whoa, so let me go back to the client and this should be fairly easy. So let's see. So in this code, I have a lot of bootstrapping codes just for Java FX, but that's okay. And then I have the channel, which I'm going to establish to connect to the server. I can do that. I'm going to create a synchronous stop in this case. So I'm gonna call new stop. And this is a fully asynchronous stop, fully reactive. So what we can say is, well, let me create code to chat service and code to chat operation. Now here is where things really need to connect because I need to pass in a stream observer here as well. And remember what this observer actually do. What is this stream? This stream is a stream of chat messages that the server sends to me, okay? So whenever a server send me a message, it's going to trigger this on next. And when I receive this message, what I want to do is to add it to the list of messages. Yeah. Wait, your screen is not being shared right now. Oh, it is not. Oh, let me try this again. Yeah, cut out just a minute ago. Yeah, I thought the Java FX thing really turned that thing off. There we go. Are we sharing? Yep, you're good. Okay, fantastic. Thank you so much. Okay, so now we're actually implementing the on next to, I want to display the message on the Java FX client. So to do that, I need to do platform.run later because I cannot touch the background thread and UI threads at the same time. So I need to do this later.  I'm going to add a new message and the message will be something like let's say string.format will be the front and the message itself, right? And what does that look like? Well, I have the chat message from the server. So it gets the message and get the front. And also I'm going to get the message payload as well. So that should just whenever a new chat message arrive it's going to trigger on next it's going to add the message to the list and that will then render in Java FX in the client side. Okay, now here if I catch an arrow I'm really gonna do nothing at this moment for now. And when the server terminates my connection I'm gonna do nothing as well. That's it. Yay. That's receiving the stream. Now I need to actually send the data in a stream as well. So what I can do is I'm going to assign this to yet another observer, okay? But this observer is really listening to by the server. So I'm gonna say this is a to server, okay? So whenever I need to send something to the server I gotta use this code back on next and I can construct the chat message like that. I can use the builder, I can build in this message. I need to set the front from the name field. Okay, I need to set message from the message field. And whenever I trigger this code back it's going to send this new chat message to the server. And I only wanna do this if when my send button is click on. So I'm gonna say if the button is click on set on action, I get an event, okay? And whenever somebody click on the button I'm going to send the data to the server just like that. And I think that should be it. This is how easily I can implement a bi-directional service and also implement a real client consuming it. So let's see if that works. So I'm gonna run Java FX again. I'm not sure this is going to crash the sharing. So let's try it. Oh, there we go. I think sharing just died. So the share died? No, still sharing, good. So there we go, there we go, you're good. Okay, good. So I should be able to say Ray and say hello and click on send and there you go. You can see that the message was returned to me, right? I can say, that worked. There you go. Okay, but that's only just one client. What I wanna do is to make sure this works with multiple clients. So I'm gonna run another GFX client here. Let's see. Okay, so hopefully I'm still sharing. Okay, you should be able to see this. I'm gonna just be, I'm gonna be my manager. His name is Greg, you gotta say, great job, Ray. All right, and there you go. And now I have bi-directional streaming with multiple clients. Yeah, why? Thank you, Greg. Yeah, there you go. And I can chat with myself as long as I want, but I'm not gonna do that, okay? So hopefully this kinda shows you how we can create the service very easily in GRPC and you can stream data now, which is not something you can easily do with the RESTful services. Now let me go back to this slide. Just one more thing I wanna talk about. There you go, streaming, yay. So we talk about that, but there's something even better. GRPC was really designed from ground up to reflect many of the use cases that Google internally have faced. And one of the biggest challenges that we had was to make sure that we respond to the client within certain deadline constraints, right? So you can actually specify a deadline. What that means is if you have like a search service of some sort, you just type in the query, you say search, well, maybe we want to restrict that to just one second. I want everything to be responded within a second, right? So I need to set a deadline. I can say the search service can respond only within a second, but the search service is going to call multiple other services in parallel, right? And some of these other children services that we call could take longer than one second. And then those services will call yet another service. So you have nested services. So in GRPC, when you set the deadline, the deadline is actually propagated through all of the service co-layers downstream. So if the search service, the top service can only take a second, and the second service took half a second, and the third one took say another half a second, then your time is almost up. And if the downstream took more than a second, this entire call will be canceled and you can listen to these cancellation events as well, right? So if you're doing parallel processing, if one of the service doesn't respond to you in time, if that's okay, then you can just respond whatever you got already to the client. You can also implement interceptors. These are like filters in the serverlet. And you can also propagate data, like a tokens or authentication tokens from one service to another via the headers, okay? So there's a lot more to this. And we can address a lot of the microservices concerns. If you're interested, definitely, definitely let me know. One of the most frequently asked question is, can you do server-side log on and seeing the answers? Yes, there are some of the things you can use to do that. And the reason that I love doing this is that I really want to see you trying out GRPC. So if you like to do that, go ahead and go to grpc.io. And you can check out my demos and code on GitHub. And most importantly, if you are able to contribute, if you have feedback, please check out GRPC.io Contribute. We love to hear your experiences and feedback and seeing your contributions as well. So thank you for your time and thanks for having me here, Diane. Cool. And that's all I have. I'm gonna stop the sharing for now and I see many chat messages. There are a couple of questions here and I'm definitely gonna watch this again on a slower speed so that I can follow some of the typing that you packed in a lot in an hour. There was an early question around what Peter asked was, so is there a un-martial effect and given each language package's data differently? And... In terms of the un-martial effect, I'm not quite clear on the nature of the question though, but the binary format is interoperable between multiple languages. And when we marshal and marshal into those languages, we make sure that it is the same in that language, right? But that means you're doing a decoding between them, just like you do from text. It's just a different type of decoding. Oh, gotcha. Yeah, so the decoding is gonna be based on the binary format, but in Polar Buffer 3, this is something that's really, really cool that they're doing, which is zero copy. So when you're decoding something, if you know the structure upfront, because we do, because we have this predefined, then potentially you can have just zero copy decoding. What that means is rather than mapping everything into a new pojo and just copy, re-copy the strings over and over again, you can just point to that byte first and there you go. But different languages will potentially behave a little bit differently. Now that being said, there's a public dashboard in terms of it actually shows you the GRPC performances across multiple languages. And that is a really nice dashboard. You can find it on grpc.il. You can see the performance differences between different languages in that case, because yes, there may be some over-heading different languages as well. Okay. So there was one other one a little bit further down. Jed was asking, are there concurrency antics to manage transaction type situations, async and stink? Transactions, I see. Yes, so you gotta be careful with concurrency. There's no doubt about it. And you handle it just like everything else. And you could probably assume that once you're in that code back, once your thing got code, it has its own thread local, its own thread. So what you wanna do is to, like if you have anything that you want to pass between services within, say the same transaction or the same code within the same server boundary, you have to use a context propagation in that case. But essentially what that hides behind the scenes is the thread locals that they store behind the scenes. Let's see. That might be all of the questions. Dun, dun, dun, dun, dun, dun, dun, dun, dun, dun, that I'm seeing. Ray, could you throw back up on the scope? There's one tag, follow up from Judd. So the tagging between GRBC and language concurrency is left to the developer. Just confirming that. The tagging is definitely left to the developer. Absolutely, yeah, definitely. In concurrency, I mean, we will, the GRPC server will manage multiple threads behind the scenes. I mean, as all developers, everyone needs to be aware of concurrency regardless, right? That makes sense. So if you could put your last screen with your how to connect with you details back up, share that. I managed to do this whole thing tethered to my iPhone without losing power and power has not come back into my house yet. So I still have 16% left on my laptop, so nothing has died. So that's a really good sign. That's really lovely for me, yeah. And I did put up, and I will, when I blog with this, the link to download the IntelliJ plugin for OpenShift and Kubernetes. So for folks who are looking to do all this and deploy directly to OpenShift and Kubernetes, there's a great way to do this. I gotta say, I love the name resolving in IntelliJ and everything there too, so great demo of their product. And might almost might make me wanna program in Java again, but doubtful as a Python program. I can appreciate it, but so thanks so much, Ray. We definitely will have you back as the doing when the next round of things and features come out in GRPC. And look forward to running into you or maybe crossing tracks in Germany as you're going over there and we're going over there for two different events, but if you can make it to the OpenShift Commons Day next Tuesday in Berlin, we'd love to have you there as well. If you can sneak out of, where's your conference, which conference are you going to? Java land, and that's closer to Frankfurt, yeah. Yeah, everything's just a train ride in Europe. Yeah, that's true. Cool. So thanks again, it was a great demo and a good way to get an overview on GRPC. So we really appreciate it and look forward to hearing more from you. Thank you. All right.


So we've got some interesting news coming out of tonight's semi-finals at Indian Wells and Iga Sviyantek telling the press that she actually has a rib injury and maybe in a little bit of doubt for Miami hoping she can play Miami, let's go have a look at what she had to say over in the press conference following her loss to Rabakina. This is what Sviyantek had to say. She was asked, can you explain maybe in a little bit of more detail what you think Alaina did well? Sviyantek replied, well I don't know if it's like honestly, I feel like it's still more me and kind of my mistakes. I'm also like not feeling 100% physically. I have a little like discomfort in my rib and we're going to consult with medical team. For sure I'm going to use these days off before Miami, so actually I have one more day. Then she was asked, on that issue, the physical issue, has that been with you for quite a few days now? What sort of discomfort is it? Did you at all think back to the Australian Open match that you played? Sviyantek replied, we were thinking about the Australian Open more like we wanted to kind of learn a lesson from that match. We were, you know, just analyzing, but mainly my coach did that. So I wanted just to kind of use his tips and improve my game, but I wasn't able to do that today. In terms of my rib, you know, we'll see because I still have to run some tests and see what's going on. I don't know yet. Then she was asked, was the injury you speak of affecting you as you played or wasn't more mentally on your mind? Sviyantek replied, it's hard to say honestly, I haven't played with a lot of injuries. It's a new situation for me for sure. Last time I played with an injury, like the only tournament I can remember is like Roland Garros 2019. So I was pretty young for sure, you know, now it's a totally different level. So I feel like going on that matches, you have to be 100% fit. There you have it, Egas Sviyantek saying that she had an injury during that match against Rabakrna, the loss against Rabakrna, of course, at the Indian Wells semifinals. And Miami, she is the defending champion, is actually happening in a week's time. It's a huge event coming up very, very shortly after what we've just witnessed in Indian Wells, one of the biggest tournaments on the calendar. And of course, this kind of brings us back to last year with Rabakrna Dahl, who also struggled with a rib problem going in to Miami after Indian Wells. He of course didn't play Miami, Egas Sviyantek of course is way younger as well. So we'll see over the next few days, but she might be in doubt to defend that title in Miami. But let me know down in the comments below, how do you think about this? Do you think this really did affect her performance? Or do you think it was mainly mental now that Rabakrna has won a few matches in a row? And like she said, maybe it was a bit of both, probably was a bit of both. Physically, she wasn't feeling great, but also mentally, she had lost to Rabakrna before pretty badly over the last couple of times they've played. But Egas Sviyantek injured Rib going to Miami as the defending champion.


Aaron, what was the biggest key to that ninth inning rally? Wow.  And then, you know, just getting Hicksey up there with, you know, some guys on base to tie it. You know, I think there's a lot of good at bats all the way around.  And then Hicksey coming up big for us, man. It was a big time. What does nine walk-off wins say about you guys? We're just never out of the game, you know, no matter the score, even if we get down early, if we have a lead and blow it, you know, it doesn't matter. You know, as long as we, you know, still got a chance to hit, you know, this team has a chance to win the ball again. You know, Boone was saying that you guys are almost the opposite of emotionally in the ninth inning. You guys stay calm when you're back against the ball. Do you agree with that? Do you think that somehow helps you guys rally? Yeah, well, you can see in everybody's faces, like, when they're in the box, like, there's no emotion. There's some emotion when Hicksey's a, you know, game-time homer in the ninth. You know, you trust some emotion there, but then it's right by right back to work.   Is this one a little more special coming against the team closest to you in the standings and the rivalry you've had with them the last few years?   You know, they're, you know, one of the best teams in the AL, a team that will definitely see it on the road, and I was kind of just lucky to pull this first one out and kind of take this momentum in tomorrow. How did the atmosphere go with the fans and the reactions that they were giving? No, that's why New York is one of the toughest places to play, you know, he's some of the best fans in the world, you know, when you're wearing pinstripes, and they can kind of get on you when you're opposing team, no matter who you are. And, you know, they're with us the whole game. Even when we got down early, you know, we tied it, then we got down again with another three-run blast. You know, they stayed with us the whole game all the way to the final play. Now that there's no games before your big day tomorrow, are you antsy, are you happy to get this over with? What's your thoughts coming in tomorrow? We'll talk after. We'll talk after. Thank you. Aaron, have you ever felt more confident with what you have this year?     What's the feeling to have a walk-off here? I mean, something you've done twice now this year? It's good.      Oh, it's amazing.  Did you see a couple of games that happened for you, and did that help you kind of, the therapy around how they were going to attack you? Uh, you know, I threw them a lot of first-page slider then some heaters and sliders again, you know. I think you went with the splitter with two strikes, so I kind of had a feeling when they had the mound of it before I went up there that they're kind of saying, hey, don't let off speed, don't give me anything close, try to make them chase, and, you know, luckily I was able to spit on some close pitches and, you know, thankfully got one 3-0 then I could handle it.


Welcome back to the treehouse everyone. We're gonna give it a dangle today where we got a kitchen cook planned and we're going after Summer crappies. I've got a technique that I want to deploy You guys have seen the fish cakes on this channel And if you haven't kept up with all the kitchen cooks here You can watch the series of them and we'll see if it's the fish that makes the difference or the technique that makes the difference Let's go check up on the chickens. It's been a while since you guys have seen the chicks Got some treats little veggies You guys get after it So this was mama mama hen right here. She is no longer mama hen Literally yesterday. She said nope. I've had enough. They are on their own. They're their own little group now and everybody is Sleeping on the roost so they were sleeping in the house Now they're sleeping on the roost and they have integrated into the flock successfully We've had some pecking had a couple of You know a couple of little injuries, but nothing major pretty much fully feathered I'm just waiting to see some of those little rooster characteristics a lot of times the hens the hen pullets they'll have Nice uniform tails their feathers will be a little straighter their combs are not as pronounced But this guy back here rooster Sort little squatty tail feathers little disheveled That one right there I think is a hen That one I'm not sure of this one. I'm not sure of got a pretty Pretty tall little comb working right there Colonel Sanders. He's being very patient been a good rooster to the the young flock so far So soon as he's a little rooster start developing they start fighting I'm sure he will throw down Okay Enjoy boys and girls Have fun be good. I will be back with the crappies Today is one of those days where you kind of want to get your fishing in before two or three o'clock Where the pleasure boaters really come out? It's 11 right now See if we can get it done Unwraps polls from canadia See if everything's still connected here We got a grub on right now Probably gonna change that. All right, we may have to make an emergency trip back to the truck Since that is my only dangle dart Absolute dead sticking that bump and bug He'll measure He will measure Pretty sure Oh, yeah, you got to make this bump bug last y'all cropping on my nose Barely hooked Don't know if he's gonna qualify Don't know if he's cake qualified He's ten inches he qualifies. Oh, yeah, definitely. It's 11 Croppy cake qualified sir. You were going in and I just saw a white bass school Coming to view as well. All right a few more come on eat that goodness. It's a good one It's almost like you just have to let it sit there It'll let the waves just kind of Lightly bounce it. There's a white bass school coming up Right in those crappie though. They're sitting in the very deepest spot of the pile Godly they're just putting their little lips on it Not really eating it Number three boys. Let's go Barely in the nose barely fell to meet it Just fell out crappie mouth Let's put them in here.  That is a good one We're scratching it out with one bait now if you're gonna dead stick crappie baits There's two that I recommend that we make and that is the dangle dart and this one the bumping bug I would really prefer the dangle dart in this situation when they are just glued You got to get right over top of them. They're not doing the swing You know when I first started out today I was like 15 feet away and I was swinging it through and I had a couple chase it then they go back to the pile They're just in that summer doldrum. So Having something like this with no moving appendages or barely moving You know this bandito bug just the tails kind of split and go up and down, but it's not a it's not like a curly tail It's not a paddle tail. It's not moving a lot of water That's what they want this time of year. So the dangle dart does nothing and that's really the best I would say for deep summer hot summer crappies, but eight ounce head and And that little bump and bug just in the electric chicken That's the only one I have and I picked it up off the floor of the boat So if you're just catching crappie you shouldn't get you should get a lot of mileage out of all the baits that you use You can catch a lot on just one individual bait when you get into like the bluegill and white bass and large mouth That have teeth. That's when you'll start tearing up baits, but crappie you can go a long ways tried the hair jig and Tried dead sticking it a little bit. They'd come up to it, but they really need it. They really just want that plastic That's the deal Unfortunately when I was packing for canadia, I just left I took a bunch of crappie baits and then I just I left him left him in the garage Not good. So All right, let's try the dead stick a few more And see if we can pull them up. There's really nothing to this technique though.  That was the first one that really thumped it hard. I like that Try to get a couple more bumps More drop and I think it's just time to move. These are mega stagnants Still catchable Man, they are tough There's a good one just nosed on it. God popped it They are barely getting it. That was kind of weird. You hit it on the weight way up kind of a reaction That should get us where we want to be for catching good tonight All right, a little white bass wrangle to finish this thing off get a couple of extras extras for the pot. There we go Super dealing with We'll measure but we will try to get a bigger one. Oh my gosh, they're down there They're down there these fish are just right on the edge of a hump coming into my my strike zone As we speak Big wide coming in Incoming Hooked up feels a little better Oh, yeah, there's your keeper and holding the bacon now We delivered We delivered on crappie went above and beyond with some extra white bass I still cannot find My crappie baits. I'm gonna feel really dumb. They're in the boat right now.  This kind of got this confused me. They fell off Sort of hiding it. They were literally right Okay Also, just want to give a big thank you to everyone that has gotten the crappie baits I really feel like we have some amazing crappie baits and uh working on more stuff right now But bump and bug two-inch bump and bug. That's that was the big player today It's all I had if I would have had dangle darts. I think that would have been even better But bump and bug dangle dart this time of year. Gotta have it Gotta have it. So appreciate you guys support on on the crappie stuff. We've we've actually sold through a ton Uh more more than I thought we would so I know crappie fishing is getting popular And it's it's so fun. I enjoy it. They're tasty obviously But if you want some really high quality crappie baits, you know where to go You know what's how it is ah Y'all love catching them But hanging around the house cleaning them I love doing that too eating them of course is going to be even better We're going to head up to the kitchen with osg here in a minute We're going to get started on the process of chunking these up Instead of doing kind of the blend been doing a blend Like using a food processor. So we're going to use a different strategy today. So If you guys don't have a full-blown cleaning station, which I strive to have one day in the future Uh, this is what I use. It's a food grade cutting board. I got it off amazon I got it really for processing deer because it takes up a lot of space But it works great for fish too and I got these little These little buckets right here. I live close to the lake. So I always dump my My disregards back into the lake let the catfish eat them and stuff And just continue the life process and I want to try that That little zipper trick that I learned Up the north of walleye Get that bloodline out Let's just try that real quick Just going to go from the tail end Just try this We're chunking these up anyways, so We'll take that little piece to chunk it in Zips that little red spot right out of there. Ooh, I like that trick Okay, that's a good one Well, bam Here you go So the next step in this process is to cube these up So what I'm doing right now is I'm just slicing these kind of in thirds Just depending on the fish and then I'm cubing it. This is different than the other method I use with the food processor Literally making it dice size So just depending on the fish cutting into thirds or seconds And then slicing from there and making those dice size little bits And that is what is going to go into our fish cakes in the kitchen OSG There we go and Ben My little cameraman right here Trying to get daddy's cold beer I see. Uh-uh not yet Say hi Say hi Yeah Not yet All right, so osg has has crushed up. Is that ritz crackers? No, this is a different cracker. So y'all I can't have gluten So we're gonna do it my way gluten free and then we'll do it your way But I don't know if you want to use it like the bag method. It's really easy. You don't have to bring it I like it. I like a machine. It works really good I just get a bag roll it crush it So this is like a rosemary salt sea salt cracker We've got ritz over here. We'll do the same thing Going to two different batches. So we've done like basically the puree method. We've gone overboard We've done paste So I've hand chopped these Dice size basically there's a couple that are you know, maybe bigger than dice, but Well, that's bigger than grab me, but I'll try it. I'll give it a go. Okay. Okay. Well, you know, we can perfect it There's a couple that probably need to be cut like one more time possibly But look at that delicious crappie meat right there And I also zippered out the uh, most of the red stuff in there which Usually has like Little bit of rib bones as well like just remnants of rib bones using the electric filet knife So most of this is going to be just delectable pure pure meat We haven't used the air fryer in a while. I thought Maybe just try it with some avocado oil You know, it uses a lot less oil I'm starting to like I'm starting to think that some of these vegetable oils and condensed seed oils may not be the best They're not good for you. They're not good for you. Okay. Yeah. So, you know as much as I hate that because the gold crispies are so amazing We're trying to find ways to uh, you know, not not get the old cancer. All right Here's how we do this osg. She is going to shallow pan fry hers in the gluten-free Uh, crumblings I'm going to use that classic grizz And I might do like a butter avocado oil mixture on mine and I'm going to pop it in the air fryer So we're going to see which method is better. This is good experimentation. You guys can Come along and be the judge figure this out. So there goes the ritz Smashing them up rolling them. Yeah, we'll say the ritz crushes a whole lot easier And in here we're going to put mayonnaise green onion Uh, some old bay a little bit of pepper spice or whatever and then we got poppers in the little Little toaster. They're rolling in the mayonnaise right now because she says a little goes a long way I wish I could remember the exact recipe when we did the walleye, but I was uh Let's just say a few beers eating Salt pepper oregano and I'm going to do old bay No occasion. All right. All right. All right But instead of mayonnaise. I'm going to use this garlic everything sauce Haven't done it before pretty good call All right. This is going to require some messy hands, but I just clean my hands go nowhere with your hands just found a scale Pretty pretty good move getting that out there pop me some panko in there You want that cheese, buddy? Here you go. All right That's yes. Nope. Get off of that. Are you starting something? No, no Well, I know it's good. I need it. I need it going anyway All right. You guys see the the texture chunky. This is chunky The idea with this method is You're really focusing on the fish on the other stall I think you can get a like when you're basically semi-puree the fish You could probably make gar and it would taste good. Not buffalo carp, but you could do gar So out of this I'm getting three balls The idea is like one of these balls can can feed someone Good job, bud So this is what I came up with osg rolling with the oil with the skillets I'm going to do a very like light pan fry. Oh, what do you got here? You got butter and one This is for the spinach. I'm doing just a light spinach But I'm doing an olive oil like cooking high heat olive oil. Okay. I'm going to dunk mine I'm going to douse mine in some you want me to avocado oil. Okay, 100% Spray me up spray me up. Yeah There we go Okay, okay, you want to flip flip them. Okay, but how long is this going to take to cook because yours are pretty thick I don't know. This is experiment. Okay. Here's mine. I made mine a little smaller I'm honestly the texture kind of reminds me of like cereal, but they're smaller It doesn't smaller than yours Osg pulling off for final product. I did, you know, it almost looks like I put like corn flakes in there because the texture is Pretty crunchy looking. All right, mom. We're big. So I'm still I'm still going I kind of want to check Oh, man, those look amazing Actually look really good.  Yeah I might have okay. That looks awesome two more minutes We're going to roll with that looks good Osg's look pretty good too. She goes not got a nice browning on them sever Let them rest just in the hot little hot pocket there Like we did something Like we did something today. It's hot. Yeah, it's hot I saw a lot of you guys really like the cakes that we made previously tried the recipe. You liked it So This one's good Definitely want to give this one a shot what I'm telling you when I was up in Canada. We tried this with walleye. It was Fantastic can't be a walleye, but they were deep fried so Airfryer totally different, but let's see what osg is all about very flaky. Oh, you did good. I mean, it's cooked well Is it it's cooked well for sure Inside yeah, um It looks still a little. Oh, no feels it feels cooked. It feels cooked. Yeah, it doesn't feel like rubbery or anything like that Oh great taste great taste Because I usually roast Mary How do you feel about the texture? Texture is a big deal. I can't really complain because this is all I can eat I think you did good Those are really good the crackers are not the best but The fish is fantastic I think you're seizing it perfectly. I think I would use the food processor for a gluten-free cracker I like the big chunks Look who's ready Coming out of the warmer Coming out of the bullpen Wow, bam Wow, come on now Come on now.  It looks like a giant, uh, coconut shrimp Giant coconut shrimp Okay, I think that was that was actually 13 minutes in the air fryer at 400 How we doing on the inside? Oh gosh, it looks good It does look like coconut shrimp It looks cooked perfectly quite honestly. So this is the mix of ritz crackers and panko White bass and Croppy in there. Oh, hang on a minute. This might be the jam These green onions in here Oh mixed in I'm digging the whole the whole shebang here. Wow yours. I will say I'm very impressed I really want to try some of yours. Try mine. I'm not going to Just a nibble. All right, this is osg's Now with the gluten-free you're gonna get a little sandier crustier She cooked them perfectly. I would just I would take off points for that gluten-free I don't know how to help that though. It just doesn't cook up as well It just doesn't I mean yours puffed up. I love. I love how yours puffed. Mine was just flat And I will say I love your gluten-free desserts. Like I prefer it actually brownies cookies Muffins, they're fantastic and incredible Put on this right here. No gluten allowed Wow, I think I put a little too much panko in here Probably should have stopped at the After the first dunk some people like a lot of bread I want to focus on the fish mostly that chunky size is good Um, you're actually you're seeing the fish when it breaks apart you get that nice classic Break into a you know a pure white flaky fish look to it and texture This is the deal I would I prefer the cubed Over the blended for sure and I do taste the riches of that rich cracker in mine too So good. Oh man Well fish and freaks That was one of the best cakes I've ever had now compared to the walleye It's not going to be as as as good as the walleye. The walleye is the best. It's the best All right, it's the best thing in north america as far as fresh water goes, but The crop is a close second and mixing a couple white bass in there certainly didn't hurt things. So The the diced method I think is way better than doing the blended method So you guys play around with this, you know makes messing around with different spices Different mixtures of panko crackers whatever you prefer. I'll continue to dial this in I will say that the uh, either the panko or the breadcrumbs kind of expanded in the air fryer so what I thought was Not enough breading at first it ended up being a lot After it cooked up So just keep that in mind and I'll say this as well. I love fishing for crappie It's fun when they they get a little tough and then you figure them out exactly what they want and catch them But just eating them is incredible and as far as sustenance fishing goes It's rewarding. It's really rewarding when you put those delicious fish On a plate and you're eating them with your family. It just it just feels really good. It's very fulfilling So I recommend trying it if you don't already fish for crappie or white bass or whatever You guys can pick up some of the baits googesquad.com use my promo code save 10 on all the baits as well and the new gear We got some new gear for the july type stuff Summer type stuff that'll keep you cool out there. So keep that in mind when you're shopping at googesquad use my code Lfg and thank you guys for tuning into another outdoor adventure and I'll see you