worried you won't make the right decision? Our tips today will set you up for success. Welcome back and congratulations on taking one more step towards becoming one of the great leaders of tomorrow. As leaders we're expected to make decisions every day but how do we know if we're making the right one? Today I've got five tips for you that'll help you go through a process for making great decisions. And stay tuned to the end I'm going to give you a link where you can download a checklist that you can use to apply the tips in this video. We often hear that great leaders are decisive and the best leaders seem to make decisions very quickly and very easily. Some people are fortunate enough to be born with this trait but the rest of us have to learn it like any other skill. One of the best tools you can use to improve your decision-making capabilities is the follow-up problem-solving framework. Now Toyota has their eight-step problem-solving framework you've probably heard about and when I was in the Air Force we had a modified version of this that we used a little bit differently. I'm going to take these frameworks I'm going to give you a link to these in the description below so if you want to go look up these original frameworks you can go look at them but I might take some of these and reorder some of the steps and I'm going to modify them a little bit because I think it makes it a little easier to remember and I think it makes a little more sense to do the steps in this order. So but you can go look at the originals if you want to and remember when you're trying to make a decision it's important to be thoroughly deliberate even if you're trying to make a decision quickly and even though there's multiple steps to this problem-solving framework I'm going to give you you can move through them even just up in your head we'd even without writing anything down you can move through these steps fairly quickly but it's important to be thorough and deliberate as you do. Step number one is to analyze the problem and this consists of two parts first it's identifying what the problem is the real problem not just what we perceive the problem to be and then second we're going to break the problem down into smaller component problems that will need to solve along the way. Now these both of these steps require us to be honest with ourselves about what the problem really is you've heard people say admitting you have a problem is the first step and that's no different here now you may be looking at this as well I don't have a problem I'm really trying to solve someone came to me and said here are two or three options I needed to choose between I needed to choose one of them well that's okay but it's always a good exercise it's always a good part of the problem solving process to go back to what the initial problem is what problem are these two or three options trying to solve when you take a look at that when you identify the real problem these options are trying to solve and you go look at the smaller component problems this will give you great insight into what solutions might solve the whole problem and all the smaller component problems and honestly if there isn't a problem these options are trying to solve these these solutions are proposed to solve why are you really making a decision about it now anyway step number two is to find the root cause of the problem now some of the other frameworks I talked about have this a little little later in the process but I think it's important to get this straight before moving on to some of the other steps now this requires again this requires some honesty and it's going to require a lot of patience because we need to keep digging we need to keep asking why and how to really get down to the root cause we want to get down to that point where we can't ask those questions why or how anymore like I said sometimes in other frameworks this is later in the process but as you start to get to the goals as you start to get to the areas improvement that you want to solve as part of this problem it's important to understand what these root causes are because if you get resource constrained you might want to prioritize on what's going to give you the most bang for the buck or what's the most important thing to solve first so I think it's important to get to the root cause before you get to setting your goals which is the next step but if you want to go set your goals first that'll work for you too next step set your goals for improvement whenever you're setting goals here at evil genius leadership we talk about making them clear measurable and achievable I won't go into all the details on how to do that we've got another video for that and I'll put a link down in the description so you can go watch that if you're interested in how to make your goals clear measurable and achievable but you want to make those goals for the entire problem you're trying to solve you don't want to leave any of it out you want to address all the smaller problems that you broke the problem into in the first step and the root causes that go along with that problem and the reason you want to do this is you may be time or resource constrained on what you can put together if you've got all the time in the world and all the resources in the world great no problem right but if you're resource constrained like most of us are you may want to choose one or two goals that are going to address the root causes of the problems that are move the needle the most and get you the most improvement step number four is to create and evaluate courses of action this is where you go build those plans to go achieve the goals you just set in the last step and you want to come up with multiple options and you want to evaluate multiple options because you don't want to put all your eggs in one basket some options may be better at others than addressing the whole problem even though they may look good at first and the way you can do this a great tool you can do use to evaluate these courses of action is to create and write down your evaluation criteria before your team comes up with the actual solutions so go right down kind of the framework of what the solution needs to achieve in order to meet the goal and that'll help you choose the best solution or solutions that you want to implement simultaneously to go forward and achieve those goals the last step of the process is to implement and assess once you've chosen the best solution or solutions that you want to go implement go forth and do it and keep tracking how well you're doing on those solutions are you on track for your goal are you a little bit ahead of your goal are you behind your goal and as you're looking at the numbers don't lose the force for the trees on the numbers of tracking your goal are the root causes going away or do you look like they're starting to reoccur that can give you a lot of insight qualitatively in addition to the way you're quantitatively tracking your goals and once you've met your goal now it's time to say okay do we want to double down on this goal instead of a more ambitious goal or maybe do we want to move on to a problem that's going to move the needle a little further for us so don't be satisfied don't stop just because you met your goal reassess and see if there's more for you to do later on so the eight step process is from Toyota and the Air Force that I mentioned earlier have one more step and that's to standardize the solution and share the success across the organization now you may not be working for a bigger organization you may be a very small team or a small business but if you are in an organization where it's important to take the lessons you've learned from from your problem solving process make sure you standardize those lessons get them written down and share them across the organization because they may be valuable to someone else and when it comes to success no matter what size your organization make sure you give your team the credit they deserve for going to the problem solving process helping you make the decision and coming up the solution and I know this was really focused on a problem solving framework but this is the kind of thing if you've got to make a decision you can always go through this five step these five steps and apply these five steps even if you just do it up in your head you don't need to write it down if you just step through these five steps that can go help you make any decision quickly remember it's not it's not about making decisions fast you can always make a decision fast but it's important when you're making a decision to be deliberate and thorough and that'll help you get to making the best decision possible for you and your team if you found this helpful please like comment and share it with a friend or co-worker click on the link below in the description that'll take you to where you can download a little checklist guide that'll help you apply the five problem solving steps we talked about in this video if you have any business or leadership questions leave us a comment below we'd love to hear from you or email us at info at evilgeniusleadership.com evilgeniusleadership.com is also where you can learn about all of our coaching and training programs so if you're interested in some one-on-one coaching to develop your leadership style and your leadership skills or want to bring us in to help with your team and do some leadership development as a team let us know contact us and we'll set you up with a free consultation to see how we can help thanks for watching today i really appreciate it and remember the future is out there lead the way


