Welcome back after a spring break, so it's been a while since we've been here, so it's probably going to take a few minutes for us to get back in sync with COP2 things. We are in the supplement. We have spent a couple days in the supplement already. In the bulk of this, we will finish, I hope, this week, possibly a little bit of it carrying over into next week. We have the second order linear homogenous differential equations. We've got the three basic cases. I think it would probably be wise today to take a look at each of the three cases because you're probably remembering that there were three cases but not necessarily remembering what those three cases are at this very moment. So we'll take a review of each of the cases. One of the problems that I had some flawed information on that we were solving for, I think we solved for K1 and then we tried to solve for K2 with some other data and K2 was eliminated because it had a coefficient of zero. I think I didn't actually find the problem, my source of the problem but I think I've got a way to make that work out so we can go back and revisit that. Usually when we cover this information and we use this equation which we had to use, we had to use that equation in the third case where we had complex roots to the characteristic equation. So this was the third case. We had complex roots to the characteristic equation and we put those complex roots up in the exponent position and they had an i in them so we had to simplify and then one of the formulas we used was this one. Characteristic equation, let's make sure everything that gets mentioned today we adequately review. Where's that coming from? Characteristic or as it's called in the little supplement it's called an auxiliary equation. So if we have an equation y double prime minus 4y prime what's the characteristic equation that goes along with that? R squared minus 4r plus 11. R squared minus 4r plus 11. And that's where we're going to get our roots, right? So it's all based on the kind of roots that we get. Do we have two complex roots? Then we fall into case three. We'll do an example here in just a minute. If we have a double root, remember that, that was case two. We had a certain type of solution based on the solutions to the characteristic equation and if we had two distinct real roots we had another kind of equation. So we'll refresh those in a minute. But there's our characteristic equation. If the roots were complex we had to use this thing right here to get it simplified so we had this new function in terms of sines and cosines. I probably should not let that go without looking at this equation. Let's look at e to the i pi. That's three pretty strange numbers put together all in the same equation. What do you think e to the i pi might be? Something really strange, right? e is strange, i is very strange, pi is kind of strange. Let's see what that is. So according to this equation that we used the other day e to the i theta would be cosine theta so theta is pi so it should be cosine pi. So everywhere there's a theta we replace it with a pi. Got a pretty ugly mess there on the left side but the right side is actually pretty easily simplifiable. What's the cosine of pi? Negative one. It's been spring break, right? Reading about that stuff and thinking about it over spring break a whole lot I can tell that in your faces. Then i times the sine of pi. Zero. So if that's zero that's gone. So e is a pretty strange number, i is a strange number, pi is a strange number but when you combine them in this fashion e to the i pi is negative one. That's kind of bizarre. Now the equation that you sometimes see as a result of this e to the i pi equals negative one since e to the i pi is negative one not often but I mean that's one of the more strange equations in all of mathematics because it's got some of the more important numbers that go all the way across all disciplines of mathematics. E, i and pi, one is a pretty important number because that's how we progress through our number system and zero. There's a pretty unique equation which I failed to use the other day but I happen to think about that. This tells you the difference between where you are at your age and where I am at my age. I think about stuff like this when we're not in class or when I'm walking to and from class in my office and I should have done something with that last week and I failed to do it so there's that one. Now I've actually seen this, I don't know if I'd go this far but this particular equation is one of the most beautiful in mathematics because of all the numbers that are in it. I see those faces too like not beautiful but it is pretty neat to have all those strange numbers in that equation. Alright let's look at some examples of these cases. This brought a sheet of problems. We'll put one up here I don't even know necessarily when we start what case that is. Can we prop that door open? I don't know if it's just me but it seems a little hot in here. Is that it? Yes. Okay thank you. Okay let's say we had this second order differential equation and we're trying to get ourselves reviewed a little bit. So I said we'd review just about everything today. Second order, why is this second order? Second derivatives? Okay linear. Why is it linear? You don't really see anything squared. We don't have a second derivative squared, a first derivative squared, the original function squared so it's all linear. Homogeneous, where'd that word come from? It's all y. It's all in terms of y's and y' and y' double primes but we're going to have starting tomorrow we're going to have non-homogeneous equation. It's equal to zero. So the fact that it's equal to zero means it's a homogeneous, now we're going to use that, we're not going to drop that and it's going to fall off the map starting tomorrow. We're still going to use the homogeneous part of a solution but if it's something that's not equal to zero we're going to have to kind of think about how it is that we get those things that aren't equal to zero. Right now we don't have to worry about them, we want to make them zero. So we go to the characteristic equation, probably ought to review this part too. What are these y things that have a chance of working in a second-order linear homogeneous differential equation? E to the rt. E to the rt or e to the r, we don't know what the other variable is, let's call it x here. Why do they have a chance of working because they are their own derivatives with some different coefficients in front as well as their own second derivatives, again with different coefficients out in front? What is y prime? And y double prime. And if we put them in the equation, which you don't have to do this but we're trying to kind of get reviewed on these things, doesn't have to be every problem where you do this. Now the fact that it is homogeneous, we're actually going to be able to get a solution we can factor out. E to the rx, remember this? Stuff from before the break, I hope. There's something on the test that I need to address too before we do a second review problem. Since we have the product of two things equals zero, that equals zero. Well, we're not going to get any solutions out of that. E to something is never zero. So there's our characteristic equation. It has a whole lot of similar features to what we started with. So we'll go about solving that and then we'll jump to the solution. So what are the r values that we could actually plug into that position for this particular example? R minus six, r plus one. All right, well I heard one and six and three and two. So let's see which... Minus three and minus two. Minus three minus two is going to work. So that gives us the minus five in the middle and their product is the six. Now if you use six and one, you'd have to have one positive and one negative, right? Which won't get us plus six. So we could get negative five in the middle but we can't get plus six unless they both have the same sign. So r one, if we want to call it that, is three. R two is two. So what's the nature of the solution here? What are the y? And it should be a family of curves unless we know some additional information which we don't on this problem. Interesting looks this morning. So while we're contemplating and pondering on this problem, I got an interesting email from a student that I taught in 1979 and he was going across the cable TV numbers and happened to stumble on channel 18, which this broadcast is on. And he goes, I found myself looking away from the TV screen so you wouldn't call on me just like I did in 1979, which is kind of funny that he was quite a character. I got a kick out of that. If you knew this kid too, you'd probably get his forties now but pretty funny. All right, that's plenty of time. A little off to the side there. Plenty of time for you to think about this. C1, I like that. E to the 3x. Go ahead. Plus C2x. No, that'd be a double root. E to the 2. Yeah. So this is case one, right? Two distinct real roots. So it's, in general, when you have two distinct real roots, that's what the solution is going to look like. So you put one of those real roots up here, the other real root here. If you don't have any additional information that's going to help us find C1 or C2, then we're done. That's it for that type.  Look familiar? I hope. Okay, let's see what happens. This one doesn't look very kind. So I'm thinking with that 13 there that this is not going to factor when we get to the characteristic equation. But let's see what happens. Okay, what's characteristic equation? Plus 13 equals 0. Thank you. Don't want to waste a whole lot of time trying to factor this one, right? Factors of 13. Not a lot there to work with. Certainly not going to give us negative 4 in the middle. So quadratic equation solves for the variable that's being squared, which in this case is r. Tell me what to write down. Plus minus square root 16 minus... 4ac, right? B squared minus 4ac under the radical. In fact that's how the authors of this supplement that you have, that's how they categorize the solutions based on what's happening with the B squared minus 4ac term. So if it's negative, which I think is going to be the case here, then we're into case 3 all over twice A. All right, what do we get under the radical? Negative 36. Negative 36. Negative means we're dealing with imaginary solutions or complex solutions. So 4 plus or minus square root of negative 36. 6i. And everything in the numerator can be reduced by 2, as well as the denominator so the end result is... So let's jump from here to the solution. I don't want to go to that one with this ugly stuff in the exponent position. We've already fought that battle. We've got another type of solution when we have two complex solutions that are conjugates of one another. What's that look like? 2 plus 3i? We could, but we had another version of that after two or three pages of squaring and cubing and grouping together like terms and putting in k1s and k2s. e to the alpha root. Well, we're going to get an alpha and a beta out of this solution, solutions to the characteristic equation. Alpha is 2, beta is 3. So what's the solution in terms of alpha and beta? e to the 2x. So e to the 2x, so e to the alpha x? In principle, c1 cosine of k1. Doesn't matter, c1 or k1 doesn't matter. 3x plus k2 sine of 3x. Does that look familiar? So it's e to the alpha times c1 cosine beta x plus c2 sine of beta x? Yes. You can use Caesar k's. I think we ended up with k's because we had some c1's and c2's and i's and we got rid of them and put in k's. So that was our case 3, right? Two complex roots. So you can go right to the characteristic equation, get the solutions, identify alpha and beta and go right to the solution. If we don't have any additional information, then we just leave it here. So I know it's supposed to be exponential type functions. That's what we started with when we were kind of building the characteristic equation. And then we found y prime and we found y double prime and so on. But we now have a way of converting something that's in this form into something that isn't just exponential in nature, but in a metric in nature. So that's why we end up with cosines and sines because of the equation that we had earlier in the class and before we went on break. So that's case 3. Two complex roots to the characteristic equation. So we're missing case 2. What was that? A double root. So real roots, but they are the same. R1 and R2 are the same. Let's see if I can find one of those real quickly. Characteristic equation? R squared minus 4r plus 1. Factored? R minus 2 minus 2. So R1 and R2 are the same. So this is case 2, double root to the characteristic equation. What did that solution type look like? C1 e to the 2x plus C2x. Look right. So that was case 2, double root. Both roots are real. So this is kind of the answer we would normally come up with if we had a C2 and we didn't put the x there. This term and this term would be the same. So they're redundant. You really don't need both of them. This actually has a chance of working and in fact does work because of the terms that are produced when you're finding y prime and y double prime because of the product rule. So because of how the product rule works, we can generate some more e to the 2x terms as well as x e to the 2x terms. They all have a chance of knocking each other out and you can end up with all this stuff on the left side dropping out and just having zero on the right side. All right, so there's the three cases. One of the things I noticed on the test, let's see what problem that was. This is one of the parts and this was problem 4. Yes, problem 4 had two parts. One where you approximated the solution using Euler's method and the other where you found the exact solution. So this was a separable differential equation. So I saw this error and if you see a big blue arrow in a capital no underlined with some exclamation marks after it, you're one of the guilty parties here and that's why I'm addressing this particular situation. If each problem is worth 16 points, actually this is part of the problem, so 4a was worth 8 points and 4b was worth 8 points. So 4b being worth 8 points, if I had my druthers, I would take off 30 points on the 8 point problem for this mistake. But I didn't do that, that would be unfair. But this is a mistake we need to, from this point forward, we need to avoid. So we want to separate. This wasn't the problem. We need to multiply by 1 over y squared. This is fine, everybody, that got to this point successfully. Now here's where the error came, where we integrated both sides. What you see on the left side never has been a natural odd. It's not today a natural odd and will never be a natural odd. For something to be a natural odd, we have to have that to the what power in the denominator, to the first power. This is to the second power. Has never been a natural odd, is not today a natural odd, and will never be a natural odd. So you can't develop this mindset anytime you see 1 over something, like 1 over secant, that's natural log secant, or 1 over Steve, well that's natural log of Steve. It doesn't work that way. The only time we have a natural log is when we have 1 over y, and we also have dy, 1 over u, and we also have du, 1 over t, and we also have dt. So when you see that y squared there, that takes it out of that situation. In fact, 1 over y squared is really y to the negative second, so some of you said to the negative first so that you were thinking correctly, if you saw negative first, and you also had derivative of that, then that's a natural odd, but this isn't. What is the integral of y to the negative second dy? Negative. It's a power rule, right? Don't we add 1 to the exponent? Divide by the new exponent. So if we add 1 to the exponent and divide by that new exponent, that's what we get, which drastically changes the nature of the solution from this point. If you add a natural log, you're going to exponentiate both sides. If you didn't have a natural log, which this is not, then you're not going to exponentiate both sides. So the solution is just completely different from this point. I think it's probably worth a couple of minutes to finish this one because of what some of you did. You did some flipping, which is fine, as long as you completely take the equation left side, flip it, right side, flip it. There could be a constant which will fuse into the right side. What's the integral of negative x dx? Negative x. And I'll put that constant there. That was a mistake that some people made. So there's our equation. We separated, we integrated properly on the left side. I hope. So why do the negative first over negative one is the same thing as some of you, which I would join in on that particular bandwagon. I would, seeing a negative here and a negative here in a constant, doesn't really matter. It's positive or negative. You could multiply through the whole equation by negative one. You don't have to. But if you do that, that's positive. This is now positive. And this is now negative, so you can just change it to another letter. It's an unknown constant. It's the negative of what we started with. You can still call it C if you want to. This is where if you which you don't really have to, to plug in the values and get a solution, but normally we like to solve things for y. So that's easily done on the left side by just flipping it. Now the right side, you can't just flip the two pieces. You got to flip the whole thing. So the right side is really this over one. Right? So we've got one over y. We've got a single fraction here.  Over one. Now if you flip both sides, you've got that. y over one is just y. And I think we know a point, right? That this goes through. Don't we have a starting point in problem four? Yes. When x is zero, y is one. So that'll help you find b. I think b in this problem is one. So if you plug in zero for x and one for y, it turns out that b is one. So you have this equation. And we want to know what is the y value. And in part a, we did the Weiler's method and we incrementally went by what? A half each time? No. A quarter? What was it? Went from zero to two, right? Our increment was a half each time. Our delta x. So when x is two, what is the y value? So there's a two plus one, which is a third, which ought to fit in with part a in the problem if you did that properly, which most of you did. You got point three zero for the approximation, which seems reasonable here that the exact value is a third. We approximated it using the tangent plane to the curve and we got point three zero. So seems like it's reasonable. So when you flip one side, you have to flip the entire other side. You can't just flip each piece. All right, let's get one of these and then we'll kind of see what it is that we're going to encounter in the next section and we'll kind of dive into the nuts and bolts of that tomorrow. That's a different look, right? Second derivative, first derivative, original y thing. So we can go directly to the characteristic equation, which is factor? Probably not. So what? Four plus or minus four minus four times one times five. Isn't it two? Oh, two, negative B. Thank you. Just testing you to see if you're awake here after the vacation. I guess I'm not a wing. So B squared minus four A, C, all over two A. Under the radical, we've got a four minus 20, negative 16, two plus or minus four I, all over two. So the final solution of the characteristic equation, so alpha's one, beta is two. We have y's and x's so we do want y in terms of x. Tell me what the solution is and then we'll continue with additional information. E to the x. E to the one x. C1 cosine 2x. C2 sine two. Okay. Got agreement on that? So we've got this information. Let's put it to use which will probably allow us to solve for C1 and C2. When x is zero, y is zero let's see what happens. So does anything disappear here? Sine of two zero would be sine of zero which is zero so that eliminates C2. Cosine of two zero is cosine of zero which is one. So we have C1 times one C2 times zero and what's E to the zero? Is one. So C2 times zero that's gone. Oh this is kind of good this hasn't happened on a problem yet but obviously it happens from time to time because it happened in this one. So we end up with C1 equals zero. So what's that say? Go ahead. Cosine that whole piece cancels out. That's right. There isn't one. We allowed for the possibility of C1 cosine two x but apparently in this particular problem C1 is zero and that term doesn't appear in the final answer. So C1 is zero. So at this point our solution normally we would have a C1 cosine two x here C1 is zero. So we just have what? C2 sine two x? Is that right? We might have the time today to do something. This isn't that different from the original solution. I mean it looks like there's a term that's gone. It's going to be drastically different. It's not very different from the solution that we had earlier. Alright so we found C1 it's zero. That term's gone. Now we need to find C2 we've got additional information and that is up here when x is zero the derivative is one. So now we need to take this equation right here and take the derivative. That's a little bit easier now that C1 was zero. So it's gone from the equation. What's the derivative? First times derivative of second. Derivative sine of two x is two times two cosine two x. Is that right? Derivative of sine of u is cosine of u du. So there's the du. So there's first times derivative of second plus second times derivative of first. Derivative of e to the x is e to the x. So there's a product rule made a little bit simpler because C1 was zero. So what is supposed to be the case when x is zero dy over dx is one. So for y prime we're going to put in one everywhere we see an x we're going to put in zero. What about that second term? It's the gone. Right? Because sine of zero is zero and it's multiplied by two other things so that's all zero. E to the zero is one. Cosine of zero is one. So we've got one times C2 times two times one, which is what? Two C2 C2 is one half. So our final answer e to the one x, e to the x C2 which is one half sine of two x. Let's analyze this just slightly and then I want to adapt what could potentially be a solution and then see what you think the graph would look like. So if we were to ignore this e to the x what would this thing look like? One half sine of two x. What's the amplitude? Right. How far up down it goes from its axis? Be a half, right? Amplitude is a half and the period is it's affected inversely by the two so it's half of what it normally is. So normally the period of sine is two pi, now the period is pi. So we've got this oscillatory function, if I ignore the e to the x, we've got this function that it's a sine so it goes up to a half down to negative half, up to a half down to negative half and it goes through that full cycle every pi radiance because of the coefficient two. Now what would that do to it? Can't we kind of loop that together in a way with this one half and say that's now the amplitude, right? e to the x each time is going to be a number as x gets larger, e to the x gets larger so this would have a varying increasing amplitude, right? As x gets larger e to the x gets larger so if we had an increasing amplitude this is kind of unrealistic that's why I want to change the example so our first amplitude is a half and then the next time maybe we're down here and the next time we're up here. I think if you were designing a bridge this would be a problem if you were a bridge designer and the amplitude as the force kind of increases on the bridge the bridge begins to kind of move a little bit and then as time goes by it begins to move even further, not a good bridge right? That bridge in fact will not be a bridge it's pretty soon down the road here so you want what to happen with vibrations like this. You would want a lead coefficient instead of being e to the x you would want it to be e to the negative x right? If you had a lead coefficient what would that do to the oscillations or the vibrations? Wouldn't they get smaller as x gets larger? Doesn't this get smaller as x gets larger? So if your first one is up here your next one is here the period stays the same by the way this is why when the battery watch goes down it doesn't do a bad job keeping time it still keeps time it just kind of gets to the point where it doesn't move things anymore so the period stays the same that's what we would like to happen with vibrations for them eventually to diminish where they dissipate and they're gone we don't want this to happen this is trouble this is expected so if we had something out in front that would cause the amplitude to diminish that would be a good thing here's the amplitude there it is there it is and so on so it's getting less as we go let's finish up today with this and we can just start completely new in 7.8 tomorrow with the non-homogeneous let's say we had an equation let me try to keep this pretty simple so we've got some sines added to some cosines and of course now we've got some coefficients out in front but let's say that coefficient is zero or is one if it's zero then we can just go home now because it's not very interesting but if it's one now sine plus cosine I don't know if you've ever used this technique but sometimes it comes in handy let's split this up into two pieces one piece is the sine the other piece is the cosine because we know each of those pretty quickly and then we'll just add them up on the graph so let's take it through one cycle and hopefully we'll see enough of it to at least say that it's believable so let's do the sine of x sine of zero is zero pi over two is one pi we're back here to zero three pi over two alright let's do cosine cosine of zero is one then it's at pi over two it's down to zero at pi it's negative one then back to zero and then here now we've got the sum of these two can't we just add them up graphically at individual values the answer to that is yes we can so at x equals zero let's add them up where are the two individual pieces one and zero sum is one zero plus one added together is one let's actually do this point right here at pi over four the sine of pi over four is square root of two over two the cosine of pi over four that was kind of funny the cosine of pi over four is even funnier it's also square root of two over two what do you get when you add half the square root of two to half the square root of two you get the square root of two so it's this distance added to itself which would be roughly up there alright let's move on to pi over two we're adding zero to one which is one hope my graph's decent here I don't know here we're adding positive square root of two to negative square root of two what's there sum would be zero, one's positive one's negative so if you add them together you get zero zero plus negative one is one here's negative square root of two over two added to itself which is negative square root of two here's zero added to one positive square root of two over two negative square root of two over two we'll add those together and zero added to one So the black marks with the X on them should be sine plus cosine, I just added them up graphically. So we added two functions that individually are oscillatory functions. Is there some also an oscillatory function? Is it oscillating with the same kind of peaks and coming the same period each time we go forward to the right? It is also oscillatory. So it's not that different from a sine or a cosine. In fact, we don't have time for this today, but we'll get an equation tomorrow of what sine plus cosine actually looks like. What's the period by the way? Does it start to repeat itself in exactly the same space that the sine and cosine repeated themselves? Sure, it kind of almost has to, right? Aren't we repeating the same values here that we were here? So we're going to start the same cycle all over again. So our final graph is oscillatory also, just like the two components of it. So if you eliminate one of the components, it doesn't make it that much different than if you had both of them present. So we'll do slightly, slightly a little bit more with this, but that'll at least make it believable that we can eliminate C1 or C2 and get the same answer. See you tomorrow.


