All right, welcome everyone. Sounds like this is working. Glad to have you here at Extending Kubernetes 101. I'm Travis Nielsen. I'm a developer for Quantum Corporation working on the Rook project. I've been working with custom resources in Kubernetes for about the past year while working on Rook. So I'll tell you something about my journey along the way. And then we'll walk through some examples here about getting started, all right? So first of all, this is really the first talk after a great keynote this morning by Yen on extensibility, what you can do with it in Kubernetes. So I encourage you to look at these other talks today. If you didn't learn what you need to from this presentation, there's lots of other opportunity today. So a lot of great talks that I hope to go to as well. So agenda, since this is a 101 course, I wanted to start off by, well, why would you want to extend Kubernetes? And then how would it happen? What are the patterns surrounding Kubernetes? And then let's just get right into the code. That's what I do for my day job, I write code, and so that's why I wanna work through my slides pretty quickly so we can get to that demo. At the end, if we have a couple minutes for Q&A, I'll look forward to your questions. First of all, the most important pattern and I believe Kubernetes has gotten right and why it's successful is because resources are declarative. If you want to create something, you say, I'm going to just declare it, there's no code required, you define your manifest in YAML usually, and Kubernetes will go create it for you. For example, you wanna create a namespace, you say, I'm gonna create a namespace, it's kind is this, and its name is this. Simple, you can't get much simpler than that. Any kind of resource you want to create in Kubernetes you can do with a declaration. Another example, a pod, a pod is the most basic resource that allows you to run code in Kubernetes, any application you want. So I say, I've got a pod, here's my container, and here's the image you want to run. In this case, my hello world 1.0 container, and boom, you have a container. Kubernetes goes and starts it for you. So then you start to ask the question, well what happens if I want to run my own type of thing? What do I do? Well, I can create a pod that goes and runs my application, but what if I want to declare my own type of resource? What do I do? Well, Kubernetes team has done a great job of making this very natural and a very integrated thing. So they have this concept called custom resources, CRDs, which you can define and will follow exactly the same pattern as in Kubernetes. Last year as I was working with custom resources, known as third party resources at the time, I felt like I had this light come on like, oh, that's what they're for. I can define my own types and I can go write code that backs it up, but fundamentally I get resources in Kubernetes that are my type that anybody else can use and they're treated the same as any other type or resource in Kubernetes. Yeah, big light that came on for me. So there are lots of, it's a pretty new concept as far as how plugging into Kubernetes. And last year at KubeCon, a couple of examples were announced. The XED operator was one of those. And that's the first example that I found for custom resources, so I just thought I'd start there. What does that look like and why did they create it? So I went to their GitHub page and extracted an example of their CRD. So just some things to point out from this example, you see, okay, they've defined an API version that, whoops, it's just, it's their own. They define, okay, they're from coros.com. They define their version, v1, beta two. They've got their own kind, it's an XED cluster. But when you create this thing now, me as the user, I get to decide, well, what's my XED cluster called? I give it a name. And these other properties in here are very specific to the XED cluster. You want three of their XED servers. And here's what version, and now their XED operator is going to go orchestrate the XED cluster for you. You declare it and then they go make it happen. And as a consumer of an XED cluster, you say, wow, this is great. It's all integrated in Kubernetes in a way that I would expect. Another example, Prometheus follows the same pattern. They have a Prometheus operator that goes and applies these things. I kind of truncated it, ran out of some room here. But again, everything down here in the spec section, the bottom half of the Yaml there, that's all something that the Prometheus team decided, hey, we need these properties. We'll specify them. Our operator will go act on them, but you, the user, don't have to write any code. It's just a simple declaration. On the Rook team, again, same pattern. We define our own type. We have a cluster and our own properties, which I won't get into today so we can get into the sample. But really, that's the point. We have properties, you define them, you declare them, and then the code behind it worries all about it and treats them as Kubernetes resources for you. So as an example, where we were with Rook as we are working on this distributed data platform, it's a hard problem to solve. And we realized, well, we need deployment in a way that Kubernetes didn't quite satisfy. We need monitoring. We need to monitor our cluster to make sure your data is safe. We need failover that needs to happen a certain way. We need upgrade. When you have data that needs to be upgraded, the data path, Kubernetes just doesn't know anything about those details. So this, we were able to answer all these questions by using the custom resource patterns and then operator to back that up. So traditional approach, and actually where I started was, oh, well, how would I do this? Well, I'll just start a pod. It'll run my service. I'll implement it as a REST API. So create my REST API, great. Now I have a service endpoint where whoever needs to configure my service, they can connect to that and they can call my REST endpoints and okay, they can manage it. But then it starts to think, wait a minute, it's not integrated with the Kubernetes API or kubectl. How would they create my resource? Well, they have to go to the REST endpoint and that's just not a native Kubernetes way of doing it.  Well, what if I want to secure my REST API? Well, now I have to go, I have to set up certificates to get an HTTPS endpoint. Why can't I just use RBAC security and do it the Kubernetes way? So the traditional approach for us, at least, it wasn't a good fit. We wanted to manage Kubernetes resources and this just didn't cut it for us. So instead of the traditional approach, the extension approach, where Kubernetes just makes it natural. So they're designed from the ground up to say, hey, this is part of Kubernetes. They're built, it looks like, feels like, smells like built-in resources. Again, CRDs use a declarative state and what that means is that if I have a YAML file, I can say kubectl create my cluster.yaml and boom, it'll be created. If I want to change the specification, the properties that are in that YAML file, I can, well, I can do it with kubectl edit or however I edit my YAML files. When I'm done, I can delete the thing and I can use the name, the proper name of my object. I can say delete my cluster and it'll be gone. So it's simple, right? But the power in this is that it's, your custom resources can be consistent across all of Kubernetes. If you want to be taken seriously, be consistent. So that means all the tools, whether it's kubectl or Helm, whether it's the ClientGo API, whether it's security and any other endless number of tools in Kubernetes. It's going to be consistent with how that works. So again, we've already talked about this, basically it's declarative and behind each of these resources, there's a controller in Kubernetes. The controller is what makes it happen and Yen this morning talked about this. She had a much, much prettier picture than me. But basically the controller sits there and it observes for what you want to happen or waits for you to declare your manifest files. The controller will see when you create it, it will analyze, oh, what do you wanna change in your cluster and then it will go ahead and act and apply changes in the cluster.  All right, so that's the basic Kubernetes pattern that then we'll go through for custom resources. So I wanna walk through what does it take to write code and get a sample operator and custom resource running. The first thing we're going to do is so define, you need to design your thing. What properties do you want in your custom resource? Second, you think, well, how can clients consume my resource? With the, I live in Goleng land, I want clients to be able to use the Client Go API and use strongly typed API to say get or list or delete my objects all with that. So there in Kubernetes 1.8, actually, the Kubernetes team created this tool that will generate code for your CRDs so that you will have strongly typed resources. So I'll get to that in a minute to show you what that takes and what that looks like so that you, yeah, generated code, it's wonderful. It makes it feel again like Kubernetes and the Kubernetes types inside, the built-in types use these same code generators as I understand. So the third step after you've defined and generated some code, depending on how you want to act or what changes you want to make in your cluster with your resources, you will need to develop your custom controller or also known as an operator. So we, there's three basic steps to implement. You need to first register the CRD with Kubernetes so that it knows that this controller will be watching and applying these changes. You need to implement three simple methods for add, update, and delete, and then you start watching the CRD. Tell Kubernetes, hey, I'm ready to be notified when there's a change here, when you create, update, or delete anything. All right, when you're done writing code, of course, you need to build it. And that means, in my case, build a Go binary. As shown this morning in the keynote, you can also do it in other languages. My demo will all be about the Go lang implementation. But so you build your binary, you create a Docker container with it, and then we'll need to run that. So once you've built it, what comes next at runtime? First of all, since it is a pod that you will need to run a controller, though we will define its manifest, it will have some RBAC rules that say, hey, I need to access Kubernetes resources, depending on what your operator is going to do, if it's going to be creating other namespaces or pods or replicates, it just needs to declare that. So Kubernetes will allow the operator to do that. Roll bindings define the basic manifest. Second, go ahead and run the operator. It's a simple kubectl create command. No new pattern there.  All right, so let's jump right into what all this code looks like. We'll exit the slides and get to the fun part. All right, dismiss, all right. Is that big enough? All good. All right, we have our sample manifest for the simplest hello world CRD that I could come up with. So you get, you see all the properties here that you get to define. So this is myproject.io, that's my project name. I can declare what version, this is the very first thing. So we call it alpha. I'm going to call it sample.  And then the name of this instance I want to create in my sample. And then the interesting part though is when you get down to the spec. So in the spec, we get to define any properties here that we want to consume in our CRD. Hello world. All right, let's change this a little bit to make it a little more interesting. I don't want to say hello world, let's say hello kubicon, we're here. And we'll always still need a world property. So our world is Austin for the day. All right, so we've defined a simple YAML file. But in this spec, you can have any sort of structures, complex structures, lists of things. This is completely flexible as far as what you can do. If you can do it with a YAML file, you should be able to put it in the spec. So now that we have our spec, we need to get into the land of code. So I'm going to switch over to Golang and see how this translates into go code. Oops. All right, so I'm going to switch over. And by the way, all this code that I'm walking through, you can find on our GitHub and I'll have a link to it later for the sample resource. So we go up to types.go. So types.go, now you see the sample spec here. These are all the properties on the go side that I need to read from the YAML file. Okay, so we had hello. Now I changed it from the original sample. So if I want to deserialize that world property that I added, now I have to add world and it's going to be a type string. And if I want to deserialize it, it's called world in the YAML. And if I put the quotes all correctly, there we go. All right, so we have our two properties hello in world. Oops. And that's all I need to get them into the land of go. Now there's some other things surrounding this that will be used that you need to declare. So for the code generation as well. So let's look at that now. So the spec is contained by our sample type. So this sample is the same name as what we saw at the top of our CRD YAML file. So the sample has to define a couple of standard properties, the type meta and object meta. That's what brings us in the name and namespace properties and some other things. And then of course the spec is what contains our hello world properties. Above the sample, these gen client and deep copy attributes are what we need to add to our sample struct so that we can run the code generation tools to generate the strongly typed objects for people to consume from the client go client. All right, so that's pretty much it. Down here there is a sample list. CRDs, another pattern with them is that you can create any number of them so that you can list them. We have a simple list type with some items in them. And again, for code generation, you need to be able to deep copy them. And that's pretty much it. We have our types defined with the code generation attributes. So what's next? For code generation purposes, there's this doc.go which says what our group name is. That might be kind of hard to see in the gray there but it's called, so my project for generating the package name and things. But one line of code, simple. If we didn't have these copyrights at the top, it'd be a lot shorter. Now let's see, in this file we have about 60 lines of code. So a little bit more just to show what it takes to register. So we've defined our CRD. Now what does it take to register our type? Now in this library that we've got, a simple library that lets you define custom resources and register them, it takes all these properties that you saw in the YAML file will be defined here. And so its name is sample. When you have multiple of them, you're listing them, you need the plural name, samples. Our group name, myproject.io, our version, alpha, yep. So those are all the properties that we need for our custom resource. So the operator kit now will register those for us. I don't have time really to dig in and there's just kind of some framework around here, these other few lines of code that you can go refer to on the GitHub later. But basically, we register these two types, sample and sample list. And Kubernetes will, away we go. Now in our sample project here, we have two other Go files. So after those simple ones. So we've got main.go, we'll just start from the top. Main.go is going to create a context first of all. So the sample client set is what was generated by our code generator. Okay, if I look down here, this code for sample client, new for config, this was generated by the code generator. And I'll go generate that code actually in a minute after we see the basic code that we had to write to get this going. So after the context, we go ahead and ask our operator kit to create custom resources. So this takes our sample resource and registers it and tells Kubernetes, hey, I'm listening for this object. And now some basic things to watch for signals in the pod to manage the pod lifecycle. But then the important part is, okay, let's watch for, watch for the custom resource. So this, if I jump into this and you see, I'm gonna watch all namespaces for our new resource. So when I tell Kubernetes I wanna start watching, while we say, I've got some handler functions, I've got an add method, I've got an update, I've got a delete, okay. So here, they'll be below here implemented. I've got a strong REST client, I'm going to, this is the one that was generated and I'm going to watch this resource. So I tell go, okay, I'm ready to watch this, watch my sample. Now to make it as simple hello world application, when I add the resource, I'm gonna call this helper deep copy. And all I'm gonna do, it can't get much simpler than just printing to the console or printing to a log file, okay. So I add the sample with hello equals whatever. So it's just a simple go formatted string. Since I added the world property, I'll go ahead and add world equals percent s and that will print the value of what's in the world. With the go formatting, I also need to say, oh yeah, give me the spec and the world. And the code completion finds that, okay. So add will basically just print the values of what I just added. Now in a real operator, I would want to go make some change in the cluster. I would want to go start some pods, start, create whatever Kubernetes resources I need to create. Now update is just gonna be something similar. It's going to update from some old to some new value and delete, again, we'll just print the message. Very simple basic thing to get us going. All right, so let's go actually get this running. So I'm gonna go to the command line and sorry, before I go there, we need to generate the code. So to generate the code, there's a code generator in kubernetes.io repo where it's going to take the parameter, tell me the package name that I want to generate. So I'm gonna generate my strongly typed client resources in this client package. I'm gonna generate some deep copy methods into this APIs package. And that's where it finds the types that I've defined. And I want it to be a type V1 alpha one. Okay, so let's run this. So code gen will run pretty quickly. Generate the deep copy functions, the client sets, the listers, the informers. And now we have generated code. If I go look at my project again, we've got a few new files highlighted in green here. Let's see if I expand this a little bit. You see this deep copy.go, all generated. And the client set that's generated, if I just glance quickly into some of these files, you'll see we've got a sample.go and it has all these generated this interface and the implementation for them so that I can create, update, delete, get, list, watch, all of the standard kubernetes calls that I need to work with the resources. So we have generated code, a piece of cake, right? The next thing I need to do is take my go code and compile it. So let me go make sure I get the right command here. Now, if I didn't make any typos, this should complete in just a few seconds and I'll have my go binary. Okay, and after we're done building this, I'll just give that a minute. I'll come back here. We need to build the Docker container. So in the sample here, we go look at the Docker file. This is about as simple a Docker file as you can get. I'm just gonna say from scratch, add my new go binary to the local bin path. And then when this Docker container is launched, it's gonna simply launch my sample operator. Let's go see if this is done. Okay, the go build succeeded. Now I need to run the Docker build command, which I'll get over here. All right, Docker build. I have my container now, version 0.1. And I'm going to, now I need to get it into my cluster. I didn't publish it anywhere, so I need to copy it into my Minicube environment. So I take my container, put it in Minicube, which I have running locally. I didn't want to trust the network here at the conference. Now I have my container there. So just to make sure I'm running, okay, my Minicube is running. I have one node and now I'm ready to roll. In my, the first thing I need to do now is run the operator container that I just loaded. If I go back and look at the operator YAML, don't have time to look at this really, but the operator YAML defines my RBAC settings. The resources need to get list, watch, create. Since I'm watching those, I have to request that privilege. Got cluster role bindings, service account. This just makes it all work when I run the operator. But at the end of the day, I'm going to run a container, which says run my sample operator version O.1. So let's go ahead and do that. So if I create a kubectl create sample operator, it created my cluster role, my service account, my cluster role binding, my deployment. Let's run it, it's running. Now if I say get pods, just to make sure the operator started, good. So my pod is running, and what it's doing at this point, it's registered my CRD, and it's watching for me to create one. So if I look at my CRD, I've got this sample resource YAML. So again, my sample resource is going to create my sample with hello kubectl and world Austin. So let's go ahead and create that. kubectl create sample resource, create. Kubernetes says it's created. Now let's see if Kubernetes is what it did with it. So if I say kubectl get samples, so my type is called samples, and I'm going to say, what samples do I have? So it calls the list method. It says, oh, you've got my sample. Let's look inside the YAML to make sure it's got everything I wanted, and typo get samples, my sample, yes. There we go. So inside the YAML, here we've got hello kubectl, world Austin, great. Now we still don't really know if the controller responded to it, and if you remember the controller was simply going to print to the log. So let's look at that log now. So got all logs and I put a label on it so we could find it sample operator. So the log says, yes, added sample, my sample with hello equals kubectl and world equals Austin. All right, it worked. And then you can do other things like edit. Let's see, we'll try one more command here. If I edit samples, my sample, now we can go in, we can say hello kubectl 2017. And my world is only gonna be Austin for a couple more days and then I'm gonna go back home to Seattle. So let's say I wanna change to Seattle, all right? Oops, I missed something. VI is not my editor of choice. Oh no, it says it didn't edit it. Okay, let's try again. Well, you get the idea. I'll just change this one. All right, you get the idea. We'll keep the typo. All right, it saved it. And now if I look at the log again, it would say, oh, I changed from kubectl Austin to kubectl Seattle. And there we go, we have our custom resource. And if I did the same thing, I could go ahead and delete samples. By the way, you can fully qualify it if something else has a name like that, samples.myproject.io, my sample, and it would go ahead and delete and the operator would then print to the log file again. So there we go, we have a running sample operator that we created from scratch with the code generation and everything. And if I had more time, I would have spent more time on the client to see, well, what are those strongly types look like? Well, we would see that they look exactly like other Kubernetes resources. Okay, so we just got a couple minutes left to go back to the slides here. We went through the demo already. So takeaways, really CRDs make Kubernetes extensible. They follow all the same patterns that you'll find with other resources. CRDs really have a low overhead. Most of your time once you get set up is going to be inside your business logic, whatever you need to do when your resources are created. Since I work for the Rook team, if you wanna see a bigger example where CRDs are implemented, Rook defines five CRDs. Actually, we've got cluster, pool, object, file, volume, attachment. All of these are, anyway, fully implemented. You can go look for more examples there. Rook, by the way, it's, so it's file, object, and block storage for Kubernetes built on Ceph. We've submitted to CNCF and we're excited about getting that reviewed there. So thanks for your support there. Take a look at it. And I'll be in the Rook booth today, if you have any questions. Here's the links to the projects, the operator kit at CD, Prometheus, Rook. And there's lots of other examples out there. And it's starting to roll. If you search for operators on GitHub, you'll probably find a number of them. It's a community that's just growing more rapidly all the time. So if you have any questions, here's my contact information. If you want to talk to the experts, they're on the Kubernetes Slack at SIG API machinery, the creators of the custom resources. And again, here's the Rook site. So that's it. Let me know if you have any questions.