Reaching this milestone during an unprecedented global pandemic shows that British Columbia's Class of 2020 has the resiliency to take on anything. I know this has been a challenging time, but there are so many exciting adventures ahead. Be kind, be calm, be safe, and congratulations to you all.


So I've been given the thumbs up, so I'm going to just proceed. Thank you for joining us after lunch here. I know it's tough. My name is Michael McKeown. I'm an engineer at Red Hat. And I'm going to talk to you today about streaming functions as a service with Apache Spark and Kubernetes. So a little forecast here. I'm going to start by talking about some of the fundamental technologies that went into making this up. Then I'll talk a little bit about Spark streaming. I'll talk about encapsulating functionality using Python. I'll talk a little bit about deploying this on Kubernetes. And then lastly, we'll kind of talk about looking forward. So first of all, show of hands, how many people here are familiar with Kubernetes? All right, so most people in the room are pretty familiar. Not too deep, but Kubernetes is a container orchestration system. I took this picture from the Kubernetes docs. It basically shows you what a single host might look like. This is a very abstract diagram.  And then the important thing is that all the containers are kind of running in separate namespaces, kind of doing their own thing. In practice, it looks more like this. And this is what an OpenShift architecture deployment kind of looks like. You can tell there's all sorts of different nodes doing the work. They're running different types of applications. There's some sort of control plane that's handling scheduling and, you know, the API. On the outside, there's all sorts of CI CD mechanisms attached to it, source control. So in reality, this is really more what Kubernetes looks like when you deploy it. Now let's get a little deeper. How many people here are familiar with Apache Kafka? Okay, so about half the room. Apache Kafka is a distributed streaming platform. And what that means is, from a very high level, is that you have something called a Kafka cluster. And you have the ability to have message producers and message consumers, as well as stream processors that can read from the streams and write back to them. And really what the stream is is it's a discreet way to pass individual messages to a large architecture. And you can see the connectors is how you might add persistent storage into that mix. Now let's go one layer deeper. How many people here are familiar with Apache Spark? Okay, so still about half the room. We're doing pretty good. Apache Spark is a distributed compute engine. And it runs everything in memory. And it's very fast. And it scales very well. And it's very resilient to network kind of behaviors. And at a very low level, this is what a Spark process kind of looks like. Or a Spark application. We call it the driver process. And I'll use that language throughout here. And what that means is the driver is responsible for where my user code is. You know, the things that I would actually like to do, the business logic. And the Spark session is a special type of object that allows me to connect to the cluster. And you can see the cluster manager is a piece of Spark that's managing the different executors. And these are the terms we use to talk about the actual functional units that run things. And there's a lot of depth we could go into here. But I'm not going to go too deep. But basically it's a way to distribute compute tasks. So Spark streaming is one of the APIs you can use to interact with Spark. And it's got two main interfaces. One of them is called D streams. And that's a very low level interface. It's the discretized stream. I'm having trouble with that word today. I'm not going to talk about it. So let's not worry about it. The other one is structured streaming. And structured streaming is a fluent style of programming where I can set up a path or a workflow that will run on every piece of information that comes through the stream. And although I'm going to demonstrate Kafka, there are a lot of different sources and syncs that can be used with this. You know, you can use Kafka, Flume, Kinesis. You could even use a raw TCP socket to connect to these things. There are a lot of other connectors you can use. But those are some of the main streaming ones. So there are a lot of different ways to work with the streaming interface. This is the pattern I'd like to talk about today. And what I'm showing here is that the type of work that I'm doing, I'm reading information that comes on a topic, say topic one. And then I want to use my Spark application to somehow filter that data or transform that data or mutate that data. And then I'll replay it onto a second topic. And the reason I'm showing the executors here is just to show you how this architecture kind of looks when you actually deploy it. Now the reason I like this and why I want to use it is because it's very easy to start building composable applications.  So you could imagine each of the pieces in the middle is some different application doing something to the data stream. You know, perhaps the first one is just doing some sort of filtering. The second one maybe is taking the data and making some sort of write to an API somewhere. Another service might be storing things to a database. But you could see how I could abstract this out pretty far. And you could even start to make branching topics so you could have different topics for different types of information. This pattern is very flexible. And it's made even more flexible with Kubernetes because the container orchestration allows us to make each of those pieces very easy to deploy, to redeploy, to put into our CI CD pipelines, et cetera. This is a little bit of Python code. How many people here are familiar with Python? Just a quick show of hands. Okay, so a lot of people. So this is Python code and this is showing you the very basic way to set up a structured streaming interface. And all this is doing, the records part is reading from a stream. And you can see the top couple lines there. I'm setting up my connection to Kafka. And then this select line is where I'm actually selecting the data that's coming across on that stream. And then the second set, the writer, is how I'm going to write those to a second stream. So at this level, this is the basic pattern that I work with. Reading from one, writing to the next. So the question is, how do I make this more useful for myself? Now you remember this function, select functions, column value, blah, blah, blah. What this is doing is it's telling the structured streaming interface that I would like to pull something off the stream that's called value. It's a string type and I'm just going to alias it to value because that's kind of the default name that Kafka uses to associate with the data. So that's where I start. But because this is a fluent style interface, I can start to add more instructions onto the bottom of that. So you can imagine if my data was coming across in a JSON format, the first thing I might want to do is convert that string into JSON data. And this functions dot from JSON, this is something that comes from Spark. And you can see I've got a little magic in here and I'm going to alias it to JSON. So in the first one I'm selecting what's called value which is the key that I'm using to associate with the data. Once I've turned it into a JSON structure, I'll pass that on as JSON to the next function that could run. And just for completeness, this message struct is, you know, this is a way to add types into here and so you know exactly what's coming off the stream. You can have a schema that goes along with the message type. You know, in general, Python doesn't have a typing system that you really need to use that much. I mean, it does, but you don't have to use it. But because all of this is backed by JVM code, you know, it's Scala code is what Spark is written in and Kafka is written in Java, I believe.  And this, if you're going to look at one thing, you know, from this, I would look at this PySpark dot SQL. The functions package has a whole arm load of things that you can already use out of the box that from JSON was one of them, but there's all sorts of converters and filters and just really useful things that you can reuse in there. How many people are familiar with dry? And I don't mean it's not raining right now. I mean, DRY. Landon, I know you are, man. I know you don't like to do this. Who else? So dry is one of these acronyms that's been in computing for a long time and it stands for, and probably not in computing, don't repeat yourself, okay? So one of the things that I do in my day job is I write a lot of these applications to show people how you can do these types of interactions. So I'm rewriting that piece of code that I showed you at the beginning over and over and over again. And I started to think to myself, how can I make this easier to do so that I'm not always writing that, you know, what we call boilerplate over and over and over again. And so what I did was I started to think, well, in my Python applications, what if I put an extra module inside my repository that I'm building from and then at runtime I can say, well, I'll try to import that and if it exists, I'll set it to this thing called user function and then I can add this into my record stream. So whatever that function does, and it could be anything at this point, I'm going to call it, I'm going to pass it the original string value and I'm going to expect it to return a string value back to me. I'm not going to call it if there's no value that came across the stream. So if a record came in but it didn't necessarily have any sort of value associated with it, then I'm not going to do anything. So in this way I could start to say, well, now I can inject something at runtime or at deploy time that can add a little more functionality and I don't have to keep rewriting that loop over and over again. And this is what my module.py might look like. We've got a user function here. It takes in a value. I check to make sure it's not empty. If it's empty, which means I get an empty string, a non-null value. I wrap it. I call it empty. I return it. Otherwise, I do this thing where I load some JSON data. I call it wrapped and then I return a dictionary as a JSON dumped string and that could go on to the next value in my processing stream. All right, great. So I've got this way that I can now make modules. I can inject them. I'm kind of thinking about where can I take this? Like what can I do with this? I still have to make an individual repository for each application I'm building. I'm building from those. I'm trying to figure out what can I do? So I'm sitting around and I'm thinking like, where do I take this next? And Python's great. I mean, some people say it's terrible, but it's also great in that you can do a lot of things dynamically. So I kind of came up with this huge blob of code here. And what this does is it will load a value at runtime based on a URL that you give it and it assumes that that's some sort of string and it will attempt to turn that string into a Python module and then load that module and set it up as what's called a user-defined function and inject it later into my stream. And the really important part here is this functions.UDF. And you remember I said there's that PySpark.SQL like functions module. That's where thisUDF comes from. And if you're familiar with databases and whatnot, this idea of user-defined functions is really common in the old SQL world and whatnot. This was a way to encapsulate functionality. I could have some typing associated with it. I could inform the system that I'd like to inject a function here. And by default, the function will take a string and all I'm telling it here is I'm going to return a string as well. So if you can see I'm starting to make an API around these functions that I'm injecting. So now this allows me to have something like this where I can have my spark driver, I've got my stream going and at deployment time I can pass in a URL and it will load that file and actually set it up on all the executors. So now I'm running that as my function, right? And this gets really interesting because on Kubernetes it's very quick to redeploy containers once they're running. And all I have to do is change an input parameter to my application, restart the container and now it's got a new function running in the middle of it. And so now you can imagine, okay, I no longer have to rewrite that boilerplate. All I have to be concerned with are these little wrapper functions that I can store and load at runtime. Okay, so demo time. I was going to do this live but as, you know, the VPN here is kind of crazy. I'm going to use a recording to do this. What I'm going to show you is a really simple application where I've got a topic that I'm going to inject random numbers into and I've got a file called odds.py that's going to just parse out all the odd values and propagate those onto the second topic. And then what I'll do is I will redeploy it with something called evens.py and that way I'll switch to just filtering evens. Part of what I'm going to use to do this is another piece of technology from a group, you know, one of the communities I work with, the redanalytics.io community. We've created some tooling that will automate the deployment and creation of a spark cluster to go with my application. So one of the things I love about OpenShift is this idea of what we call source to image. And what this allows you to do is say I've got a repository somewhere. I know it's a Python repository. I can instruct OpenShift, I would like OpenShift to grab that repository and automatically build me a Python application. And the Oshinko tooling will make the Python application and then it will also deploy a spark cluster that attaches to that application. So now every time I start this thing I can have it start up a cluster with my application. So let's see if this works. I mean we know it will because I have a video of it, but you know, I have to say that to stay honest. All right, what we're looking at here is the OpenShift console. And this is an interface into Kubernetes basically. How many people here have used OpenShift or are familiar with OpenShift? Okay, a good number of people. So what we're looking at is pods and these pods represent containers. And what I'm going to start by doing is I'm going to start up the generator application. So right now it's not running. You can see it says zero pods. I don't know how many of these videos kind of slow. I was scrolling down to show I've also got Kafka deployed inside my project and that's the infrastructure I'm going to use. So I'm going to start scaling this up and this container image is already there. You can see it's already running. I've also got this listener application. All it does is attaches to a Kafka stream and shows you the data coming across. So you can see there's just a series of random numbers coming across here. So the next thing I'm going to do now is I want to deploy this application using source to image. You know, a lot of people, you've probably seen a lot of demos where someone's typing on a huge OC command. I've put that OC command into this repository that I'll have a link to at the end. Just kind of copy this huge blob. What this thing is doing is it's creating a new application. I'm telling it like where to get the application, the name of the application, where the Kafka server I should connect to is. I'm passing in some specific Spark options. There's a lot going on here. There's a lot to unpack. The last line you can see I'm passing in a URL to the function that I want to use as my user-defined function. So I think at this point I'm going to copy this stuff. I'm going to dump it into a terminal and it will kick off the build and start it up. I took this from the practice talk I gave last week, so I don't remember what I was talking about here, but I was just gabbing on about the different options. See, this is where I'm grabbing that evens.py. And that evens.py and odds.py, those are also in this repository that I have linked for the presentation, as well as a PDF and some other stuff. So here's a quick example just so you can see what's inside that thing. The user-defined function I created. I know I'm getting a string, so I'll turn that into an int value. I'll then check to see if my int value modulo2 equals zero. This is basic stuff. It should be even then. I'll wrap it in a message that I can send back onto the queue and that'll be my number. And you'll see this through the listener. So I think I copy this, paste it into a command. You can see I'm going to copy it here. I'm going to put it on the terminal. You could do all this through the OpenShift console as well, but I find it more convenient to use the terminal for a lot of what I do. So you can see this just created all the resources. It talked to OpenShift and it started to spawn this. And what you'll see is first it's going to start building my application. So this is the output from the build. It actually builds pretty quickly because it's a very small application. I'm going to scroll down to the bottom and just show you that there is a spark cluster deploying with it as well. I don't have to do that ephemeraly every time. I could just do it once and then reuse the cluster. But I'm just kind of showing how all the automation works here. So this is starting up the filtering application. You can see it's waiting for the spark cluster to become active. Once it does, it's going to start processing the numbers that are coming across that stream. And I'll go back into the listener at this point. And this is another thing I really like about OpenShift. And you'll see if you remember originally, the listener was watching all the numbers that were coming across. And that was my topic one. My topic two is actually this other thing called output. And based on the way OpenShift is set up, if I change an environment variable, and I've got my deployment set up properly, when I save this, OpenShift will automatically redeploy the container for me, changing the environment variables inside that container. And what you can see is it's not rebuilding it, it's just redeploying it and changing the environment variable. And we'll see here, okay, so now we're looking at the number stream that should be just showing even numbers at this point. And in fact, that's what we're seeing because we're just looking at the output. So the next step would be, I'm going to go back to the deployment for my filter application. And I'm going to change the URL to use the odds function as well instead. And so just like the listener that we were just looking at, OpenShift is now going to redeploy my application. And when it redeploys this application, it doesn't have to rebuild it. Because I didn't use the same spark cluster over, it will redeploy a spark cluster, so that's kind of a slowdown. But what you'll see when it redeploys is as this log continues, now we should just be looking at all the odd values. And you see there's a little weight here, because I'm looking at the listener at this point, right? So I'm waiting for the new application to spin up. I'm waiting for it to start processing records from Kafka, and then it will start emitting them. And remember this point, because this time that I'm waiting is something that I'm thinking about as a developer as I watch this, because I'm like, well, we obviously missed a bunch of data. It took 30 seconds or whatever for this thing to restart, and now you can see we're getting the odd values. But if this were a production deployment, I would have missed some segment of the data that's coming across. So just keep that in mind. All right, so that's pretty much the end of that. So like I said, the timing. This was kind of the next thing I started to think about as I'm working on this, is like, is there a way that I could make that even better? Is there a way that we can make this, you know, faster so you don't have to wait for this redeployment to happen? Because when you're doing these things in a production environment and you imagine someone like Twitter or something, they've got, you know, or a banking institution, they've got thousands of messages a second coming across these things, and you can't afford to miss 30 seconds of time. So I started to think, well, I can put strings into the topic. A Python application is basically just a series of strings. You already saw the code for how I loaded it from a URL. What if I inject that directly onto the topic and allow my spark driver to pick it up and redeploy everything without having to redeploy the application? Just change that. And there's a problem with this. And you need to understand a lot about Kafka, not a lot, but enough about Kafka and Spark to understand it. So if someone can tell me what the problem with this is, aside from like Eric and Jason, maybe Landon, you know, I've got a little prize. Can anybody tell me what the problem with this is? Speak up, Zach, yell it out. So he's asking, am I just taking that string and putting it in a message? Yes, that's what I want to do. I want to encapsulate that string in a message and I'll have some logic in my spark driver that will read it. What's the problem with this? Okay. It might be...  Security might be a problem, someone can see that, but that's not actually the real technical issue here. So I'm going to... The problem is, is the way Kafka and Spark work together is that Spark, the executors, will each look at one message and it won't be sent to the other executors. So if I send a message across that has the code in it, only one of my executors will change if I have the logic in there to switch it. Not every executor will get that and this is something that I've been thinking about trying to figure out how to solve this and there are some ways to do that. It really gets into how you configure Kafka and how you configure Spark and there's a lot of options for determining how data is replicated across what are called partitions in Kafka and so I'm still trying to figure out how this might work. So how would we handle these singleton messages? One way I thought was, what if we added another topic to this, a control topic that we could just send updates to the system? Well, that might work, but now my Spark application has to be listening to multiple topics. I have to synchronize between how I shut the executors down and how I restart them. There's also a concept in Spark of something called a broadcast variable and a broadcast variable is something that the driver can create that all the executors can see. So I figured, well, I could just make a broadcast string and every executor could look to that string and then execute that. The problem is, those broadcast variables are read-only at the executor point and my driver is not actually processing what's going on on the stream. Only the executors are processing. There's another option which are called Kafka consumer groups and this is a way that you can segregate everything that listens to Kafka into a different group and thereby each group will be ensured to get every message. So there's a way that you could set up like consumer groups and then have each executor as a node on a different consumer group. It gets really, really complicated and maybe there's another option with partitioning the data properly, but you can see this is not an easy problem to solve and I'm not even convinced that it's something that needs to be solved. Maybe the way we're doing it now just using the URL is good enough. So this is pretty much working for me and I've used it in a lot of demonstrations and workshops and whatnot and what might I like to do with it next? So one thing would be, could I figure out this wire message thing or maybe one of you could figure it out and then you can share it back and we can all go out for dinner or something. I'm not sure that it's worth solving. I've had some pushback about security based around putting these things into topics and whatnot, so maybe that's not a good way to go. Maybe using the URLs is right because we can version that stuff, we can have it checked in somewhere. I'd also like to produce some really good metrics to show exactly what the switching time is doing. How long does it take you to roll over using different methodologies? I think that would be important for anyone who wanted to try and use this technique. You'd want to be able to know, what am I getting into? How long will it take me to do that switching? I'd also like to write a little more documentation for the repositories I've created around this. And lastly, I think it would be interesting, especially in Kubernetes, to create some sort of application that lives inside Kubernetes that serves up those filters. So instead of calling out to GitHub to pull in the filter code, I could have a container sitting next to my other containers and I could just use that as my warehouse for pulling out different filtering functions. So I think that might be an interesting way to look at it. So that's pretty much where I'm at at this point. This QR code will take you to the repository that I have set up for this code. So you can see the slide back is there, the filtering functions are there, and there are instructions on how to run this demonstration for yourself on OpenShift. BonesBergade.org is a community that I contribute to where we're collecting application skeletons, and we like to reuse those on Kubernetes and just locally and whatnot. So we have a bunch of stuff there about setting up a streaming service, setting up different types of, just various types of things where you're going to reuse boilerplate over and over again. And then I'll get you in just a second, okay? And then redanalytics.io is where a lot of the code for the Kafka and Spark stuff that I've been doing is coming from. So I'd say recommend check out those projects.  So, yeah, so question. Just a thought, I was thinking for the previous problem if there's some way to use an operator to propagate the Spark executors together. Yeah, so that's a great idea. So the idea is we could use an operator to control what the function is that's inside that. You know what, you're absolutely right. I've done a little bit of work with creating application and job custom resources that would go along. You could most certainly create a custom resource definition that also had the link to your filter in there. And then, yeah, that would be a great way to do it. If you were starting to build an architecture around this for like a service inside your business or whatever, that might be a really great way to do it. It's a good suggestion. So any other questions? So actually I think it's a really cool idea of injecting code there. I always thought like library loading code is pretty cool. I think you could solve most of the security problems by just digitally signing the messages. I'd be okay with that in a stream that I was consuming. But a tougher problem from my perspective would be handling the user's version of Python or if they import numpy, they import something that needs to be compiled or something that would be my fear is we solve security but then they try to do something in Python that's not supported on the executors. I don't know if you've thought of that. Those are some great thoughts actually. So I think you're right. From the security side, there's a lot you could do and that would depend on your organization. If your organization is okay with using like GPG signed blobs of code that go on to the message stream, maybe that would be good enough in your organization or you're confident that the network that's happening inside of OpenShift is secure enough or inside Kubernetes. This is part of the reason why I'm a little hesitant to go too deep on it because I think every organization is going to want to do this a little bit differently. So yeah, that would be one way to do it. Another thing you hit on there is yeah, how do we keep track of the versions of Python, the versions of all the modules you've got in there and the examples I had for the code were just using standard library packages. So I could import from the Python standard library if I wanted to import something like Kafka producer library inside there. Yeah, I would have to build an image that had that inside of it. So to the point, this is the great thing about using Kubernetes. If I were an administrator, I could version all the images and we could know like, all right, you need Python 3.6. Here's the Python 3.6 source to image builder. This is the one you want to use. From an organizational level, you could say, here's all the controlled images you can use. If you want to request a special module be loaded into these so that I could use them, you could go through a whole process for doing that. And the way that the source to images are built now, the source to image images are built is that we have them broken out by language. There's Python 2.7, Python 3.6, Java, Scala. I think we even have an R1. So we've started to do some of that where the platform is really going to help you out because you can build this deep versioning into every object that gets deployed into the system. Until the rogue hacker in your group comes along and it's like, I got my own images and I'm doing my own, you know how it goes. Thank you. That's a good question. Thanks, Mike. I was wondering, could you, before you actually kick off like the Spark streaming job, maybe set up a separate thread that can watch the URL and if it detects, you know, another one, maybe via the operator idea, it could like just kill the stream and restart it with a new value. Yeah. That's a good idea. Like, could you have something watching like a separate thread of execution watching for updates? I think the natural way to do this if you were using like Kubernetes K-native or you were using OpenShift is to, you could set up like a webhook that came from your Git server and then if a new check-in occurred, you know, like maybe you have a configuration file or something that tells where to get it or you're updating a custom resource, yeah, that could kick off some sort of new operation or redeployment of just the application. Or were you thinking more deeply about how could I do it without restarting the application? Yeah. Maybe there would be a way to use like webhooks coming out of like your Git server or something or you could send a different message there. You know, maybe that's a good solution. Thank you. That's a great idea. Any other questions? I know it's after lunch. We're getting all sleepy. Only one or two more sessions left to go. I appreciate that nobody went to the hot dog talk and they came here, so thank you. Any other questions? All right. Well, thank you very much for your time.