Hello, my name is Jason Ray and I'm a neurologist at the Alfred and Austin hospitals in Melbourne and an early career researcher at Monash University through the Central Clinical School. I'd sincerely like to thank the selection committee as well as the donors and sponsors who made it possible to support our work. Our project is investigating the safety of CGRP monoclonal antibodies, which is an exciting new preventative treatment for migraine by exploring any possible off-target effects that these medications might have on the immune system. The works hopefully going to further inform clinical practice worldwide and ensure the ongoing safe use and any monitoring that's required for these medications. Thank you again.


All right new shot here With reference no sound This is early blocking here or just blocking Focusing on posing. I'll like it Definitely a fan of Just that elongated moment there a nice pose for sure That's all clear too careful on like passing poses like this where I like this a lot And we're kind of missing it where I think you can rotate that character around a bit more And even because of the color silhouette you can even have That elbow in front of the body, but you're meeting like the shoulder area chest area stomach and then your your arm Bend over there kind of way I have it here totally work because I like that that hand Because that way it's not just Like that would be a nice graphing of what he's about to do to match that hand is here and then it grabs or goes for the Saxophone here, I will probably lower it just a bit more to to get some negative space there It's a bit too compressed for me and then This is going to be tricky.  So but here you're gonna have a very strong. What is this should I yes? Which I like it as a contrast, but watch out. It's very strong You're gonna need one or two more breakdowns there to kind of soften that I would separate these again in terms of kind of avoiding tangents Same thing here just that connection on the thumb is you just bring one arm lower and one stays up there And even that could work when he was Might be a bit fast, but it could work it could work. I'm not not really anything out yet I'm a fan of this just because with the the tilt You're taking the reference in pushing it and I like all the posing the line of action the asymmetry But then we get to this and it's a bit of the dreaded W pose. It's very even though there's a change here It's it's fairly mirrored and even here And I I would have On even on that drop here instead of landing here already. I would already have a turn So that your lowest position is already getting into this so that we have more of a three-quarter Asymmetrical view versus that's again very mirrored so if he goes It could be like what is we doing in reference going? Okay, it's calm down bomber. Okay, so you can still have a Where this is more like Maybe up and maybe have a little gesture like ah like a like a grabbing and then that's just Could be that low. It could even be just only one like I wish and then he can just snap One arm back on his way down to here and that's where he rests a bit and then he goes into this which is fine I like that surprise move in here Which could work it's a crazy term of the face when you're covering the face It's gonna I was wondering what if he kind of shows up like We have an arc there instead of straight up, but it's not too bad because I like the slight twist a little bit I think that helps and here. I don't I don't know for this. It's also spirit so subjective I don't mind the Symmetrical nature here and the mirroring opposing. There's just something worth like Don't mind even though we're a bit close here. So you probably have a slight turn in his spine It's what this arms bit a bit higher that elbow Only so that to me it seems like or you do the opposite Maybe this way the way he will grab it. How does he grab it? There goes this way Yeah, to me instead of going straight up because it's funny to go straight up like this where it just kind of peers Doing you have any reference but we don't quite see the bend that you have in your body where it's like this like and It's a tricky thing when you have something rotated to or away from camera in a such a flat pose So you might consider something where that is the Reveal but by the time he's there What if he took a step and I mean he can also be here and Have a bit of a oh what's over there pose You can also have a bit of a side pose where maybe here and we can see only one leg But he's a bit more bent over Remember you have a nicer arc and then we can have arms here even if it's just a little bit But even if just a tiny bit so we can bring that elbow a bit higher that could work This one watch out. This is a bit tricky Given that it's hidden and the bend is so straight I would try to find something where you're a bit more bent like that and even here bent like this And even that gets a bit muddy there's a silhouette. So what is doing? He goes up straight into this. So that's a good one So to me, it's just these two poses where you want to show the structure of the arms a bit more even here why not just bend it like Beckham and If one arm is covered by this, I understand but one would be to speak cleaner That's fine. Of course.  You might also instead of a Forward move a coupe a da da da stop and then imagine he goes That place backwards. He goes. Oh, oh, it goes a bit backwards and down That's like a super, you know subjective picky thing here But that could be something but other than that As you were asking about the posing. I think this is all very very cool again picky things like you could have the the Stick here. I'm losing my English the cane Maybe here. Hey, so it doesn't have a tangent, but also kind of has a Line that is diagonal towards this like everything goes back to to this Like you imagine you even bends the head down a bit more if you want exaggerated more as well So you have the cane everything is pointing and going up to the head which goes back into this I Do like I just let's it go Yeah, and the other poses I talked about yeah, I don't know that's kind of that hope that helps It's really fun. I can't wait to see this playing down and that's it from me. Thanks Alright, there's an email you can sign up you can start whenever you want you can submit whatever you want You get 16 submissions either way a like and subscribe would be awesome. All right. Thank you