Okay, so let's balance another nuclear reaction equation. So first off, can anybody tell me what type of nuclear reaction we're having here? If I look at this here, this is a vision reaction again, right? Why? Because we've got a small particle expansion into a large nucleus, okay? So again, we're going to have to add up both sides to get the same masses and the same number of protons. So on this side, of course, we've got 236 mass total and 92 proton total. So this 2 here, that refers to 2 neutrons, okay? So if it helps you out to erase that and maybe put another neutron over here, that's totally fine to do, okay? So let's add what we got up, 1, 2 plus 137, that's 139, and 0, 0 plus 52 equals 52, okay? So that's what we have so far. So we need 92, so this is going to be 40, right? So if we look up at the periodic table from there, we look, it's 40, 40 is zirconium. So 136 minus 139 is going to be, what, 97, is that right? Okay, 97, so it's going to be zirconium 97. Is everybody okay with doing something like that? More involved problem? Notice when those coefficients are there in front of any of the particles, you can make two of them if it helps you out or whatever.


My name is Sergeant Christopher Chavis. I'm a combat engineer attached to 1A HAC. Today we're going to be training on urban breach in and Bangalore's cross training with infantry and the German Army. So we're attached to infantry because they need us for their missions to blow up obstacles for so they can assault through and finish the mission. That training is important to get our soldiers hand on with more demo and also to train the infantry on what we use and how we use it. I'm Sergeant Colin Davidson. I'm a horizontal construction engineer and I'm from Orlando, Florida. Today the Germans were able to come out and kind of see how we operate and how we build our charges and then we'll be able to see how they do there so we can kind of piggyback off each other and get different ideas. It's important so we can increase our impacts throughout the battalion. Fire in the hole! Fire in the hole! Fire in the hole!