OK. First step is to launch RStudio, and then the next thing you're going to do is you're going to install the use this package. You can use the GUI or the command install.packages. And you're just going to load the, you're going to install the use this package. Then after you install it, which you only have to do once, you have to load the library with library. Open paren, use this, close paren. And that you do every time you restart R. And now that we've done that, we can use the function called use underscore use this. And what that allows us to do is paste some information into the .r environment file, which has just been spawned and opened up into the script editor. And all you have to do is click into that script editor and just paste.  So then you can just save. And after you save, you're going to restart R. OK. So after you restart R, of course, you're going to have to load the use this library again. But basically all you did was open that text editor and click paste and then restart. All right. So we will load the use this package again. And then we'll go on to the next function. The next function is use underscore get underscore config. And of course, that configures your get client. You'll see how I'm doing that on the screen. I misspelled my email address. But you can get that email address. It should be the one you associated at GitHub. OK, now we're going to use the browse underscore GitHub underscore PAT, which is PAT, stands for Personal Authentication Token or Personal Access Token. Not sure which, but you can find that at GitHub. And that is a token that is specific to between your computer and GitHub. You'll have to log into GitHub to see it. You want to give the token description a reasonable name that speaks to you, for example, my laptop. And then when you scroll down, you can generate that token. You're not going to share that token with anybody. I regenerated my token after this. So it tells you to copy that into a buffer, which you'll see you can do by clicking on the little clipboard icon. And then the next time you look at that list, that token will no longer be visible. So keep that token private. And then edit your edit underscore R underscore environ function to edit your R environ function file, which will go back into the script editor. And it tells you exactly how to configure this, but you're basically going to type GitHub underscore pat equals. And then you're going to paste your personal access token into the environment variable, into the environment r.r environ file. And then you need a blank line. Then you can hit Save. And then you can restart your computer. And basically at this point, you have set up everything so that you should be able to use these functions that are really helpful in creating repositories and pushing repositories, new repositories. But for now, you've done the configuration. I think in the future you may not have to do this personal access token part, but this is working for me now. And it should be noted that this does not seem to work if you're using two-factor authentication at GitHub. But in any case, I hope this helps.