American State Propaganda – a thought experiment. The New York Times has published another CIA press release disguised as news, this time aimed at whipping up paranoia toward anyone who criticizes the US proxy war in Ukraine. The article is titled, Putin's Next Target – US Support for Ukraine, officials say. Its author, Julian E. Barnes, has written so many New York Times articles with headlines ending in the words, officials say, that we can safely assume the primary reason for his continued employment in that paper is because empire managers within the US government have designated him someone who can be trusted to print what they want printed. This designation would make him a reliable supplier of scoops, read, regurgitations of unevidenced government claims, for the New York Times. American officials said they are convinced that Mr. Putin intends to try to end US European support for Ukraine by using his spy agencies to push propaganda, supporting pro-Russian political parties, and by stoking conspiracy theories with new technologies, Barnes writes. Of course the report never gets any more specific than that, and of course the American officials Barnes cites promote their unevidenced assertions under the cover of complete anonymity. The American officials spoke on the condition their names not be reported so they could discuss sensitive intelligence, Barnes writes. The only named source cited in the article is a CIA veteran named Beth Sanner, who says that Russia will not give up on disinformation campaigns, but adds that we don't know what it is going to look like. And that's really the whole article right there. Putin is going to be using his spy agencies to promote political parties and messages which support ending the practice of pouring billions of dollars of weapons into Ukraine, but nobody knows what that will look like exactly. So we all have to just be sort of generally distrustful toward anyone who doesn't think it's a swell idea to perpetuate a horrific war with potentially world ending consequences. Because they might be part of an unspecified Russian influence operation. We saw a similar report from CNN a few weeks ago, in which the public was warned that Russia's FSB is working to convert Westerners into mouthpieces for Russian propaganda using methods so sneaky and subtle that those Westerners wouldn't even know it's happening. Again, details were extremely vague, and the only obvious response to the information provided is for everyone to just get really paranoid toward anyone saying anything that doesn't support current US foreign policy toward Russia. As a thought experiment, imagine what it would look like if the CIA or some other agency wanted to advance US information interests by making the public distrustful of any people or information which go against US strategic objectives. Try to imagine some of the things they might say or do. Do you imagine it would look much different from what we're seeing currently? Feeding trusted mainstream news reporters extremely vague stories about the Kremlin trying to deceive people into opposing the long-standing agendas of the US intelligence cartel, using online media and social subversion. Can you think of a more effective way to help shore up trust in your preferred narratives and so distrust in narratives you do not prefer? Here's another one. Imagine a state media outlet for a tyrannical dictatorship. Think about how its news stories are made, how it would often take orders from the government on what to report and what not to report, and how all its printing or broadcasting would always align with the information interests of that government. Now ask yourself, in what material way is that reporting different from these CIA press releases we're seeing from outlets like the New York Times and CNN? In both scenarios the government is feeding the media information it wants printed, and in both scenarios there will be consequences if the media don't obey. In our hypothetical dictatorship those consequences might be more severe, but in our real-life scenario the consequences are no less real. If Mr. Barnes had refused to work on this story, he would have lost his scoop and it would have been given to someone else, perhaps at a competing outlet. If Barnes ceased uncritically reporting on evidenced assertions from anonymous government officials, his prominence in the mainstream media would quickly fizzle and his career would dry up. If the New York Times ceased functioning as a reliable outlet for the credulous printing of unevidenced government claims, then the government agencies who've been elevating the paper to prominence with their artificial scoops can take those hot stories to another competing outlet and let them get the subscriptions and the glory. In both scenarios the government is able to get its propaganda messaging printed as hard news reporting. In one scenario the reporter reports what the government wants because they work for the government. In the other scenario the reporter reports what the government wants because that's the only way to have a career in media outlets that are owned and controlled by the plutocrats who benefit from the political status quo the government is premised upon. The only major difference is that in our hypothetical dictatorship the public probably knows it's being fed propaganda and is therefore more likely to take what they're being fed with a grain of salt. In a tyrannical dictatorship the press is operated by employees of the government. In a free democracy the press is operated by employees of the oligarchs who operate the government. In both cases you're getting state propaganda but in one of them the propaganda is disguised as objective news reporting.