Ninja Killer was up 2-0. Yeah, that was almost a reverse 3-0. Yeah, Dragon almost reversed it. Almost. And that same conversation I had with Dragon said that, you know, felt really good with the adjustments that he made on the fly in that matchup, you know, picking up on what Ninja Killer was bringing to the table and adapting. So we'll see if that comes into play here. The adaptation got to need it here against a tricky character in Ace of Nades Joker. As many times as you play against somebody, in casuals, in tournament, there's always more adaptation to be made. It's like stacking the deck. All existence adheres to Kronika's design. Not once I start shuffling the car. Okay. Is this scripted because Sonic has a deck of cards on them? That's true, actually. And he's been doing magic tricks all weekend long. Yeah, you're right. So for Joker, you know, I think many of us think he's a very strong character. But maybe dealing with his owners is the only thing I've seen people say is difficult for him. Yeah. And this is a match where that's largely what this is going to be about. So I'm really curious to see how Fox deals with that. Right? Great movement speed as you can see. Does have options like this that will move full screen. It has a really good forward dash to get aggressive with. And just needs to hit, I think, is also an ascending to find here against the force of nature that is Sentryon. This is a force of nature, Sentryon. I know A force of nature. A force of nature, Sentryon. Happens to be the name of another variation. A little bit slow on some of these staggers here. Lots of safety. Beautiful. Keep up. And that's why they're okay. Finds it was. What the single hit taken from? Yeah. Yeah, it's pretty good. I mean, it was pretty good. Yeah, attention. Oh, this is the death. So much damage. What are the best of this game? They did such a good job. What are the best mid game taunts right there? About the poor gasoline on himself? Right. That is petty. Look at his suit. It was all nice and white and clean. Okay. So earlier, I thought that those were flower patterns. Oh, no. When I looked up at the screen and it turns out it's not. No, it's not exactly flower patterns. It comes into the question blow on this. This is Mortal Kombat. There will be blood. Putting up a wall. Back to the wall just like that though. You see, you know what's there. My back's to the wall, but here's one for yourself. That question blows, Sonic. Oh, little lucky. The crowbar coming into play swinging that over their head and saved by the Jack in the box and go for the chip up. That was going to be huge that I'd hit. Look at this. Sonic Fox trying to chase back in, dragging nose and still being tricky with the movement. Oh, send it in from the sky. And that huge range down four on three. There's only the amplified version that comes back down. You know, the regular version just goes up as an anti air. And as a combo extension in the corner, but you can throw that up in the, what's crazy about that is that you can amplify it, throw it up to the sky. And you don't know where it's coming down. It's a little tricky to, you know, make a read and go forward, but they did the close one and get bopped or make a read that they did the close one and stay mid and then they did the big one. A lot of cool stuff you can do off of that. Fresh from the dry cleaners, the suit's back. So tricky. And that just fits the Joker profile. Yeah, it's awesome. Oh, a little bit of a whiff. And then Dragon didn't believe. You know, interesting that Dragon is really not doing that much of the type of zoning. I think the movement that Joker can bring to bear is just solving that. And maybe looking out for those amplified Jack, Jack in the Boxes, you know, goes for the jump back, goes for a Hell's Wrath and the trade is going to be in Joker's favor to close the gap. Hell, well, right back into things and right there for a media as well. Really good. Grab that. That's just a win win win. You know, maximize your damage. Load the crushing blow and you have a great situation on knockdown for yourself. The sound design on that forward throw in my ears killing me each time. I think that I've run into something in real life. Those boxing gloves. Yeah. Wait till you guys see a variation three in tournament where it happens an awful, awful lot. Another crowbar. Is this loaded now? Or are we just number two or three? I don't know. We'll see. Oh, man. If I was if I was facing some box right now, I wouldn't know. I lost count myself. It's a false block. No punish. That was the pick up. That's a huge cash out 200 on the breakway. Still a lot of damage. Stay in the corner. Stay in the corner. That's a wrap. Oh, underneath. And there is no breakaway here. Has it loaded? Yeah, it was going to be chip. I mean, I was it. So we didn't get to see it versus Ninja in the winners finals, but that was everything that we were trying to build up with that pressure flow. It, you know, you want to talk about a cash out? That's a cash out. Oh, yeah, absolutely. To go from just a couple of hits into 400 plus just like that. Right. But you have to earn it. Letting three of those, as you saw, was not the easiest thing to do, especially with all these breakaways. Now, I think Dragon went to character select. Yeah. Not expecting a change in character, but spend a little bit more time here. Yeah. Try to get your focus back in here. You know, different interactables. Yeah, that's true. But Dragon here at Final Combat has, I've seen him be the most optimal with interactables, using interactables to do the most damage because set your arms normal combos. Don't do an awful lot. Yeah, comboing strings into the interactables. Which I never thought about is incredibly optimal, but really specifically for this character. I wonder if there was some design in mind behind that. Oh, wow. That's a little bit of a wrench from last game. That's right. That's right. Yeah. That one, two, a joker is having a big hitbox. Jump around over. Yeah, loads up number one. And into the gaps. Oh, that's a good sound right there. The sound design at Netherrealm Studios, I don't think can be topped. When it comes to fighting games, it is sensational. Using that is just a way to move forward in the corner here, yeah, that's safe. Can be boss even. Yeah, safety. You can really see the strength that joker has. This is not like last year where Sonic Fox is playing joker because they think it's hilarious. And beating everybody. This is actually super legit. Is this going to be match point? I think so, this. It was enough. It was definitely enough. Yeah, match point here. Makes it rain confetti. Dragging in big troubles. That's all he wanted for Sonic to set up the rematch with him to went to a game five in that winners finals. We'll be back to back three os here on the loser's side to set it up in there in time. And that means it's a crushing blow. Dragon forced to get off the bar. It's safety. Yes, and the pickup. You want to talk about stealing a turn, right? Okay. There was a single turn that was stealing a hit. There we go. So dragon really hasn't been able to zone. Maybe the pressure will work better. Yeah. Okay, go directly into it there. And this is not a fatal blow that you will find yourself being able to use very often at all with century on. And that's why dragons just going to burn it here, get a health lead, try to fight, scrap his way back to this match. Okay. Jump in with the jumping. We haven't. Again, we haven't seen that much offensive stuff out of dragon. And so really that last round and ceiling with the jumping, maybe the first jump and I've seen him like first jump kick. And I think so. They're open right back into it. He thinks to himself, okay, why wasn't I doing that before? What's so scary is, you know, one, one dash to dash and then he's in that like four or two range to play with. So fast. We had the frames on that wall. Nice movement by Sonic to get out of the normal range. Okay. Important block and the crushing blow. Dragon is making his way back here. Oh yeah. Life advantage can zone if he prefers at least for a little bit. Yeah. Space is here. Look at two dashes in range. Okay. Dragon makes a comeback. Put out the active frames was ready for the aggression at a Sonic. We got ourselves a match here when Sonic was up one round there was looking looking a little bit desperate, but you know, a little more aggressive. Just the reads working out. I think in that final round, stop the approaches of Sonic. Even trying to make a big read there. That's what you're confident yourself. You know, you're like, I would make this read, but I'm going to make the read the riskier way and with the bigger reward with the geyser rather than the hell's rat in that same situation, right? What a spacing right there by Fox. And they get the corner because of it here. Yeah, I can huge range on that down for. Oh, okay. Only happened because the wall absorbed a projectile and then sent the rocks towards the face of Joker. Yeah, got it. And does spend the crushing blood here. So forces Fox to come off the meter. Really blocked and grab. Okay. Those are those ballsy decisions that we talked about earlier. Well, if you block and jump in and your natural instinct is to just throw. Well, it was a pretty high jump. So it was probably not blessed. Oh, speaking of plus just chipping away the box there. Another one. One more. One last breath available for drag. They teleported in place. What a mind game and wait a minute. Oh, that might have been it. There are these chances here. Hold on. Dragon maybe one more hit. Stay through this. Oh, he is battling. We'll be shocked. Oh, shot with a bowler in her hand. I'm shocked. Dragon didn't come off all of the resources there in the fatal blow. Could have been the guys who could have gone to fatal blow. I don't know if it would have killed because of scaling. Yeah. But it would have put Sonic on the life alert here. What a back dash out of fall. They just got out of the way. They're pretty safe with that low. Very consistently only taking the risk on the overhead a couple of times. What a read. The end of that string, I believe is only minus two with some pushback, which is what everything we've seen out of Sonic does. Resets neutral with pushback. And for a dragon to read that. Incredible. But we also didn't see the flawless block on that string earlier. Empty jumps into the grab. I like it. That's the stuff. Maybe looking for flawless block. Even Batman joined the party over dashed. I don't know what the reactions with one at least for a little bit of a damage. This is so fast right now. David trying to get out of the cancel pickup and he's going to cover the break away. And this is going to do what I think. 22 remaining alive, but difficult. That's quite a bit of chip and not get shot. Oh, took the risk range was just off in the second hit of the geyser wasn't enough. Do you think that he took a dash to react to frames in the first one?