and let me know if you have any questions I'll see you I do why do you eat vegan all right guys welcome back to the channel if you're new my name is Bobby guys it is reaction time today we have tests back what I eat in a day vegan and easy let's do it hi guys welcome back to my channel I hope you're doing well welcome back exciting news once again that that the vegan bundle is back and it's better than before you are not going to want to miss this sale as this is the last time it will be available and after I'm gonna pass now I'm going to be showing you how I have been enjoying the ebooks in the bundle over the last month and show you some of my favorite ebooks in the bundle in this video so let's get into breakfast all right so it's an extended advertisement from the ebook the wholesome life by Elsa's wholesome life it is a summertime smoothie and made of ala day and I'm just craving it it's very hot today so it's very refreshing and she has very bad skin that comes from sugar over consumption yes there we go more sugar coconut water packaged most of the time is pasteurized therefore really not good for you so I got my smoothie and I'm so hungry always like the perfect summer treat no it's like the perfect sugar fix no nutrients were seen that given day all you ate there was just sugar with a little bit of vitamin c it's the worst start of the day you have no building blocks if you would replace this with simple scrambled eggs you would get vitamin a vitamin k2 vitamin b12 and super bioavailable protein now I'm making a recipe from ellen fish's ebook epic plant-powered kid food the recipes in there are terrible epic kid food vegan and kid food is a contradiction veganism is a fast in christian orthodoxy we call it the land you go plant based for a while as a fasting practice not to nurture the body and guess who is excluded of the fasting practices kids of course they're delicious I'm making a classic mac and cheese I love this ebook and I love what ellen fish does she's very inspiring and her family is so beautiful and her children are adorable it's terrible so this ebook is definitely for you if you have children or just looking for some delicious easy recipes okay let's see what we're gonna feed the children so we have carrots and potatoes or is it cauliflower either way just starchy carbohydrates nothing more nothing less then we have cashews cashews are super toxic so toxic indeed that they burn off the hands of workers but at the other side of the world this little nut has become a nightmare for thousands of women the rest of the work is even harder and it's done entirely by hand the shell and the skin of the nut are difficult to remove and inside them are highly caustic acids that burn the skin the women's hands are badly damaged there you go please proceed nutritional yeast again such a contradiction such an oxymoron unbelievable what is nutritional about yeast please guys use your brains what is nutrition in the human body only fats and proteins are essential carbohydrates are non-essential yeast is non-essential as well so how can it be nutritious fantastic yuck absolutely repulsive we already know that vegans try to replicate animal foods in this case of course the dairy this is already slave food it is pasta with a little bit of cheese in its original form this is what the slaves ate back in the day to get a little bit of protein a little bit of saturated fat a little bit of k2 this is what this was for but now we take out the only nutritional part of this recipe and replace it by what by cashews cashews are full of lectins they will destroy you oh man because we didn't get enough oxylus i got my lunch this mac and cheese terrible meal why would you feed that to children shame on you and let me tell you it is so delicious for dinner tonight i'm making a recipe from the e-book vegan kitchen by 30 takes flight i am obsessed let's see and this recipe is on repeat in my kitchen so the two favorites in the book are stir-fried sweet chili tofu and stir-fried sweet lime glace vital estrogen bomb so here i have the sauce prepared i am short like a tablespoon of soy sauce so it's not exactly the same but it's still so delicious they have the tofu which has salt pepper and corn flour over it and then some pakchoy capsicum mushrooms getting what vegetables are caught right now all right all right so if you want to eat plant based and you don't want to waste away right away then you need protein of course soy is the poison of choice then soy has a pretty high plant protein content and is therefore used readily by vegans and by asian vegetarians like however it comes with a ton of phyto estrogen only in the west people started eating so much of it if you look into asian cuisine i lived in thailand you will see that they use tiny little amounts of tofu if you eat tofu in high amounts you will disrupt your hormones not a good idea and then some red onion and i've also cooked some brown rice noodles so i'm just cooking up the tofu i've added a little bit of sesame oil just to make it brown a bit better it's hysterical you have no micronutrients in this meal you have the rice noodles therefore you have carbs as i said carbs are non-essential so therefore it is up to you to decide if you want to eat them in the first place then you have another macronutrient mediocre plant protein in this case but you have no micronutrients do you understand this you have no b12 you have no vitamin d you have no vitamin e no vitamin k2 you have no micronutrients now you dilute yourself into believing that you have phytonutrients through the vegetables and somehow this is healthy for you phytonutrients lead to hormesis hormesis is a stress reaction in the body a minor stress reaction that therefore allegedly makes you more resilient the same can be achieved with fasting with sauna with working out there is absolutely no point for vegetables smells delicious it tastes delicious and it's probably one of the best recipes like at home asian food if you get the bundle no one of the best recipes is a steak we'll definitely make this recipe first off for dessert i've made some of my fodgy brownies from vegans simply live off junk food that's it the best brownie recipe it's gluten-free refined sugar-free oil-free freaking amazing it's really great it looks pretty dry straight from the oven and also if you put it in the fridge the next day when it's cold oh my god it's just even fudgier i'm going to head off to bed now thank you so much for watching and i really hope you enjoyed this video be sure to be aware to get the vegan bundle and make use of this sale as it will not be coming back no thanks and let me know if you have any questions i'll see you i do why do you eat vegan in my next video bye bye all right and this is it just a quick one today as you just saw no nutrients were seen that given day absolutely ludicrous for such a young girl to come to the conclusion that she wants to starve herself eating only plants i heard she comes from australia veganism is pretty trendy over there even when i lived there in 2016 or so it was already pretty trendy i can only imagine what is happening now she likes so many others is the product of brainwashing this is why i run this channel to save young people from this delusion all right but this is for today's video if you liked it leave it a thumbs up if you haven't subscribed already please do so and guys if you want to support the channel all the links are in the description box below if you want raw grass fat liver but you cannot stand the taste grassland nutrition has the solution grassland nutrition takes grass fat organic beef liver raw and freeze dries it for you it is a convenient fantastic way to get the nutrition of liver without the taste we have amazon links for you you can head over there buy whatever you might want to buy and it doesn't cost you anything extra we get a small share that is a fantastic way to support bobby's perspective if you want grass fat beef deliver to your doorstep butcher boxes for you and we have cbd links as well on top of that guys consider supporting bobby's perspective through subscribe star or patreon we have a vip community there where we have skype group calls every single week where we can discuss any topic no matter if it is health lifestyle or nutrition related on top of that by joining you straight away receive your comprehensive nutrition guide it is an ebook that teaches you the basics of nutrition but goes beyond as well and is catering to your personal goals no matter if you're keto primal paleo or even raw all right but this is it for today thank you very much for your support guys and as always much love and peace