So my name is Matt Porat, I'm the platform manager for LMS. And I just wanted to give a couple of really quick updates on a couple of things that the team have been working on. Like last sprint, I thought I'd just pick out a sort of a security highlight and an admin highlight, which is not the only things we've done this sprint. The team have done a whole bunch of stuff in both of those areas, but I just like sort of showing things that I think are particularly cool, even if they are particularly nerdy like this first one. So in integration at the moment, it's almost over the line. We've got the tracker to make our web service tokens only display once to the user. So basically the web service tokens are what you use to authenticate when you're using Moodle via a web service. And so they're more or less a password is another way of looking at them. So with this change, as you can see in the screenshot, when you generate one, you get to see it once and then that's it. If you sort of refresh the page or never get away, it goes away. This makes things a bit more industry practice. It does things like mitigating accidental exposure. So you can't just accidentally expose it to the person sitting next to you, which is never a good idea of doing something like that. And yeah, it's treating APIs like passwords. So that's in integration review at the moment and it's looking quite cool and be good to have. It also allows us to take a next step, which is actually not storing them in plain text in the database. We'll be able to hash them the same way as passwords. So there's a follow-up tracker there for that, which I made about half an hour ago and I know Juan's already said that it's a great idea on it. So I'm glad to be able to keep people happy with it.