Neil Walker been to this team, not just tonight, of course, but really since some of these guys went down with injuries.  And, you know, I felt like so bad, we kind of needed to get him a day and, you know, goes up there one pitch and ends it. So he's been really valuable for us. You know, obviously, you know, he's shown a little more defensive versatility than maybe we even expected and we've needed it. But we've seen the professional hitter that he is really reveal itself here, especially in the second half of the season. You mentioned trying to get him a day. He sits on the bench essentially for eight innings. Is it difficult to come in in that situation and have success? I mean, yeah, it's always a difficult situation. But I feel like all our guys and do a good job of preparing for those kind of situations, you know, especially the second half of the game, all our bench guys are able to, you know, are following along the game, know who's coming in. Obviously, know the situations, are able to get the amount of work, swings in the cage that they need. So I feel like our guys do a really good job of preparing when they are down to be available, you know, a lot of times late in the game. Aaron Hicks with yet another homerun to tie things up in that eighth inning. Did you think he was capable of hitting 22 coming into the season? Yeah, yeah, he's really talented. And that, again, that I think revealed itself last year where he came into his own at the big league level. And he's taken obviously another big step this year as, you know, I think one of the really underrated players in our game today.  Anyone else? Kenny? Aaron, you were critical of the guys last night's game after the game. What did you see in the early innings? Did you have any concern about continued sluggishness? Not so much that, just scuffle a little bit, you know. And, you know, I've talked a lot through these last, you know, two, three weeks. It's not easy for us right now. We're kind of grinding through some things. It's a tough stretch. But these guys continue to find a way. And I think what's been cool through this a few week stretch here that we're in after leaving Boston, kind of limping out of there, we found a way to win a game right away the next day, late. We've been able to turn the page really well. And we've shown an ability to win games in a lot of different ways. And I feel like we've done a good job of that all season long. And, you know, we need to continue to find our way right now when it's difficult. Susan? A couple of pitches. Lance Lynn obviously kept going and going. But Jonathan Holder gave you extra innings that you usually don't get with him. That was huge. I mean, his pitch count was low.  But it was a huge pick-me-up. And even in the inning where he gave up the hitch, you know, he gave up the liner to Sanchez. But then, you know, kind of a little blooper to left there, he just pitched really well, was really efficient. And the fact that he really kept his pitch count so low allowed him to go out there for that third time, really. And it was a huge pick-me-up because it set us up at the back end. It didn't force us to roll through those guys. You know, we're a little beat-up, a little thin right now down there. So Jonathan Holder, you know, that was a big pick-me-up to get it to Dylan. And then he was brilliant tonight. Anyone else? Thank you, Aaron. Sorry.