Alright you guys, how are we? What is going on? Welcome back to the first episode of the top 10 greatest New Zealand All Black Rugby players of all time. I don't know if the title is going to be that long, it probably won't be. That's not going to be good for the YouTube algorithm. But look, we're kicking it off with the player that's probably closest to my heart, Daniel Carter. He's from Canterbury, which is where I'm from in New Zealand. He's an absolute legend. What I will say is that a movie has just come out called The Perfect 10 chronicling his life and his career. I haven't actually seen it myself, but I would say go and watch it if you do want to see a picture that's been created about this guy's life. I mean this guy went to Christchurch Boys High School, which was just down the road from me. In fact I wanted to go to Christchurch Boys because of the fact that the rugby pedigree is so good. Unfortunately I didn't get in and I ended up going to a co-ed school playing soccer through our high school, which is one of my biggest ever regrets. Anyway this video is not about me, it's about Daniel Carter. I've got a couple of stats here that I want to read out and then we're going to get into the video. The video you will see is an excerpt from this particular DVD called Legends of All Blacks. Daniel Carter born 5th of March 1982 in Leaston, Canterbury, New Zealand. Listed as 5 foot 10 or 1.78 meters, 96 kg, so pretty solid, 212 pounds. He was a fly half, number 10 on the field, although he did play a little bit of number 12, which is inside centre. Daniel Carter made his debut. He was listed as All Black number 1034. Daniel Carter played a total of 112 test matches for New Zealand, scoring a world record total of points of 1,598, which still stands to this day. Daniel Carter retired from international rugby in 2015. All I've got to say is what a legend. Enjoy this video guys. This is Daniel Carter in his career up to 2011. He played on for another four years after this point. Sorry I forgot some major details here, major details. Daniel Carter was named the IRB international rugby board player of the year on three different occasions. 2005, 2012 and 2015. He was also nominated on two other occasions in 2006 and 2008. Daniel Carter was also named an officer of the New Zealand Order of Merit, which is one of the highest honours you can achieve for his services to rugby. So you know, that's saying something. That was in 2016, the year after he retired from the All Blacks. The other cool thing that I just read is that post the World Cup 2015, apparently Daniel Carter declined an offer to head over to the States and become the kicker for the New England Patriots. I believe he may have disclosed that in his movie and also in his book. So guys, sit back, relax. This is Daniel Carter, Dan Carter, the absolute legend. Peace out. Dan Carter is the complete fly half. He has the speed and sidestep of a Barry John, the tactical awareness of Michael Liner and the defensive strength and goal-kicking ability of Johnny Wilkinson. He is the total package. After making his super rugby debut for the Crusaders in 2003, he became an All Black that same year, displaying an amazing composure at the tender age of 21 and this despite being picked at Inside Centre. He was included in the All Blacks 2003 World Cup squad but only came on as a bit-part player in the latter stages of that tournament. Here's the pass. Watch this. He was able to run into the gap and then the handoff. Well, I would say that Mark Taylor be feeling pretty sick on that handoff. It was beautifully done by Dan Carter. Look at this. The right hand right in the stomach, in the chest, should I say. 33 plays 11. The All Blacks in total command here. Carter. Weep boot. Carter can hear Wilson magic. Carter. Carter. What about Dan Carter? Unbelievable. They're celebrating as if they've already won the cup. They know that's a special bit of magic. There was nothing on yet. Carter managed to shrug two defenders, duck under, step off his right and go around untouched after he crossed the tri-line. Evans finds Rocker Thokker and Rocker Thokker is through. So for the second time in the match, Carter standing on the verge of greatness, although on this occasion, from a greater distance, can he go to the top of the All Blacks point scoring treat? He's there. He is there. Ball spilled forward and Messam finds Muli Ayina and here goes Toyava, keeps it alive and on New Zealand in with a try. Dan Carter this time and that was so clean, clinical, efficient from the All Blacks. Try number two. Look at the numbers. Muli Ayina to Toyava. Again, Lament comes in. Passed here to Dan Carter, Hugo Seifel in No Man's Land and it's just an easy try for New Zealand, back-to-back tries. Look at them, they're all there. Get away there, right tackle and move. For the break. Numbers on the right-hand side, numbers. And this is Conrad Smith chased by Shane Williams. A manufactured kick, great pace by Shane Williams to get back. The ball is still loose. Dan Carter for his second try. What a performance by the All Blacks. What a performer, Dan Carter. Shane Williams is on his own. The ball pops up. Watch this. They both struggle for the ball. Pops up in the air and it's usually the case. It favours the All Blacks and that Man Carter is there again. Ray Jane topping it back inside. Carter! And he's the basis for the tuck. Early step inside. Off-road initially from Dan Carter and Cody Jinn. Back from Cody Jinn to Carter. And what a finish. Stanley. And now the hands come. Beautiful plop there for him. Carter. Carter. So balanced. He's quick. He's making a mess of the world here. Dan Carter!  John Jones looking to get the ball away. Who's there? Mayor Lamu. Great energy from Mayor Lamu. Fight his way back in. Looks up. Who's there? Brad Thorne. Second row is there as well. But a 35-year-old. Great energy. And then hands. And that's it. Oh, 22 behind him. And there goes Carter. Again, he's finally finishing from close range earlier on. And this time from distance. All of four yards. Barks himself. And goes to ground very early as well. Carter has broken records throughout his career. Most notably when he overtook Johnny Wilkinson as the all-time leading point scorer in Test Rugby. Carter is a true rugby superstar who totally merits his reputation as maybe the best all-round fly-half that rugby has ever produced.