And then I read a book called The Intelligent Investor. There's three big lessons in there which relate to your attitude towards stocks generally, which is that you think of them as parts of a business, and your attitude toward the market, which is that you use it to serve you and not to instruct you, and then the idea of a margin of safety of always leaving some extra room in things.


Good morning. Yay. So welcome to the Container's Day Room at Fuzzdom 2018. Just a few things before we start. So that's the current schedule. I think everyone is in it online. We're going to have a five-minute gap between each talk so that speakers can just switch quickly. This is not really meant as a time to answer questions. You can still answer questions, but please unplug your laptop so the next speaker can plug in and get things going. Other things, the mutual fire safety thing, everyone must be seated. Nobody can be standing in either of the staircases or in front here unless you're the speaker. That's almost it. This year's Dev Room is organized by Serge Halen and myself. I'm Stephen Grober from the LXD and LXD project. We've gotten some help reviewing your talks by Tycho and the son of Adam Christian Branagh. Hopefully you enjoy it. And we'll get started right now with Joshua from I was going to talk about the state of containers in scientific computing. One more thing. For recording purposes, we must make sure that we always start exactly on time, so even though we've got four minutes right now before the first talk, we're just going to wait four minutes and watching online and whatnot are not going to end up missing part of the talk.


In the heart of Alabama where communities thrive and families flourish, there's a trusted partner with practical solutions for a better world. Alabama Extension equips farmers in the field and supports health in the home. Our experts extend knowledge and improve lives. We're growing food for our community right here in the city. We're gaining the confidence to become the leaders of tomorrow. We're here to help you grow and succeed in all aspects of life. Discover Alabama Extension at ASIS.edu.