Hi, good evening all now we are going to see how to submit the drive link assignment First login with your registered gmail ID Click the Google apps and select the Google drive Click the button new and select file upload Select the file from your local machine Which you want to upload Once a file gets uploaded you will see the message upload completed Select the file and right-click Then select share Click get shareable link Click the drop-down button and select more option and Select the radio button public on the web and save the option Share the file to the admin ID of the course here. I am going to share Share it with NOC 15 MG 08 which is the admin ID of the quantitative finance You have to share the file to the course which you have which you want to submit the assignment NOC 15 MG 08 Which is the course I want to submit the assignment and select the same button Now right-click the file and get the link Copy the link go to the assignment of the course Here you have to give the ID of the file Which we have copied Select the ID from the equal to and paste it as drive ID and submit the assignment You will be getting the message submission succeeded Now we will go to the admin ID of the course and see whether the assignment has received Here you can see the submitted assignment Thank you


So this is the kind of weather they call a wintry mix Right around the freezing point. We got some snow some freezing rain some ice pellets some sleet every possible type of precipitation coming down right now With some strong winds they're starting to starting to taper off now But yeah, this is what the day looks like so this morning I Was looking outside and I was thinking about Ways to somehow avoid Going on my regular exercise route running in Hyde Park Because clearly there's a voice that tells me that this is not weather to go deliberately outside in everything that I know told me that it would be very reasonable to Alter my plans and not go outside in this weather and In my imagination it really seemed like this is some kind of Hellscape of horrible weather Because this is what I'm used to to hearing you know a weather like this is considered some of the worst weather That we can get here in this part of the world so Thanks to Some kind of notion that I should do it anyway the notion that It's okay to be uncomfortable and in fact being uncomfortable can actually be useful I Went outside anyway and As soon as I went outside immediately it felt mild It's wow, you know around the zero degree mark. That's really not that cold and There was a little bit of the you know the ice pellets a little bit of stinging of the face but really I Was wearing a sweater rain shell and I was perfectly okay So it's amazing how quickly this this change can happen from seeing this as being This is some kind of a horror show that's going to be going to be pure suffering to Like when you when you don't do it. It seems like this big thing That is going to be terrible But as soon as you actually make yourself do it You See that there's really not that much to it. It's not so terrible and I don't want this to sound as if I'm Somehow bragging about my ability to withstand such weather because really this is not Really all that terrible you think about people that are Out in the wilderness, you know out on the open ocean having real rough weather This is just a Wintry mix in The southern part of Canada Which is really not so bad, but it's It was in my mind Because I had always thought of this type of weather as being You just look at it and you say this is wow. This is terrible I do not want to go outside if I can help it. This is bad weather But then it makes me think of that saying There is no bad weather only bad clothes If you're wearing a sweater and a rain shell then This is not so bad so When we protect ourselves from things that are uncomfortable they Start to seem bigger and bigger more menacing. This is what it's like to be in the comfort zone Hiding away in the comfort zone everything in the big bad world becomes More menacing it looks more difficult more threatening but as if we're able to break out of that comfortable shell and actually go out and Face some of these things that we thought were uncomfortable we can see that Actually, they are less threatening then we thought and By doing that we then become stronger because we're now able to take on more uncomfortable things with greater ease and It connects to that great human drive to have everything be easy We want things to be easy so we hide away in the comfort zone but if we break out of the comfort zone and the things that We think are uncomfortable out there. They're really not so bad Now the whole world has become slightly more easy and that's what it's like to become stronger everything becomes slightly easier and So it seems like all it takes is a little bit this willingness to be uncomfortable makes it possible for us to be overall more comfortable so my challenge now for this winter is to see how bad the weather can be and see How much I can take in terms of what I used to think was terrible weather and now I think it's just Another winter day up here