Everybody forced here ripping 2022 obsidian football hobby six-box half case number 21 random team style find the results anytime elite sports cards calm We'll go ahead and get started here. We go Sub Higley Let's pull one of those neon mojo's of like Tom Brady or something a good time or we can start with a red Deontay Johnson There we go off on the right foot for the Steelers here Five out of ten. I wish there was actual obsidian in these cards Hands just bleeding everywhere 16 to 25 rookie yellow Brian Robbins in june It's true. It's true bevo. It is it is volcanic glass Jalen Warren Steelers rookie is a spiller rookie and breakable jersey card chargers 88 of 125 12 out of 25 rookie eruption patch Bailey is zappy Final day of work. What happened Vaughn you get fired for talking about a retired NBA players birthdays all the time 900 points random to everybody at the end and sharpie lawn berks rookie dual jersey auto titans or sorry trail on berks 71 out of 99 nice hit for the titans though. I do like trail on Yeah, Vaughn, what you doing? Last day at work. What's your what's your new what's your new gig you moving down to work for lane sports cards? Do what sam did Orange the 75 naji harris steelers Vitrious Justin Herbert 56 out of 99 Oh, yeah, don't come here then.  I wouldn't be the only one Alec pierce rookie auto colts is 75 Oh man And george pickens what is going on with that autograph rookie jersey auto Steelers He's live at least Congrats Steelers still nice hits Yeah, I don't know if that exists for him although to be fair When I was bartending that never happens. It's kind of strange, right? Oh Got a purple christian Kirk to 100 for the for the jaguars And a gold flood falcons age eight surrel Every gold flood is a nice gold flood. He's a great. He's a great db too Five out of ten nice card falcons davis price ricky niners My home is the 75 patch card cutting edge chiefs to 25 joshpa shawl auto 93 magmatic auto for a 50 ryan taniel magma For the titans air into 75 patch auto a j dillon a j dylon for the packers Always does bebo you remember the you know, um No, if when you had polio, do you have the like the iron lung? I will have a literal iron lung after inhaling so much chrome dust 47 to 50 rookie green kulel shikir bills A contra just in fields They're not really circuit schematics. It's just a photo behind them. That's kind of just Super simple, right the patch auto's and stuff I don't know why they have that A zappy. I thought you meant like the actual background zappy ricky bass To 25 l t on the patch card. That's the major material. So that's definitely on that one. No patch card eclipse chargers l t muma muma muma a 2199 Jaguars ricky auto To 75 kenneth walker the third seahawks k9 seabirds Anton 99 packers romeo dobs ricky jersey auto i'll be i'll be rich in like 20 years gregg mesotheli chroma is what carl calls it mesotheli chroma orange davante smith to 75 birds davante adam is a 100 raiders bass ricky majai sanders cardinals Unbreakable jersey card ricky pier strung jr for the pats To 125 mclauren the 50 patch card two colors commanders. It's a while-looking card the white on this side the white there It's pretty cool. There you go commanders a son haskins to 199 ricky auto for the titans And as an editor to 175 ricky dual jersey auto for the falcons I got the chrome lung cup Called 1800 obsidian Orange bateman is 75 For the ravens drive to survive Orbital eagles jalen hurts to 99 98 of 99 99 99 minus 98 is jersey number. That's also what I call my uh drive home on i4 every night drive to survive Drive to survive. What's worse night or day?  I'm dodging people. There's like drag races Yeah, it's pretty bad bad Marcus mariota Unbreakable browns ricky jersey david bell to 125 To 75 michael vic jersey falcons I need something big here I need something big here to 25 ricky autos in mere white for the raiders And titans again to 175 ricky dual jersey auto malik willis this time 900 points random to everybody here four times three and one Top spot brings home the bacon here one two three and four Colts The international drive is frogger i4's drive to survive though.  Thank you very much everybody