Hi everyone going to show you a quick video on string formatting handy-dandy tip Came about in one of the newer versions of Python for working with strings when you want to print them out and trying to get Them to look right so we are working on string formatting right now I'm in my pie charm editor and As you recall strings are sequences of characters Wrapped in single quotes or double quotes, right? So strings are a great way of capturing data So for example, I'm going to create a variable and assign to it my name as a string, right? and I will also create a different variable which is an age and assigned it an Integer value so pie charm is nice. It highlights the different variable types in different ways But very simply here's a nice string, right? So now let's say we want to print out this string or this combination of information, right? so I want to print to the screen to the console something like hi, my name is Give me the value of name And I am age Years old that's what I want to get out of it Okay, so you may have learned a couple of different ways to get This printed to the screen using the values of these variables So one option is to do something like this We want to print and when you print you usually are printing a string. So we want to combine The string we want to print with this other information So hi, my name is and then you may have seen something like plus name right the plus operator When paired with these two things? This is a string. This is a string plus means concatenate bring them together Hi, my name is plus name and Then continue with what I wanted to say and I am and now I want the age in there.  You can right-click Run string format. I am going to use the keyboard shortcut control shift F10 and This did not work for me, right? Can only concatenate string To string not an integer. So it's screaming at me here. Python's very unhappy Because I did this poorly. It's mad because this thing age is an integer and The rest of this stuff is a string and it's telling me it's trying to tell me here I don't know how to concatenate an integer to a string. I just don't know so one solution is to cast This age this integer value to a string and now it will work Okay, no big errors, but you can see it's kind of strangely formatted here And that's because I forgot my white space around here This is a very clunky way of dealing with this. I have to worry about my white space. I have to worry about Maybe trying to put things in my string. I want to print out that aren't strings Not great solution. There's another solution a little bit better We can do it this way print hi my name is Okay, and now I'm going to put a comma here and The variable name Okay, so what this will do. Let's just run it This printed out hi my name is and then by doing the comma and the name It gave me a little space and it put the value in here for me. So it's not I Am not explicitly concatenating a big string like in this one The print statements doing it for me and that makes things a little simpler Because now I can keep adding Parameters to or arguments to this function and what's really cool about this way is I can put age in here And I don't have to worry about Converting it to a string it worked just fine, right? I don't have this wrapped in a string. So this is better Better solution.  Argument into a string and I'm putting them together separated by spaces. So that's nice. That's pretty good But what's even better and what I really want you to use is what's called an F string or a format string F string The way we make an F string is we are going to put F right here and then we're going to build our string inside it So let me start hi my name is and now here's the cool part. I'm going to put squiggly braces here squiggly braces and inside these braces I Can put an expression in this case. I'll just put the name variable Hi, my name is name value of name and I am Squiggly braces age years old Okay, so let's run it Here's the third one right and the cool thing about this is so because it's inside these squiggly braces it got the value of the name variable out and Converted it to a string it got the value of the age variable out and converted it to a string And the nice thing is the string is right here. It's all together. It's all in one place I don't have these little I don't have these plus signs these extra spaces this these commas and things that we have in this example Looks nice, right? So this is what I want you to get in the habit of doing if you've got a print something and you need to print a value of something Use one of these F strings. Okay. It's all there is to it They're also pretty flexible you can do more with them and it doesn't just have to be when you're printing You can format strings anytime. So let's see an example here. So let me create an empty list just for the heck of it and In this empty list, I am going to append a value to the end of my list I can append a string to the end of my list, right and I can use an F string So let's append let's create a string where it's got a name and then the age, right? So when I run this it's going to take the value of the name variable, which is Lucas and the value the age variable create a string That looks like named age, so it'll look something like like that and Append it to the end of the list okay, let's uh Let's print the length of this list and then let's print the first item in the list, which is at index zero Okay, so here's the string I inserted into my list and the way I formatted it was using this thing Another really cool thing here. Let me do this down here. Let's add another String to our list. Let's append another value You can make these expressions Inside these squiggly braces Complicated you can have them do calculations. So let's say I want to add on something to this so print name Plus I'm going to do some string concatenation here uh layman Now it's mad at me because Why is it mad? It's mad because I've got double quotes out here And double quotes in here. That's a no-no Double quotes it thinks that this double quote goes with this guy and that's not right Let me put single quotes that'll fix the problem Okay Name plus layman. So inside these squigglies It's going to take name and then concatenate to that string layman and then for age We can do a calculation age is an integer. It's 30. Let's be more realistic and add 10 to that Okay So this will append this new string that we've created and let's print it to people sub one There are two things in here now Right, so here I've got I created this string Appended it to the end and you can see I did some extra evaluation in here All right, all this is doing all this f string is doing is giving me back a string that substitutes Variables whole expressions figures out what they are and then turns them into a string very handy Even if you're just using it simply get in the habit of using f strings You


I have centers in my classroom that are based on math, reading, writing, STEM, which STEM stands for science, technology, engineering and math, as well as fun centers like a block center or a home living center, a library center. There are centers in my room that are locations, so I specifically set them up so that the kids can go to that center, grab a basket, grab an activity and do the skills necessary at that center. I also have mobile centers and that would be something that is put into a basket or a bin and the kids can move those centers around the classroom. Every once in a while I'll take centers and put them on a tray, move them to my seating area and have the kids focus on doing the centers as a whole group. Other times during the day, like stop the world, I have my students pick a center and they focus on the center just for themselves.