This lesson is on product and quotient rules. We are looking at two functions, which make a product, which are f of x and g of x. And what we are going to do is look at what could possibly be f of x, what could be g of x, and what could be just a constant multiplier, which we will factor out when we actually do product and quotient rule for derivatives. So on this a, we have y is equal to x sine x. We can make the x our f of x and the sine x becomes our g of x, multiplying f of x times g of x. For the next problem, we have y is equal to e to the x, tan x over 2. The fraction one-half can be taken out of this as the constant multiplier, and we'll have e to the x tan x, and that makes e to the x the f of x and tan x the g of x. With the next one, we see that we have an x in a square root of x minus 1. Again, the x itself can be f of x and the square root of x minus 1, the g of x. On the next problem, we have 3 to the x and x, and we can see again that 3 to the x can be the f of x and the x can be the g of x. On the following one, we see that the 2 multiplies x and that times the absolute value. Again, the 2 becomes the constant multiplier. The x is our f of x and the absolute value of x is the g of x. On f, we have 2 cosine x as our function. On this one, 2 is the constant multiplier and cosine x is not multiplied by anything else, so that's just the function f of x. We do not have to use product rule on this. On this last one, we see x squared 2 to the x over 3. That means a 1 third can be factored out as the constant multiplier and we'll have x squared 2 to the x. And then the x squared becomes our f of x and the 2 to the x becomes the g of x. So now that we have looked at the different types of products, we need to learn how to do product rule. So what is this product rule? Well, if we have a function y is equal to some f of x function times some g of x function, then the product rule is y prime equals f times the prime of g, f times the derivative of g, plus g times the prime of f, or g times the derivative of f.  How do we use the product rule? Well, let's do the problem. f of x is equal to x minus 3 times x plus 2. And if you notice, I made this f of x. So I have to change my letters a little bit. This will be now g of x and this will be h of x. So f prime of x will be equal to g of x times h prime of x plus h of x times g prime of x. So putting our functions in, we'll have g of x, which is x minus 3. Then we're going to take the derivative of x plus 2 with respect to x. And we're going to add to that h of x, which is x plus 2. And then we're going to take the derivative of our g of x, which is x minus 3. And that's with respect to x. So let's compute all this. The x minus 3 remains. The derivative of x plus 2 is, well, the derivative of x is 1. The derivative of 2 is 0. So it's times a 1 plus x plus 2 times the derivative of x minus 3. Well, the derivative of x is 1 and the derivative of negative 3 is 0. So that's times 1 also. And if we clean this up, we'll get 2x minus 1. And so now we have used our product rule to take the derivative of the product of 2 functions. Let's try a couple of more problems. Determine f prime of x when f of x is equal to 2 to the x times x to the 1 half. So f prime of x is equal to the 2 to the x times the derivative of x to the 1 half, which is 1 half x to the negative 1 half. Then we'll add to that the x to the 1 half and take the derivative of 2 to the x, which is 2 to the x natural log of 2. Now we clean up. And there are a couple of ways we can clean this up. One is to put the x to the negative 1 half in the denominator and then get a lowest common denominator with that. Another way is just to factor out the x to the negative 1 half. And that seems to be the simplest with this problem. We will also factor out 2 to the x because that is common to both terms. So we have 2 to the x and then x to the negative 1 half taken out of our problem as a factor. And in the first term it looks like we only have 1 half left. And in the next term we have x to the 1 half here. And if we factored out the negative 1 half, that means we have to put back an x in here in order to multiply out to the x to the 1 half there. So it would be x natural log of 2 because we factored out the 2 to the x. So that would be how you would simplify a problem as complicated as this one. For the next problem, if we want to find f prime of x, we have x to the fifth, which is our f of x, and then we take the prime on e to the x, which is e to the x. Add to that the e to the x times the derivative of x to the fifth, which is 5x to the fourth. Again, we will factor out to simplify this. We see there's an e to the x there, and we see an x to the fourth on this term and x to the fifth on that. Again, we take out the lowest one, which is x to the fourth, and we see what's left. Well, this says x to the fifth, so we need an x for this term, plus a 5 for the other term. And that gives us the answer for the derivative of x to the fifth times e to the x. Well, let's look at a proof of this. Suppose we have y equals a product of two functions, f of x and g of x, and we want to take the prime. So we use our definition of the derivative that says the limit as h approaches 0 of f of x plus h times g of x plus h minus f of x g of x. Okay, that's f of x plus h minus f of x all over h, our original way to look at definition of the derivative. What we want to do now is add in an f of x plus h times g of x, and then subtract it off. We have our original part of our definition, and we're going to just add and subtract something. Of course, adding and subtract the same thing means it adds up to 0. So we're going to add this in and then subtract it off. Then we're going to replace it. So now we have the limit as h approaches 0 of f of x plus h times g of x plus h minus g of x all over h, and add to that the limit as h approaches 0 of g of x factored out times f of x plus h minus f of x all over h. And as we begin to see what happens here, this is g prime and this is f prime. So we end up with the limit as h approaches 0 of f of x plus h times g prime of x times g of x f prime of x. Now when we take the limit as h approaches 0 of f of x plus h, this becomes 0 and we're left with f of x. So we have f of x times g prime of x plus g of x times f prime of x, which is the definition that we need for when we use product rule. Let's go on to quotient rule. Well, when we look at a problem that has a quotient, we have to use quotient rule to get that derivative. And of course, you can see very readily that the numerator becomes f of x and the denominator becomes g of x. And of course, when we use quotient rule, g of x cannot be equal to 0 or we just can't do it. So what is the quotient rule? Well, we can use the quotient rule to determine any quotient and it reads y prime is equal to g of x times f prime of x minus f of x times g prime of x all over g squared of x. Now the way I normally do these, I do the square first and I've started doing that by teaching students to make sure that they do that square first, the g squared first, and then do g of x times f prime minus f times g prime. So let's look at an example. Let's say f of x is equal to 12 e to the x over x minus 3. Well, in this problem, I put in a constant multiplier, which we are going to factor out and just put it out front as 12 times e to the x over x minus 3. So we take the prime of this, the first derivative, we just leave it completely out, and then we take the derivative on this quotient. So it's square that denominator, write that denominator up top, and then take the derivative on the numerator, which is e to the x minus we use the e to the x again, and then take the derivative on the denominator, which is the x minus 3, and we get the derivative that is 1. As usual, we have to clean things up. We can see we can factor out e to the x, so we have 12 e to the x times x minus 3 minus 1 over x minus 3 quantity squared, and a final clean up. We have 12 e to the x times x minus 4 over x minus 3 quantity squared, and that will give us the derivative using the quotient rule. Well, let's look at a proof of the quotient rule. Given y is equal to f of x over g of x, and of course g of x does not equal 0, then y prime equals f of x plus h over g of x plus h minus f of x over g of x all over h, and that is taken when the limit approaches 0. Once we get a lowest common denominator in the numerator, and then we can put that denominator into the denominator, we get limit as h approaches 0 of f of x plus h times g of x, that would be the cross multiplication here, minus f of x times g of x plus h, that's that multiplication, and then the denominator would be h times g of x times g of x plus h. Again, we're going to add and subtract something in. So now we're going to find that we have the limit as h approaches 0 of f of x plus h times g of x minus f of x times g of x plus h, which is what we see above, and we're going to add in f of x g of x and then subtract it out f of x times g of x, and this denominator is still the same. We again are going to rearrange things so that we can make derivatives. So once we have rearranged, we have the limit as h approaches 0 of g of x times f of x plus h minus f of x all over g of x times g of x plus h times h minus the limit as h approaches 0 of f of x times g of x plus h minus g of x over g of x times g of x plus h times h. And we can see we have here g of x times f prime of x, which would be the h in the denominator taken with the f of x plus h minus f of x. So that will give us f prime of x. And in the denominator, we are now left with g of x times g of x plus h. And for the second part of this, we have f of x times g prime of x, which is your g of x plus h minus g of x all over that h in the denominator. And in the denominator, we are left with g of x times g of x plus h. Meaning up a little bit more, we see that we have g of x times f prime of x minus f of x times g prime of x all over g squared of x. Remember, we've taken h to be 0. Put that in there so that both denominators become g of x and it becomes a square. This concludes your lesson on product rule and quotient rule for derivatives.