Thanks Chirath. So today I'll be talking to you about securing Kubernetes. So in this session I'll be talking about from a point of view of an attacker and how an attacker might try to sabotage a cluster and how we can prevent it. So as the first slide I'm introducing you to the area of attack when it comes to a Kubernetes cluster and at the bottom you can see infrastructure as cloud which is basically where you have your data centers, your firewalls, your network and servers and in the next layer we have our cluster where we have our back authentication authorization then we have admission control and we have network policies. On top of that we have containers where we have container sandboxing, image restriction, privilege, escalation, supply chain etc. And finally we have developer discipline as the code base layer. So let's look at the first scenario. Attacker has access to your network. So now the attacker has somehow found a way to find your network and now how can you prevent that? So basically if you're using cloud you can basically use SSH based key auth and then you can make your Kubernetes API private to avoid these attackers or intruders discovering your API and try attacking it and then you can have a firewall, you can secure your network through a firewall and then you can have proper RBAC policies implemented in your cloud and also in your cluster. The next scenario is attacker has access to your Kubernetes control play. So now the attacker has somehow gotten through your network and now it has access to the infrastructure of your Kubernetes control play. So before jumping into what we can do let's just go through a few slides on how you know what Kubernetes RBAC is and you know who can what things are. So on the first slide we have on the left we have who can access. So in Kubernetes we have two types users and service accounts. Users are for humans and users are someone with a cert and key and the certificate is signed by the certificate authority of the cluster. Cert is managed by external to the Kubernetes and it's not a resource in Kubernetes really as I mentioned it's handled externally and then we have service accounts. So service accounts is for processors it's not for human use but rather when there's a pod or some other resource in Kubernetes trying to talk to the Kubernetes API let that be a worker node let that be a pod CRD whatever they need a service account to access the API. So these are the users in a Kubernetes API and then comes permission. So as you can see on the right hand side we have two kinds of permissions one in blue is called role and the one in orange is called cluster role. So as you can see the role is namespace bound so when you create a role it only affects a namespace whereas when you create a cluster role it's rather global in Kubernetes it's accessed across all the namespaces in the cluster and then to bind this role into a user or a service account we have something called a role binding. So there are two kinds of role bindings one being the name role binding itself and the next one being the cluster role binding. So role binding is also namespace bound and when you have a user you can bind a role to that user in a given namespace and that role can either be a role or a cluster role but when it's a cluster role binding it's it's more advanced and it's more it has a lot of privilege because it's it doesn't scope into a namespace it's therefore the entire cluster so when you do a cluster role binding to a certain person on a certain permission the person can access that permission across all the namespaces in the Kubernetes cluster which is a bit dangerous. So we'll look at an example in the next slide here we have John who is who can do read secrets in the full namespace and there's a role called read secret role in full namespace and you can see on the slide that there's a read secret role binding to John who which gives John access to read secrets in the full namespace that is all right. Then there's Jane so Jane needs access to read and write secrets to the full name space however read and write secret is a cluster role we have created for some reason and in this scenario we can still create a role binding to the cluster role which is read write secret to Jane which gives the correct access to full namespace but now then look at the admin user. Admin user we have given admin user read write secret cluster role binding which means the admin user as you can see from the red dotted lines that they can read across namespaces of all the secrets that there are on the names all the namespaces available in the cluster so this can be pretty dangerous if you don't properly give access so it's recommended that you use role bindings and roles instead of cluster role bindings so hardening a Kubernetes cluster we already spoke about our back policies and how to set it up the next thing you got to do is enable audit logging so when a disaster or something has happened someone has access to your cluster your best friend would be logs so you need to enable audit login to figure out who did what on your cluster so that you can trace what has happened and you know come to a conclusion the next thing is you got to run CIS benchmarks on your cluster this is mostly applicable for the clusters that you have done from scratch on your data centers etc because cloud managed clusters GKE AKS EKS this already has CIS benchmark reports on them it's managed for you but if you are managing your own clusters if you're managing your control planes run CIS benchmark and do the recommendations that they have given the next one is this is applicable for the clusters in cloud as well manage clusters as well use a CIS hardened image so by default when you get a GKE or AKS or EKS cluster they provide you a simple node a node with a Linux runtime and container d runtime for image for containers but you can have CIS hard node images which has more second profiles of power profiles installed big deep within to the image node image itself which would give you more security the next thing is encrypt XED doesn't matter whatever the security tools you run you might be running runtime security sandbox you might be running everything but if your HCD is not encrypted in your control plane any attacker who has access to your control plane should be able to easily look at the key value store that HCD provides and then read from it and get your secrets same goes for your secrets so the common recommendation is I mean 12 factor app store us to inject variables as environment variables that's not the case anymore now you have to mount them as files right so attaching environment variables can leak your credentials to someone who has access to the VM so don't do that mount your variables as a file and then read it read from that file let's go to the next section attack has access to a club to a service account in your cluster all right so now attack has coming now it has has the control plane access and somehow it has access to talk into your Kubernetes API with some permissions right so we stop that first of all let's look at network policies the concept of network policies is as you can see on the example here we have a web server in green a Python backend and a database and as you can see there's no need for the web server to talk to the database only the Python backend needs to talk to the database and on the the on a separate namespace we have something called a super important API right by network policies what allows us to do is we can specifically say which pod can talk to which service right so we can specifically say web server cannot talk to the database web server can only talk to the Python backend and Python backend can talk to the database so if somebody has exploited web server and easy it has access to the web server they won't be able to write directly to the database they won't be able to access the database they and then if somebody goes and you know comes and gets into the Python backend of course then they have access to the database but still because of network policies they will still not be able to attack the super important API we have on a different namespace right so that's what network policies allow us to do and by default you know you have to use a cni a container networking interface plugin on Kubernetes that supports these network policies network policies can be at many layers so common leads at TCP4 but layer 7 network policies network policies supporting CNIs are there such as Celium etc so it's up to you to figure out which to use let's move into the next slide so as I said so the first thing is you got to use namespaces to isolate your tenants on the network then use network policies which is the Kubernetes equivalent for firewalls then it's added advantage if you have an API gateway you can even make the inter-service communication go through an API gateway if you're using a service mesh use mtls or you know if you're using a service mesh that's powered by ebpf in a network encryption etc happens by default you can do that so that's great that means no one who has access to infrastructure cannot overlook your network and figure out what's going on finally there's something called admission controllers on Kubernetes so there's open policy agent key bro etc which allows you to write policies on Kubernetes your Kubernetes cluster which I'll explain in a bit more in a later slide so now attacker has access to your code base now if an attacker has access to your code base attacker can do a lot of things they can insert malware they can insert vulnerabilities and exploit them later they can they can do a lot so to avoid this you can do a few things first one is of course static scanning with your CI pipeline you can do sonar cubes can etc and figure out if you are committing any sensitive information to get which is accessible by anyone if it's public and then you can do code vulnerability scanning as I mentioned and then you can you have to keep scanning these it doesn't matter like today you scan it it's all good everything is green but I mean there could be an exploitation or a vulnerability discovered tomorrow so you got a scan you know on a on a daily routine or on whatever the preferred way that you you do then goes image vulnerability scanning so here we our images might contain vulnerabilities this also again you got a scan at a at a interval or a duration you can't just scan once and if it's okay you can just forget about it right you gotta scan continuously and you know exploiting and a vulnerable image could lead to you know privilege escalation someone can get remote shell access your information could leak someone could give your DDoS attack within the cluster I personally use Claire but people use 3v and any other tool you can do to use image vulnerability scanning and then there's another one called configuration scanning so configuration scanning is you know when you are committing your yamls to your GitOps repository etc you can easily check them via check or or something else and see if you are missing anything if you are missing a trick if you are missing any any configuration security configuration or a policy so it allows you to it gives you feedback and you can can fix them and you know secure your pipeline so let's talk about Kubernetes admission controller which I promised I talked in the previous slide so let's see what what it does so in this scenario there's a create pod request by a user so when that request is gone to the Kubernetes API via Cube CTL what happens is firstly it tries it figures out who you are right then it goes to the authorization what can you do can you actually create a pod then finally there's something called admission control so in admission control there are so many policies even we can write our own policies in this scenario what here what it's gonna look at is whether you know have had the pod limit has been reached on the given ns whether you are able to create a pod or not so admission control has two types when we plug in we have something called validating webhook and a mutating webhook so validating webhook is a red only type where you can it scans a given request and it just tell either allows it or denies it this is perfect for you know third-party policy controllers like open policy agent or something else so here you can give any additional policies like don't pull images from you know public Docker right pull images only from your private Docker registry so you can give these policies and it would automatically deny at the admission control level when you give that from policy via a third-party policy controller or you can write your own validating webhook for it as well then that's mutating webhook so that's a bit different so it changes the payload dynamically this is mostly used with CRDs and you know controllers that you know work with this operators that CRDs so here you give a payload and according to some some logic it changes the payload dynamically and applies to Kubernetes in a different man right so that's what Kubernetes admins admission controller does and this would allow you to write your policies and secure your cluster right the next step is now the attacker has access to your container somehow they have exploited your container now they have a shell that they have a shell access and now let's see what we can do so when it comes to container hardening when you're building the container itself there are some best practices that you've got to follow first thing is remove the bash right so that they won't be able to access a shell remotely make the file system read only so that they won't be downloading anything or writing anything into your container file system and then make sure the user is running as a non-root user so when these are done it it's hard for us to you know for an attacker to attack and you know exploit a container so basically make a container mutable then there are other things that we can do there are images which we don't have access to you know to change the image right there are scenarios like we don't build the image somebody else built it we only run it so in those scenarios we can use Kubernetes without changing image to enforce immutability so we can run this this thing called startup probe in Kubernetes where a container is running you can run some script before the container actually starts running using that we can remove bash if you want to and we can set like run as group run as user and as non-root set security context remove privilege escalation can do a lot of things so by using those we should be able to make the containers immutable at a Kubernetes level as well then comes runtime security doing all of that is sometimes not enough and you need more let's look at how containers work and what this runtime security means right so as you can see in a VM when a container is running it's running at LXC on top of LXC and then we have Linux kernel at the below right so basically a container is a you know group of namespaces and C groups so when containers are making this doing things it does syscalls to the Linux kernel so say that means if there's a vulnerability in the Linux kernel the container should be able to exploit it if someone with the proper knowledge and tools are there so first thing to do is as I mentioned earlier disabled privilege escalation and drop all the capabilities of a container and then only add the things that are needed using Kubernetes constructs and there are there are things like uparm and seccom profiles which restricts the syscalls that you make to the Linux kernel so that you know you don't make any weird ones and you know try to exploit your kernel then there's container sandboxing there's firecracker there's gVisor there are few out there which is you know a lot makes makes this issue go away but on top of it adds more performance issues but still it's it's great if you're running a multi-tenant system and if you don't trust the images then there are tools like sysdig Falco etc which monitors the anomalies of the container on time and then gives you alerts like this is happening stop this etc right so that's continue runtime security for you so you got a concealer information this is something I told earlier as well I asked you to do not mount inject environment variables but rather do them as file mounts and when you're doing that it is recommended to inject wire secret manager at runtime don't save it as secrets and Kubernetes itself base 64 is not an encryption so use hushikov vault or Azure KVAWS secret manager google there are so many secret managers out there use one of them and then inject your information sensitive information as files to the container at runtime you can very easily do that with those technologies and I already told make your container root the system read only and this is a developer discipline do not lock sensitive information so comes to the final thoughts Kubernetes security is still new and you know vulnerabilities get discovered every day and then they get patched frequently so update your clusters as soon as you could if you're running your own or even in cloud just upgrade keep upgrading your clusters when it comes to managed Kubernetes clusters in the cloud security is mostly I mean 70% of security control plane security it's managed you don't have to do much there and many organizations today needs some level of multi-tenancy they might have different different teams etc working different different projects and share within a shared Kubernetes cluster so so yeah so these could be you know these things that I told in this slide in this session would be appropriate if you can implement them in these scenarios so you don't keep the proper standards up and follow up and things should be alright that's it from me today thank you and I hope you learned something today over to you


Next, we're going to work on a client unit test failure. The client unit tests are written by developers to test our front end code. And the one that we're going to be looking at today is a view component. And therefore it has a view test as well. I'm going to share my screen here and we're going to get started. All right. So first we're going to find a failing test on GitHub. This should be relatively familiar but we're going to, we're going to come here to this little red X. Look down here for client unit testing, quick detail. And there we should see the undergarn run jest. There is an error. If we scroll up just a little bit, we can see fail in all caps. And this component in this test, the saved rule selector.test.js is expecting to receive disabled but it didn't. Disabled was not in this array. So let's, we have the error. Now we're going to run it locally. First thing we're going to do to do that is copy this. Stay there. Copy this. Then, and now again, we are in our virtual environment and that will make it easier to run our test. In order to run the client unit test, we need to CD into the client folder. And then from there, we can run yarn, run jest. That'll run all of our current tests. There are not very many and it does not take very long. We can see, oh, we've got some passing ones. And at some point this is going to turn, we're going to see a red error that says, ah, one of them failed. And that's the one that we're going to be looking at. So here's the saved rule selector, disabled sister icon if there is no history. I was expecting to see the word disabled, but disabled is not in that array. So let's go fix it and go and try and fix it. I'll give you a second to figure that out. And meanwhile, I'm going to open the saved rule selector, the actual view component. I'm also going to open the saved rule selector test just so you can see the actual tests done here. So of the test cases, it is this first one that is failing disabled history. I kind of, there's no history. And we were expecting that the saved rules button class would contain the word disabled. I'm going to go back to the saved rule selector. And what I would do if I didn't create this bug to begin with is I would look for the word disabled in here. And when I find it, which there's only one, I see that here we're supposed to be appending the disabled to the class if the number of saved rules is one. We go back and we say, if there is no history items without knowledge of this component, it might be hard to reason out, but I'll work on it with you. If there is no history, if there are no history items in this saved rule selector, the history icon should be disabled. But here we see that it's disabled if the number of saved rules is equal to one. Well, this is a simple, very silly, completely fabricated off by one error, where we really want to disable it if the number of saved rules is zero. I'm going to save that. If you think you've got it, you can try running the tests again locally. There's a note here to not run all of the client tests. So we're going to actually run this yarn jest selector and that should run just a subset of the yarn of the client tests that have the word selector in them. And in this case, it is only the saved rule selector that has the word selector in it. And we see one passed, tada. With that, I think all that's left to do on our tutorial is to write our commit message and move on. So I'm going to say get status. We're going to see that this is the file that we changed.  And we're going to say all five one selector. You can write whatever you want for your commit message. It doesn't matter that up to you. You do not need to copy what I wrote here. However, if you want to write a good commit message, which we encourage you to do, you can check out the Galaxy contributor guide to see how to do that. Great job on that client unit error. And I'll see you in the next session.