I'm actually in total disbelief right now put here Good thing we chose a vet. Oh wall tap wall graze Yes, let's go.  I'm evil rabbit. We're here on a set of Corsa to try something totally different So something over the weekend happened that basically broke one of my toes on my left foot So can't really use clutch or left foot break right now So why not try and drift with one foot? Just using throttle break a little bit of handbrake and auto clutch So make sure you follow me now such me knowledge found scripts box below. Well, let's try So we do have auto clutch engaged so we can go into gear and it does kind of mimic the clutch And if we hold handbrake for a long period of time, it does engage the clutch So that's a ball in our court As long as we're off throttle when we shift it usually works, so we're gonna be using one foot for everything I figure bring out a v8 car We have power on command and see if we can't do this and kind of just utilize throttle control a little bit of handbrake and some Normal braking and see if we can't get a good lap going in We're not doing too bad. I thought we were gonna be way worse than this Oh that force feedback really strong on this car for some reason. I haven't turned up I'm wondering if I haven't turned up past a hundred. Oh Find out. Do I have it turned up past a hundred? No, it's at a hundred. We're just gonna dial that back probably tip 80 for right now Just because it's a little bit over Over rotation don't break the trans Off throttle shifting is what we need So this is definitely something a little different since I can't really use my left foot right now because of well Dependency, but that's dirt. There's not gonna help. Let's get the wheel spinning coming out. So Crying run this basically just using Brottle some break No clutch kicks Kind of using the weight of the car It's kind of really good practice for Ronald control and I'm quite oh impressed With how that's actually working right now We really need to fix the flame on this vet So we can get this right We got it. I think we're good. I Kind of I think I'm cheating by using the V8 car because I don't have to worry about You know keeping it boost. I have a turbo car. I'd probably be a lot Struggling a lot more but I'm actually you know quite impressed that I can Kind of modulate this car That auto clutch is actually working quite well So if you have a two-pedal setup and you want to run auto clutch a Set of course is auto clutch Works quite well try a bigger entry. I'll take it Apparently you don't need to use a clutch. It helps But it is clutching in and then when I'm getting off The drop off the handbrake. It's kind of acting almost like a clutch kick So it's kind of saving us in the long run actually quite impressed with How this is working now, do I think we could run a Comp-track this way probably not because we would definitely need to use left foot brake and stuff wool Don't don't break a finger too. We definitely need to use a left foot brake and Stuff like that in a competition track or for tandem for sure but Kind of just chuck in the car. It actually works this car I feel like it's a cheat code this this vet is an extremely powerful and Good handling car But definitely a different challenge today trying to do this and actually thoroughly impressed with Like I said how the fact that it is working the way it is Though if you just want to see other weird challenges like this, let me know down in the comment section down below My variance just try some other different challenges and stuff like that. I think we need to change up tracks Let's go change up tracks. I don't think we're gonna be able to do it as well here on a mountain toge road But we're surely gonna try all this day out. It's gonna be different So that auto downshift lip That moza has implemented in to the moza shifter It's definitely going to aid me in this Notice how it just downshifted there. We're not Dead yet. I really wish I could be left for breaking though to hold my lines.  Oh I'm utilizing the handbrake more than I should be but I'm using it to kind of get that auto clutch to engage so Don't uh, don't thrash me too much In the comments about it. I mean we can kind of drift a toge road With one foot may not be the cleanest or the smoothest or the best like chasable, but uh, I Mean we're able to do it Yeah, that whole auto clutch thing is working miracles and the auto blip. Oh That's a wall and the auto blip from my moza shifter is actually the auto downshift on shift blip is Helping quite nice also So if you don't have three pedals you don't need them Don't even really need two feet You can kind of do it with one foot We are just Driving quite well So like I said if you guys want to see other weird challenges like this let me know down in the comment section This is kind of just a challenge that I kind of had to do like I said with having basically a broken toe on my left foot Kind of hard to put any pressure on the foot so I can't use use it too well, but we got this oh man I'm totally uh. Oh, I didn't want to shift there I'm actually in total disbelief right now What gear?  I'll see you guys on the track. I have no idea how we made that what? You know, we got to finish these hairpins My lord. Oh there it was. Oh, it's too fun