Hey curl friends, I'm Bianca Renee and you watching Bianca Renee today, and I'm coming to you live from in my shower I've never actually spoken to you while in the shower, but here we go So today I wanted to show you how you should properly be washing your hair and conditioning and the difference between Clarifying shampoos moisturizing shampoos regular conditioners and deep conditioners when should you use what today's video is sponsored by Not Your Mothers, so thank you for sponsoring this video. I love so many of their products because they have a whole Naturals line that is sulfate, paraben and silicone free So I'm going to show you some of my favorite Not Your Mothers products in today's video So first let's talk about a clarifying shampoo versus a moisturizing shampoo a clarifying shampoo will actually say Clarifying on the bottle or it might say Sculpt care Cleansing those are types of words that you know are gonna get a really good deep clean on your scout And that is the main place where shampoo should be applied You don't want to apply shampoo to the lengths of your hair You want to start at your scalp and then you can work it down if it's necessary So for example the new Not Your Mothers curl talk scalp care cleansing oil It's supposed to gently cleanse or remove buildup while restoring natural oils This does have peppermint in it So a lot of scalp products will have peppermint that gives it that nice cooling sensation And what I love about this one is that it has a little nozzle a little like rubber tip So I could just apply this directly to my scalp Now the difference between these two is that this one actually says massage into scalp using direct applicator Or a regular moisturizing shampoo will just say lather and work into wet hair So if my hair really needed to be cleaned I would probably use a moisturizing shampoo to put on the lengths of my hair where a scout care or a very Clarifying shampoo I would only focus on my scalp. It's not like about how to apply them You don't want to do the whole like dramatic rubber dub dub on the top of your head And we often seen commercials all you're doing is creating more tangles as you mix it around on the top of your head I will admit sometimes they get a little too lather crazy and I just start massaging like those commercials But I'm really not doing anything to help detangle my hair Well that's a better just to get your fingers onto your scalp and then massage more of the scalp and not really get your hair Involved it is also crucial to take this time to massage your scalp That's how you get the blood flowing which will increase circulation which could help with hair growth So you might not remember to massage your scalp Maybe before you go to bed or in the middle of the day But at least do it when you shower while you're massaging in whatever cleansing product you've put in when applying a Moisturizing shampoo that's when it's okay to then go to the lengths of your hair I would still start at the roots on your scalp and then just smooth down Whatever remaining product is you don't even apply more shampoo to the actual mids or ends of your hair So it's feel free to just smooth it in going down so you can start detangling and of course These shampoos are sulfate free once you rent out the shampoo. Let's talk conditioners Should you use a deep conditioner or a hair mask or a regular conditioner? It depends on where you are on the week. I always recommend the deep condition once a week So if you have a deep condition yet, this could be your deep conditioning day Then if for some reason you have to shower again, you know the deep condition twice a week I would just then use a conditioner on that second wash. So when it comes to choosing a regular conditioner I always like to find a conditioner that is silicone free and one that smells good and has amazing slip So here I have the not your mother's Tahitian gardenian flour and mango butter curl defining Conditioner all the not your mother's natural conditioners have the same like thick consistency Which makes it really easy to detangle this one is supposed to restore bounce to enhance and define curls It has a really pretty floral scent and it does a really good job at detangling all of my knots Now let's talk about how to properly apply the conditioner You don't want to just get a whole bunch and apply it to your scalp. No, that is what we use shampoo for But conditioner you apply to the mids or ends of your hair where your hair is usually most dry now before I knew what to do I would just kind of scrunch all the conditioner in there smooth it down and then start detangling but the better way to detangle is by taking a small section and Smoothing the conditioner into your hair So you literally grab your thumb on one end and use your thumb to press that product into your hair Smoothing down the hair shaft and it's also going to help eliminate frizz So just keep doing this over and over again and eventually look at that all the tangles are gone So once I learned to actually smooth the product into my hair and rub it until all the tangles are gone I realized that there are some conditioners that I thought I didn't like but it really was me. I was the problem I was applying it incorrectly, but once I learned this little technique Detangling has been so much easier.  So if you're someone that's noticed that the back of your head is always frizzy It could be because of the hot water You're letting just smack it in the face throughout your whole shower Another tip I have for you when it comes to detangling is to think about how you actually going to wear your hair If you're going to wear your hair in a middle part Then it's okay to brush in two sections and keep that middle part But if you have bangs or you wear a side part or you just don't want a middle part at all Don't create one in the shower because it's gonna become really hard to get rid of that middle part My hair was like trained to fall this way So you kind of have to train it to not do that and start to create Different parts depending on how you wear your hair. So once I'm done detangling both sides I've been like to flip my hair over and rake my fingers through to get rid of that part That's also gonna help create more volume at your roots that way roots just don't look flat and boring So that is how I would recommend you having a successful wash day. Let me know what are your favorite not your mother's products I'm also gonna be doing a giveaway for some not your mother's products on Instagram at Ms. Bianca Renee So make sure you guys follow me so you could enter I post new videos every week Sleep a little subscribe button and the bell so you notified us soon if I post a new video And I'll see you guys next time. Thanks for watching Bianca Renee today


I have been discussing about the earth pressure analysis by using wedge or trial wedge. So we already studied the Rankine earth pressure theory and the second procedure or the methodology which is normally utilized to find out the earth pressures on the earth retaining systems is what is known as trial wedge method and that is what I am discussing since last lecture. And the last one I will be discussing would be the Coulomb's method and there are some graphical techniques also which have become outdated in the due course of time with the advent of all powerful computational devices. So in continuation with where we left in the last lecture we were talking about the earth pressure determination by using a trial wedge and I had drawn the free body diagrams for, now this is the trial wedge and in most of the cases the statement of the problem is as long as this wall is vertical and a smooth we have to find out P and this P could be active or passive. So A corresponds to active earth pressure and P corresponds to passive earth pressure with the weight of the block known and what we wish to do is we wish to optimize the inclination of the slip surface. So this is the slip surface about which the failure takes place we draw drew the free body diagram for this situation. So this is the shear force which is getting mobilized it is a normal on the slip surface. So this is the n component normal component and the reaction of the two is resultant of the two is the reaction R. Similarly I drew the earth pressure for passive case. So in passive case the direction of the shear force will be changing and then you have the normal which is acting and this is the resultant. So once you have done the free body diagram life is not so difficult as I mentioned the previous lecture the principle unknown is Pa or Pp and this is the function of weight of the block and weight is the function of height of the wall we bring in theta component over here and principally this is what the statement of the you know this is the objective. There are three forces which are acting on the block A, B, C and there are few knowns. This angle is friction angle coefficient of internal fraction friction the tau could be C plus sigma t tau phi so this could be equal to C plus sigma tan phi and sigma is nothing but the normal component alright and right now we are dealing with the pure frictional case so C tends to 0 we are not going to take into account this. So once you have this objective function we can optimize the things this is where I introduce the concept of friction also. So if the wall is not smooth in that case friction gets mobilized and the only difference here would be if this is the wall and this is the block which is in contact with the wall. So one is the friction which is getting mobilized between the wall and the block this part we have analyzed and if I draw a perpendicular on the surface for active earth pressure condition this is the direction of Pa we call this angle as delta the friction angle between the wall and the block in case of the passive earth pressure what will happen is this will be the direction of PP now you do not remember this is very easy to obtain this will be again delta value because of the friction which is getting mobilized between the wall and the block in the direction of PP and pH changes alright this part we discussed in the previous lecture. So if the wall is in the active state this block is moving down the friction is going to be upwards and hence you have a normal component you have a shear component the resultant is Pa in case you are having a passive earth pressure condition the block is moving up inside the wall clear inside the backfill the shear stress is going to be acting like this alright. So these are simple see in passive situation the wall is pushing the block inside alright movement within the backfill so what is going to happen if this is a surface the tendency of the block is to move up slide up so that means the reaction on this is going to be like this this is how the shear stress is going to be mobilized remember the hump formation is a peculiar characteristic of the passive earth pressure alright and in case you have a depression here so this would be let us say the hump formation which is associated with the passive earth pressure and in case you find any depression over here this is going to be because of the movement of the material outside alright available in the backfill this is going to be active earth pressure clear this part we have discussed quite in detail now what I will do is I will just try to analyze the simple situation and then slowly and slowly we will move on to the complicated cases which are more practical cases. Now this is a system where three forces are acting and hence you can do the equilibrium analysis alright so let us try to do one of these cases active earth pressure let us say so I hope you understand now this is A B C weight is acting like this there is a reaction coming like this this is the normal component this is the shear component this is okay now with all of you this is PA alright so I can use this concepts of mechanics equilibrium of the soil mass or the block alright so I can say H or V I have two equations this is how you do the most of the rigid body analysis now one thing which you have to understand is if the height of the wall is known let us say this height of the wall is as H Rankine earth pressure theory gives me the point of application of PA which is H by 3 so this is known so first of all you try to identify what are the things which are unknowns so as I said over here the principle unknowns are the pressures which are coming on the wall because of the backfill number one number two unknown is the theta value because this has to be the critical value at which the slip surface will form and the failure will occur fine I am sure you will realize W is a known factor clear another principle unknown is R I hope you agree with this because you do not know what is the magnitude of R why several issues so R is a big question mark because what we have assumed is that this is angle friction which might get mobilized or not number one clear and then later on we will talk about the factor of safety is associated with CN5 parameters so the chances are that the entire friction may get mobilized or not in C5 soils what is going to happen is the shear strength might get mobilized because of mobilization of cohesion and friction 50-50 70-30 30-70 whatever combination I do not know so overall R is unknown and its point of application is unknown got it so it is a beautiful situation where R is unknown as a vector and its point of application is unknown so most of the time these type of analysis are done to obtain these questions answer to these questions by using the concepts of the mechanics where is the third equation which I can use I can use the free moment concept and that also I can equilibrate to 0 now this method is known as limit equilibrium method that means you are just talking about the limiting equilibrium of the block and where is the limit coming from it is not the failure has occurred is at the verge of failure and mechanics you use the term incipient motion is it not at the verge of failure at the verge of movement what is going to happen to the system clear so same thing is happening here also this block under all circumstances remains in equilibrium but it is on the verge of failure because of the plastic state of equilibrium getting formed in the backfill is this part okay so I can use these concepts of mechanics quite easily to solve the problem I can take moment about any point I have two equations which are going to help me quite a lot and then the third is the moment equation to find out what is the application of R provided I know PA provided I know tau provided I know N and R in fact clear and of course your theta term so the simply simplified model is where I am dealing with let us say a frictional material no C is coming in the picture right now that part we will deal later on because the moment C comes in the picture in the backfill what happens tension cracks clear although the less permeability consolidation will take place because of compact ability is not possible differential settlements and so on over the pressure development so we are not going to talk about the cohesion right now we are simply assuming that at the time of failure the shear strength which gets mobilized is because of the friction and 100% mobilization so subsequently I will be using a term that Phi m Phi m is nothing but the Phi mobilized clear imagine there is attack on the country you need not to send all the troops on that particular place you reserve some of the troops and then you send maybe 10% 20% 30% depending upon the situation now this is what the material does material will not mobilize the entire shear strength it will only mobilize certain amount of shear strength depending upon several situations which you have already studied so this m corresponds to mobilization or mobilized mobilized means utilized remember this concept that when we drew the Mohr circle this is what we were discussing the failure takes place at this point alright so this is the tau of sigma f but if you draw a perpendicular from here you will realize that there is more strength which is available at this point now I think it looks better so at this point at this normal stress you still have this much of the shear stress which is available but the material has a tendency to fail much before that is this part clear we discussed this the ratio of the tool is going to be a factor of safety so that means Phi mobilized will be equal to Phi divided by some factor of safety and this is my choice as a designer what factor of safety I am going to use so today for the first time I have introduced the concept of factor of safety in applications until now we just talked about the material properties clear so the sample say fails or the material fails at this point but at this normal stress you have so much of shear strength still available which is higher than the failure strength fine so what we will do is I know the w value this is half into h into h into cot theta is this okay so if this is h this is going to be h cot theta Cb so I know the w value multiplied by unit weight now unit weight is a characteristics you know how to compute it there could be a total submergence partial submergence depending upon the material variable submergence and so on so you know the value of gamma you can compute it very easily we have done this in the past clear now what is another equation which I will be getting so suppose if I say sigma fh equal to 0 I will be getting Pa will be equal to something you know you can resolve this and you can compute this similarly you will be getting r equal to something you can do it very complicated method is it not so what we will do is we will go for a simplified way draw the force diagram and the force diagram says just see how I am interpreting the force diagram Pa is acting over here the first weightage is given to active earth pressure passive earth pressure it does not matter whether it is Pa or Pp is acting in the horizontal direction this is the w this is part clear where is the third force which is balancing these two are what is r the reaction which is getting mobilized on this lip surface balancing w and Pa good so this is your r this is part clear simple now what we were discussing the last lecture suppose if I overload the system and if I say this is the surcharge qs one is due to the analysis which we did last time clear second would be take this component of the loading which is going to come on the system in w itself so this will become w plus let us say qs into h into cot theta is this part clear all right the same thing I can do if I apply a horizontal force coming over here let us say F a or whatever so what will happen this Pa will get added up with F a so imagine a situation where you are doing a construction all right and either due to vibrations or due to earthquakes or due to loading it so happens that the soil mass gets loaded externally that is the situation here imagine if you are having a system which you want to construct where you are excavating over here and all the men machinery and your camps are over here you are loading the whole surface and many times it happens during the construction itself the failure occurs why you are sitting on the branch which you are cutting that means you have mobilized more excessive weight for the less shear strength which is going to cause the failure fine having done this let us come back to the simple case situations can you compute the angle between w and r in fact sorry this force diagram is still not complete let us complete this first how many other forces are missing from this diagram very good so normal stress and shear stress clear so tau and n are the components of r if I draw it like this this is your tangential force and if I join it like this this becomes your normal component happy this is 90 degree let us compute the included angles compute the angle between r and n quick r and n r and n 5 clear this ok what is the angle between w and n quick normal stress and the weight so the weight is acting like this and you have a normal stress component over here ok 90 minus theta and what will be the value of w and r that will be theta so what is the value between r and w theta minus very good clear now henceforth you did not to compute anything of this sort just remember one thing that when we are talking about the active earth pressure the angles are theta minus 5 all right you can prove this so I can write a relationship Pa will be equal to w into cot of no Pa will be w tan of theta minus 5 is this correct fine w I know I have got an expression for Pa this was a simple case I got it very easily what is the earth pressure under active earth pressure conditions of k gamma h square is it not can you conclude something from here what is this k value that is it so simple thing is all these terms are nothing but k term and what is k 1 minus sin 5 over 1 plus sin 5 so once we have got this objective function what I would like to do this is where the designers concepts of the subjects that you know exposed now my question to you would be whether you like to have a situation where Pa is maximum or minimum so what is Pa active earth pressure the backfill is pushing the wall out just because of gravity easy thing to happen natural process is it not wall moving inside the system is going to be a difficult situation so truly speaking the component which is low has to be maximized and the passive earth pressure which requires lot of efforts have to be minimized as a designer you will require these concepts when you deal with the problems mathematically does not matter because what I will do is I can optimize this function now I am using the word optimization so if I say this tends to 0 what I have done by solving this I can get theta equal to theta critical is this part ok what should be theta critical go back to the Mohr circle this is sigma 1 a smooth wall vertical wall no shear stress agreed sigma 1 sigma 3 where is the pole at sigma 3 if I join these two this becomes my failure plane theta f and what was the theta value which we computed here Tashanka you told last time in the class this is ok so what you have to prove is that this theta critical under passive earth pressure condition is equal to 45 plus 5 by 2 which is nothing but mathematics no complications very nice I mean under gravity conditions prevailing alright when the only the weight of the blocks are coming in the picture the chances are that active earth pressures can be achieved without any efforts most of the hills are falling why because the gravity is allowing them to slip down this surface is it not there is a gravity effect you know if I keep a block on a horizontal plane and if I pack this point pivot this point and if I lift it what is going to happen still in a equilibrium the moment I lift to theta critical what is going to happen this will attain a impending motion clear that is what is happening so under natural gravity condition the chances are the system is going to fail under active earth pressure but all this is being done by the nature clear it is not in your hands the type of stress conditions which develop delta sigma as greater than 0 or less than 0 do not get detached from there that is causing all active and passive earth pressures to come in picture for a constant sigma v value you remember delta sigma v is 0 delta sigma h could be greater than 0 what is the meaning of this wall is being pushed out active earth pressure condition clear and suppose I reverse the situation what is going to happen delta sigma h is more than sigma v or it is increment wall is going to come in so this is the answer technical answer to your question fine and that is why we are maximizing and minimizing mathematically it remains same.


I watched Game 5 of the 1969 World Series just to see, you know, what's different? What's the same? What are some oddities? This is brought to you by DraftKings. I'm not really recapping the gameplay here or the skill, just kind of the in-between the game differences, similarities like, look at this, a pitcher walking as slow as he possibly can to conserve energy off the mound. That's similar, I've seen that before, or World Series game naturally televised a fan running on the field trying to get a high five from a player gets the high five and then the cops come and say, all right, get out of here, the umps are even helping a little bit. Cops don't tackle them, that's different. Fans celebrate, got a nice sweater on, tucked in shirt underneath, that's different. The crowd kind of like, whatever. Found some differences that I knew I was going to see, way more aggressive baseball, the rules have changed and look at this, bam, okay. No one even talked about it. It wasn't even a big deal. They didn't show a replay, no one mentioned it, just going into second hard to break up the double play. I mean, this was baseball for a really long times. You had to be careful around the bag. He grabs the ball, oh, lays him. The dude doesn't slide at all, just trying to take out the player and he, he doesn't get mad, broadcast doesn't say anything. No one cares. That was baseball. I don't really need that back in baseball. Didn't seem like it was ever like a necessary part of the sport. It is always jarring to see. Now, this one's even a little more jarring because then this happened today. The guy would be labeled so dirty. Wright Fielder tries to throw him out at first base with the catcher backing up, which is actually a cool play. You know, a sneak attack. The first baseman's going to the outfield, so no one's covering first, but the catcher is obviously there to back pick him. That's cool. I like that, but just tries to push him off the bag and then pushes his leg. Oh my God, just like bends his knee.  Hey now, hey now, none of that, none of that. Okay, time. Here's the ball. My bad, a little too aggressive. My bad. So I expected to see that. Something I didn't expect to see that I was like, ooh, I don't see that in today's. Look at this ump busting it down the right field line to make the call. Running all the way down there. I feel like the umps these days just turn their head and look. I haven't seen an ump sprint down the right field line in a long time. Joe West, 2018. Did he sprint? Bobbly head. My favorite thing I noticed watching this game that I wasn't expecting to was all the on deck batters were on one knee, taking their practice swings while on one knee. Everyone, like maybe one or two weren't, but majority were on one knee and you don't see this anymore. And I wonder when it stopped, did it fade out? Was there's one guy still on one knee, you know, in like 1979? Had to be taught, were they trying to get a better view of the pitches coming in, conserving energy? I really don't know. Maybe we got to do a deep dive on when did on deck batters start standing up. But that was weird. Every single batter was on one knee. And speaking of batters, Boog Powell swing won me over. Like I am a Boog Powell swing fan. Look at that and look at the pause at the end and then kind of like a boom. And for you at home, that's a 27 year old man in his prime. Now, just had the best season of his career and he's about to top it next year, second in MVP, first in MVP in 1970. And look at those swings and misses. It's a thing of beauty. It looks like this scene looks like a 1980s sitcom.  And these are all the actors, you know, playing baseball.  He actually had a great postseason, a great year. And that's the hit he got in this game. All those big swings and the hit he gets is on this check swing. So that was thoroughly entertaining to watch Boog Powell swing and miss or just swing in general. Later on the game, we got ourselves a breakdown situation.  Frank Robinson's up, guy behind him puts his sunglasses on, 1377 RBI's in his 14 years in the majors, fouls the first pitch back, blue grabs a ball, throws it back to pitch, blue at shortstop, wandering around, just looking around, 01 pitch, check swing, doesn't matter, strike, says the umpire, gets some guff from the dugout, says whatever, shut up about it. Now Robinson's down, 0-2, and the Orioles are about to lose the game and lose the World Series. And that one hits him in the leg and the umpire says, no, foul tip, foul tip. He says, no, hit me in the leg. They ask him, ask him, hit me in the leg. And this is something we still see is umpires being told to ask for help from someone who probably had a different or better view and the umpire being like, nah, I got it. I saw it. Why would I ask for another person's opinion? You want me to do everything I can to get the call right? No, I saw it. Earl Weaver, I think he got ejected earlier in the series, like come on, hey, come on, just ask him. You got to ask him, ask him. And he's like, uh, no. He's like, oh, we'll ask somebody. And the umpire is just saying, no, I'm not.  Like I came out here so you wouldn't get ejected. You got to stop yelling. I'm the one that's on the front lines now. You're supposed to be behind. Just get out of here. And Earl's like, come on. What are you doing? Why don't you ask somebody? Hit him in the leg. You know? He's like, well, it didn't hit him in the leg. Hit him in the back. He says, no, no, it got him smack in the leg. Come on. You can't see that? Now Frank Robinson's going to leave, right? And that's odd. He just walks away. Where did he go? Weaver also leaves. He goes to the dugout, but he's still barking. He's upset. He's going to walk down the steps. You can turn right, right in the leg. Smack in the leg. Come on. And then the umpire must be barking back because Weaver's just saying like, what I said, what I said, huh? What I said. Yeah. In the leg.  You asked. And the umpire says, Hey, well, where did Frank go? He's still up. I called foul tip. He's not out. He's like, well, I don't know. I'll go see. I don't know if Frank Robinson thought he got called out like swing and miss, or he just went to go check on his leg to prove a point, but he left. He's in the dugout. Everyone's got to wait for him to get back and Earl Weaver's checks on him. He says, all right. He's like, uh, comes, walks back out, turns the balloon. He says he's coming back out and hit him right. He was checking on his leg. He hit him in the leg. The ball you said didn't hit him leg. And now Frank Robinson comes out his shirt's undone. I don't know.  Maybe he thought he struck out or he was trying to like prove a point. Like it'd be funny if he came back and had a bruise or like the mark. He's like, I'll show you the laces. Anyway, comes back out, fouls the ball back, stays alive, takes a curveball high, one and two, another curveball, kind of the same pitch, called strike three. Now he's done. And then the inning flips and we have a similar situation where a ball goes in the dirt and the batter on the Mets says that hit me in the foot. Umpire says, no, it didn't is not hit me in the foot. Go check. Wait, you don't think that hit me in the foot? Yogi Bear is like, Hmm, what's going on here?  You don't see the shoe polish anymore. You hear legends about it. This doesn't really happen anymore. No, the shoe polish on the ball and the M says, Oh yeah, you're right. There is shoe polish on this ball. What if it wasn't even the same ball? Like if I go back, did that ball get discarded? Let me see where this ball goes. It goes into the dugout. So what if the Mets just have a shoe polish ball on hand at all times? That isn't positive. It's the same exact ball. Oh, that's hilarious. I wonder if they did that because the coach just brings a ball out and he's like, Oh yeah, this has shoe polish on it. It did hit him in the foot. That could have been any ball. He didn't keep, he didn't keep tabs on that ball. Weaver comes out and he's like, so you listen to them. They get a second opinion. You change it. And then you can see the umpires say, you say, he showed me the ball. He showed me the ball. He showed me the ball. Well, it could have been any ball. He's like, there's shoe polish on this ball. Weaver's like, what are you talking about?  Let him know something. And Weaver once again is like hearing his player talking like, well, hold up, hold up, hold up, hold up. I'm the one that is supposed to get ejected, man. Get back on the mound, McNally. Huh? Hit a home run in this game McNally. How about that?  You know, why if should Frank have come out and shown you the laces on his leg? Would you have changed the call? Maybe that's maybe the Frank was doing it. Maybe that was smart. The last thing I loved about going through this footage was this fan who who brought a bajillion fans back to your nest bird cloud nine by by birdies out of sight. How many signs did he bring? Is he a plant by the network? A lot of bird signs and some of them aren't even that great. So there you go. That's 1969 World Series oddities, familiarities, and all in between. Thanks for watching. Subscribe to the channel and thank you to DraftKings for sponsoring these breakdowns. I appreciate them as always.  Let me know.


Another news tonight. Police are searching for a suspect after a fatal shooting in Hibbing. The Minnesota Bureau of Criminal Apprehension says officers responded to 911 calls reporting the shooting shortly after 7 30 Tuesday night. Police found two people were shot one fatally. A male victim was taken to Fairview range Medical Center where he was pronounced dead. The other victims injuries were not life threatening. He was treated and released. Investigators have identified 29 year old Jerome span as a suspect in the shooting and say they consider him armed and dangerous. If you see span, you should not approach him, but rather call 911. Authorities believe span fled in a vehicle with another man and may have traveled to Saint Paul where span has relatives. If you enjoyed this segment of Lakeland News, please consider making a tax deductible contribution to Lakeland PBS.


This study investigates the climatic effects of four types of forest disturbances in northeastern China, including fires, insect damage, logging, anaphorostation and reforestation. The study estimates that instantaneous net radiative forcings caused by these disturbances were 0.53 to 2.23 Wm2 carat, with different mechanisms of influence on climate. Over a decade, the estimated net forcings were 2.24 to minus 0.47 Wm2 carat, providing evidence for the mechanisms of the influences of forest disturbances on climate through satellite observations. This article was authored by Yuzhan Zhong and Shunlin Liang.


Just to quickly jump a little bit in history just before we bring in our next conversation and sharing a little bit of black excellence this morning. Of course, this happened in 2019, just two years ago, in sports where we had Elid Kipchoge become the very first person on this day to break the marathon jinx after he ran a marathon in under two hours. It was a time of, I hope I can find it, one hour 59 seconds 40, one hour 59 minutes 40 seconds, I beg your pardon. And that's what he did on this day, a huge achievement for a marathon runner. He was of course a 2016 and 2020 Olympic marathon winner and on this day ran the distance at a special event in Vienna, Austria achieving the time of one hour 59 minutes 40 seconds. The whole of Vienna came out to witness history being made with thousands of spectators lining the course to support Kipchoge. The run unfortunately did not count as a new marathon record as standard competition rules for pacing and fluids were not followed and it was not an open event. Eventually ran a consistent pace set by the electric time in chair later. But of course congratulations to him and he definitely did make history by being the first person on earth to run a marathon under two hours, one hour 59 minutes and 40 seconds. Fantastic. That's just a little bit of history for you today. Stay with us when we come back. Our next first major conversation for today comes up on the breakfast.


The Beltrami County Sheriff's Office is getting put to the test by the National Institute of Corrections with the Jail and Justice System Assessment. The NIC will look at the build and infrastructure of the Beltrami County Jail, among other things. How are all our systems working together? So as far as like probation, the police department, sheriff's department, the judicial system, how is everything coming together? Before the visit, the NIC received data such as how many people have been arrested in the last 10 years. These trends help determine what needs best fit the jail. The assessment can reveal several options for improvement. If you do these remodeling type things, you can fix those same issues. Otherwise it may be as far as, you know, in the next so many years you should do a new facility. Located in downtown Bemidji, the jail opened in 1989. In 2001, the Minnesota Department of Corrections approved the capacity for 106 inmates. As of this morning, there were 109 inmates. Jail Administrator Melissa Bowman hopes the assessment will address the jail's biggest problems. I hope that we see our population declining some in here. I hope that we're able to offer more mental health services, that kind of stuff. On average, 15 to 20 inmates are in other facilities due to the high population, but Travis County Jail pays $55 a day for each inmate that's housed out. The three-day assessment concludes with additional interviews on Tuesday and a wrap-up meeting on Wednesday to discuss the results and any recommendations. It's huge for the community. I mean, they're the taxpayers. They're the ones that need to be aware of what's going on and be educated to know what our issues are in the system. In Bemidji, Haiti Clotter, Lakeland News.


Hi, I'm Zor. Welcome to Unisor Education. I'd like to spend some time solving very simple problems related to circles. By now, we have accumulated non-theoretical material to start solving problems, which is basically the main purpose of the whole exercise with website and all this educational material which we are providing on Unisor.com. Again, you remember that creativity is the ultimate goal of studying mathematics. So solving problem is the way how you basically create certain things. It's very important that you try to solve certain problems which you have not solved before, because that's exactly what's supposed to develop your creativity. That's the purpose, right? Okay. So construction problems in geometry are very much in line with this idea of creativity, how to construct something using whatever the tools you have and you know the tools are compass and straight edge ruler. All right. So if you construction problems related to circle, very simple by the way, I'm delaying with all the real complex problems until later when all this theoretical material will be completed. All right. So number one, divide in half and arc in a circle. All right. So if you have a circle and an arc from here to here, and you have to divide it in half. Well, obviously, you connect it with a cord and you drop the perpendicular from the center and continue. That's making a diameter actually. If you remember, diameter is the axis of symmetry of a circle, which means the left part is symmetrical to right part. Now, all the points on the left side of this arc are symmetrical to corresponding points on the right. Why? Because this one, this point has exactly the same distance from the diameter as this point, as we have proven many times before. Well, just in case, if you don't remember, you can always connect the ends of the cord of this cord and these two triangles have common side and equal in lengths. Hey, partner moves this because there are walls, radius is on the circle. So triangles are congruent, which means that these particular legs are equal in lengths. So for every other pair of points which you can obtain by drawing a perpendicular anywhere in this particular area, which means that the entire left part of the arc is symmetrical to the right part, and that basically proves that we have divided by this point, this arc into congruent parts. In this case, congruency is basically established by reflection relative to the axis. Okay. Next, find a center of a circle. I didn't mention actually this problem many times. If you have a circle, just pick up a couple of points and you know that the center is supposed to be on the perpendicular bisector between these two points. Now, have another pair of points, let's say this and this. Again, draw a cord and draw another perpendicular bisector. On the crossing, you will have the center of the circle. That's it. By the way, it doesn't really depend on what kind of points we have chosen, as long as it's just three different points. Construct a tangent to a given circle, the given point of their intersection. So if you have a tangent, which has one and only one by definition, single point of intersection with a circle. Now, how to construct this particular tangent if you know only the point? Well, obviously, if you remember, since tangent has one and only one point of intersection, that's the shortest distance from a center. Because on a circle, you have all the different points which are at the same distance, basically from the center, the ranges. Everything outside has the distance from the center greater than the radius. So this particular radius to the point where our tangent intersects with the circle is the shortest point from this line. So the way to construct it is if you have only the point, you have to draw a radius to this point from the center, and then the perpendicular line to this radius at this particular point is a tangent. And by the way, I don't want to stop on how to construct the perpendicular to a line at certain point. We already covered that in previous lectures. Next, construct the tangent to a given circle from a given point outside of a circle. Okay, so again, you have a circle and you have to construct a tangent if you have this point. So the tangent is not there. Tangent is the one which is supposed to be constructed. You have a point and you have a circle and a center obviously. Now, this is a little bit more tricky. Yes, we still know that this particular point should be found where the radius is perpendicular to the line. So we have to find out somehow how to draw this line if you have only one point. We don't have any other points. We don't have the tangent. But let's recall that since this is a perpendicular, now if you remember, if you have an inscribed angle which is supported by a diameter, it's always 90 degrees. Why? Because it's always half of a central angle and central angle in this case, which is supported by the same R is 180 degrees. So any inscribed angle which is supported by the diameter is the right angle. Now, this is also a right angle, right? And if we will draw a circle with this as a diameter and we do know this particular segment because we know the circle with its center and we know the point the tangent is supposed to pass through. So we have this, so we can actually build a circle on this segment as a diameter. Well, how? Just divide it in half and then use this as a radius. Now, since this is a circle with this as a diameter, then any right angle which is using this as a hypotenuse has to be on this circle. So basically this is a locus of all the vertices of a right triangle with this as a hypotenuse. Back to this particular drawing. If you have a diameter, then the circle around this diameter is a locus of all the vertices of all the different right triangles which have this diameter as a hypotenuse. Now, this particular triangle is the one which has this as a hypotenuse, which means that now we can find this point as an intersection between this circle which we know since we know it's diameter and the main circle from which we have started. Well, actually there are two points, right? So this point will serve as well. We can draw two different tangents from one point to this particular circle using this technique. So again, we use the segment between these two points, the center and the given point as a diameter, draw a circle and every point on that circle has the property that a triangle is the right triangle, which means one of these is the one which we are looking for. So this particular point should have the property being on that circle and at the same time being on that circle. That's why it's on the cross into these two circles. So we have two points, two points of intersection and that means that we know the point where our tangent is supposed to touch the circle. Well, since we know the point, we just draw a line here and draw a line here and these are two tangents which are two solutions to our problem. What was actually the creative moment in this particular little problem? The creative moment was to realize that there is certain property characteristic for this particular picture, the property that this is the right triangle and the locals of all the right triangles can be built using this as a diameter. So this is a creative part. So you have to think about how to find this particular point because since you don't have it, you have to find it using certain technique. So this is a creative moment. You have to realize that this point is supposed to belong to two different curves. One is it's obviously on our initial circle and secondly, it should belong to the locals of all the points which have the right angle at the top and supported by this as the end. We have to construct a right triangle, sorry, inscribe a right triangle into a circle given the length of one half of this. All right, so we have to inscribe the right triangle and as we know many times, repeated all the right triangles are supported by the diameter. So if we know the circle, obviously we know it's diameter and then any point on this circle can be used as a vertex of the right triangle, this, this, et cetera. Now, we are interested in the right triangle with a given categories. Well, that's actually simple. You take this length, use this as a center, mark this, you can actually mark this too. So you have two triangles with this particular size of the categories. You can actually do exactly the same thing from another end of the diameter and have this and this two points again, so you have again two different solutions. So we have four different solutions for any given, well, not for any given. Obviously, if this is too big, then you will just go outside of the circle. So obviously there are certain restrictions on the size, but if the size is less than a diameter, then the crossing will always be found. So again, we have a circle, we have a diameter, any diameter, and from both ends, you can use this as a radius of your compass and then have all these four points will be vertices of the right triangle which we are looking for. That's simple. Construct a circle of a given radius tangent to both rays of a given angle. So you have an angle and you have to inscribe a circle so both rays are tangent, but you are given the radius of this circle now obviously these are too perpendicular since these are tangents. So the lines, the segments from the center to the point of touching the tangent with the circle are perpendicular. So these are perpendicular. Now, radiuses are given, right? Okay, but this is now a really simple thing. Since radius is given, it means that this point is on this distance from this line. Now, what is the locus of all the points on a certain distance from the line? You just draw a parallel line which has the distance between these parallel lines a given segment, right? So we don't know this point, but we do know that it's supposed to be located on this line which is parallel to this line and on the distance which is our radius. Now similarly, this same point is supposed to be on the same distance from this line, which means again we draw a parallel line on this distance and the crossing of these two parallel lines is the point where the center of the circle is supposed to be located. Since this point belongs to this line, this perpendicular is equal to our R and since this point is on this line, the lengths of this perpendicular is always R, which means that if you will use this as a center and draw a circle of radius R, it will touch both rays in one particular point for each. So that would be tangents. All right, that was easy too. Inscribe a circle into a triangle. All right, so we have a triangle and we have to inscribe a circle so it's tangent to each one, to each side of the circle. Well, let's think again. If you will use the center and draw all three perpendiculars, let's think again where exactly this center is supposed to be located. If you have a triangle, well, obviously if you draw this particular line, it will bisect this angle. Why? Because these two triangles, this one and this one, are supposed to be congruent. Now why? Well, because these are two radiuses, right? And this is a common hypotenuse. So these two triangles are congruent, which makes these two angles congruent to each other. So it looks like this particular point, the center of an inscribed circle into a triangle is supposed to lie on the bisector of this angle. And similarly, it's supposed to lie on the bisector of this angle and this angle. So you take two bisectors of the triangle, angle bisectors of a triangle and you will get the inscribed center of an inscribed circle. And obviously the third one is supposed to be crossing the first couple of pairs, the pair of bisectors in exactly the same point that can be very easily shown. So let's just repeat again. If you have a triangle and you want to inscribe a circle into it, you have to use angle bisectors. If you want to circumscribe a triangle, which we did before actually, now if it's a circumscribed circle, then as you know, the center is supposed to be equally distanced from all three vertices, which means it's supposed to lie on a perpendicular bisector of each side. So inscribed with the bisectors, circumscribed circle is on the crossing of perpendicular bisectors of all sides. As you see, all these problems are really very, very simple. Construct a line tangent to two given circles. All right. So you have two given circles, one and another. And we have to draw a tangent to both of them. Well, obviously we can draw another one on this side. All right. How can we do it? Here is what we can say. Now these are two perpendiculars to the same line, right? So the radius to the point of touching a tangent is perpendicular to the tangent, which means they are parallel to each other. Now, let's bring the whole line, the tangent line down by this distance. What happens? If you have this r and this r and you do this and you will have a circle here with a radius of r minus r, now this line relative to this circle is shifted down. And as you see, this circle of the radius big r minus small r would be actually would be actually touched by this line, which we shifted down, and the line would be this line would be also tangent to this. Now, why it's tangent? Well, because since we shift parallel down, which means that this used to be a perpendicular and this would be a perpendicular, right? So we have a line which is perpendicular to the radius and it's on this particular distance which is equal to the radius.  So basically what I'm saying is that the new line, which is dotted, is tangential to a smaller circle of the radius equal to the difference between the radiuses of big and small circle. Now, can we build this line, the dotted line? Yes, we can because since we know both circles, we know both radiuses, that's why we know the difference between them so we can draw a circle concentric to the big one with the radius of r minus r. So this circle can be constructed very easily. Now, this is a point now, this is a center of a smaller circle, which means from a point, we know how to draw a tangent to a smaller circle. So that's how we build the whole thing.  So since we know how to do this, we know this point. As soon as we know this point, we just continue this particular line and then we continue and then we draw this line parallel to this line. So we get this point and we get this point. And these are two points which are supposed to be where our tangent, which we have to construct, is touching two circles, two given circles. All right, so again, first we build the difference between two reduces, this minus this, subtract it, use the difference as a radius concentric to the big r and then from the center of a small circle, we draw a tangent at this point. Now, how to draw a tangent from a point to a given circle? We already know in the previous problem which we have solved and then just along this particular line, we find one point and this is a parallel find another point. It's a little less trivial, I would say. This fact that we have to shift the whole thing down by this radius is again a guess which you really have to make to simplify your problem and not just to simplify but to reduce it to the one that you have already solved before. Actually, that's how everything is solved. You reduce your big complex problem to a smaller one, which you have already solved before.  Inscribe a square into a given circle. Okay, so you have a circle and you have to find four points which make a square. Well, how can you do it? This is actually easy. Obviously, if you connect this to this and this to this, you know we will get the center of a square, right? So, the way how you build this particular square is the following. You have a circle, you have a diameter, put a perpendicular diameter through the center and basically connect. Now, how to prove this is a circle? Well, very easily.  They are all right and equilateral and the, sorry, antisocialists. And so, you have all these angles 45 degrees. This is 90 degrees. So, all these angles are 90 degrees and all these sides are equal to each other. So, two perpendicular diameters will give you a square. Okay. You know how to inscribe a square into a circle, okay? How to inscribe a regular hexagon into a circle? Well, hexagon, it might be a little more difficult. This is something like this. Well, you can say that this is a diameter. Well, yes, it is. But now you have to divide this piece into three equal parts, which is not easy, right? Well, but actually it is quite easy. Let's think about it. Since this is a regular hexagon, since this is a regular hexagon, now all these are equal to the radius, right? And all these angles are equal to 360 divided by six, which is 60. All of them are 60, which makes these also 60. Which makes every triangle equilateral, which means if this is r, then this is also r, r. So, these chords are equal to the radiuses. All chords and all radiuses, they are all the same. Now, how to build the hexagon? Very simply, just take a point and using this radius, just put all these chords and that will give you the regular hexagon because this is equal to the radius. This side is equal to the radius. So, that's how you inscribe hexagon. That's the simplest, it's probably even simpler than to inscribe a square because there you have to draw a perpendicular. Here you just don't have to draw anything. Just put the points one after another, all six points which are vertices of the hexagon. Again, let me just stop a little bit. What was the constructive moment in this particular case is just to do this little research and basically find out that the lengths of the side of the hexagon is exactly the same as the radius. As soon as you know that, the construction itself is simple. So, you have to really have some kind of research first to how to approach the problem, but once you know, to solve it is really easy. And the last one, inscribe an equilateral triangle. So, equilateral triangle inscribed into a circle. Well, that might not be actually as easy as hexagon, or is it? Well, the way how I suggest you to solve this problem is very easy. First, inscribe hexagon, and you know how to do that. And then connect every other point. Just skip one. One, skip two, three, skip four, five, skip six, game one. And this would be your regular equilateral triangle. Again, a little guess that instead of just thinking about what's the lengths of this particular side, it's complicated. I don't know what the lengths of this side, just off the top of my head. I have to do some kind of calculations, some kind of maybe additional constructions. It's difficult. But if I have just guessed that providing you know how to do the hexagon, the regular triangle, the equilateral triangle is actually can be obtained by connecting points, vertices of the hexagon, just skipping every other one, well then the problem is easy. All right, so I just want to emphasize how important it is to think about how to approach the problem. Construction problems in geometry are very, very much like this. You just think about this and then the situation actually clarifies. And the construction itself is simple. You just have to know how to do it. And how to do it is actually requiring certain level of thinking, creativity, and guessing if you wish or something. And the more problems you solve, by the way, the more proficient you will be in this particular art of solving these problems. Because actually, if you think about it, the number of methods of solving different problems is really finite. So the more you solve, the more you enrich yourself in this methodology and you will always be able to basically choose from one which you have already done before as a method to at least approach the new problems. Every new problem might actually be solved by certain combination of the methods which you have already used before solving other problems. So the more you solve, the better you will be off. And all the problems in the world we are planning to put on unisor.com, special attention for parents who would like to supervise their children's study and mathematics. It allows you to enroll your children in certain programs. Then exams actually can be taken by the students and US parents can actually examine the results and mark the particular topic as completed. Or ask again, do it again, do the lectures again, do the exercises again, and do the exam again until it's perfect. All right, that's it for today. Thank you very much.


What happens when you combine the region's best network with a plan that requires no money down on the phone you choose, but also allows you to upgrade to the latest and greatest phone quicker than the traditional contract? You get the Appalachian Advantage, better service and bigger savings. Full payment plan required, see store for details. Advantage requires no money down, taxes due at time of sale. A Pike County man was arrested yesterday for DUI after concerned citizens took steps to lend officers a helping hand. This video of a vehicle swerving on and off the road was taken by a concerned motorist Wednesday afternoon who also notified police of the potentially dangerous situation. Everything was resolved safely, however, when Pikeville police officers arrived to the parking lot of the Shelby-Anna Food City. They had actually followed the driver from the Shelby-Anna area of U.S. 460 until they had come into the city limits of Pikeville at the Shelby-Anna Food City. Officers got on scene to find the citizens were so concerned that they had actually blocked the driver in so that he couldn't further operate the vehicle. He had actually tried to take the sidewalk and go around those vehicles, but he was unable to. The video is a scary reminder of what happens when an impaired driver gets behind the wheel. And Captain Thompson says motorists who take the extra step to report things like this are a much appreciated extra tool for law enforcement. One of the best ways that we operate and we can find out and investigate things is people taking just a second out of their day to give the extra step and call in about a complaint or concern that they might have. And in this case, obviously, if you've watched this video, this individual does not need to be on the highway, period. And this is an incident that has a good ending up to this point. The fact that they did not collide and causing damage to anyone else. And we encourage people to, if you see something out of the ordinary, that's what we're there for. That's what 911 is there for. Call with your concern and complain and hopefully we can have good endings. 53-year-old Kevin Way Hopkins of Greasy Creek was arrested and charged with DUI. However, Pineville police officials say that investigation is ongoing and more charges are likely.


My name is Maté. I am a Lincor D. maintainer. I work for a company called Boyant where I'm a software engineer. You can reach out to me on social media. I'm on Twitter. Probably should have changed the logo. You can find me on GitHub and a couple of Slack channels. So yeah, welcome to another talk on why you should rewrite your software and Rust. The hype train is very, very real and it's not stopping. It's going strong. And I've got a lot of things that I actually want to cover in this session. So, you know, kind of a housekeeping thing. Who here has written a controller before? It doesn't matter what language it was in. All right. All right. That helps me out. What about Rust? Any experience with Rust? All right. And service meshes? Okay. Well, that makes my job much, much easier. So we have a couple of Rustations in a room. But I still need to go through the slide. You know, like why Rust? It's kind of the topic of the talk. One, because it's fast, right? You can do your own memory allocations. That's very important when you're working with software where latency is important, where it's important that you manage data in a very efficient way. And Rust lets you do that in a very nice way. It has a very nice concurrent API. You can do concurrency with a bunch of tools that were written with performance in mind. Backpressure is applied in a nice and elegant way. And overall, it's just a very nice language to work with if you want to get stuff done fast. But more so than that, it's safe. Right? Like, you don't basically have the same issues that you have with a language like C++ because the compiler really helps you out. You have a bunch of invariants that it basically upholds to ensure that your code is safe, whether that's in concurrent execution environments or whether that's in a single-threaded application, you know, that all holds. You have ownership semantics. You have marker traits to ensure that you don't share data across threads when it's not meant to be shared. And that makes the language really, really safe to program. And even if you don't have experience with managing your own memory. And last but not least, it's sane. All right? So you might have noticed this is exactly the title of my talk. But it's sane because the compiler really helps you out. If you have to work with Rust and you have an issue where your code doesn't compile, the compiler is going to give you some very helpful output that's going to help you resolve your issue. So all of that makes it just an overall nice language to program in. But for us with Linkerty, so Linkerty is a service mesh. If you didn't raise your hand when I asked about service meshes, I got really good at explaining this over the years, by the way, because I've been doing it for a while. But service meshes are basically platform level tools. You just use them in your Kubernetes environment to give you features out of the box without really making any changes to your application stack. So the way we kind of do this is that if you have two services that talk to each other, let's say two pods, like in this very nice and elaborate diagram, we're going to introduce a sidecar proxy that's going to take over your traffic. And it's going to do a bunch of cool stuff with it. It's going to provide MTLS out of the box. It's going to basically provide a bunch of reliability mechanisms, like retries and timeouts and metrics. It's going to make everything a little bit more performant, because we do some very elaborate load balancing techniques. And all of that without actually requiring you to make any changes to your code. So it's a pretty, pretty sweet deal if you ask me. But if you ask me, I'm pretty biased. So, you know, there's that. But for Linkerty, we need to ensure that safety and performance are there, right? Like we're in the application's data path with our sidecar proxies. We're going to take over your bytes and we're going to send them to their destination. And if you work with stuff that you don't want to leak out, like credit card information, then ideally, you want it to be very safe, right? And in practice, this means no CVEs, right? We want to ensure that you don't have any buffer overflow attacks. We want to make sure that we don't have any double freeze in our code. We want to make sure that everything is performant and up to par. But it also means that we want to be performant, right? Because we add at least two additional hops in your network traffic. So we don't want to have any GC pauses. So Go, for example, is the language of choice for network services in cloud native, because it's very simple to work with.  And that kind of gets in the way of things, especially when you need to deal with a lot of traffic. Ideally, for our proxy, we're not going to have any point in time where we just stop the world to collect all of these values that are no longer used within the application. So at Rust, because everything gets dropped when it goes out of scope, we avoid that, right? Like, you use some memory for a request.  And finally, we want to have the ability to scale. So with LinkerD1, it kind of predates me, but you know, I've heard the stories. With LinkerD1, we used JVM proxy. We programmed it in Scala. And we had a bit of an issue with scaling down. So the JVM was good for scaling up. But when you had an application that didn't really send a bunch of traffic, then we were using a lot of memory just by virtue of running a sidecar container. And as soon as we switched to Rust and as soon as, you know, the proxy became machine code, so to speak, everything just became much, much better in terms of scaling up and scaling down. But we're here to talk about controllers, not about the proxy or sidecars for that matter. And LinkerD1 also has a control plane. So for us, the control plane is just a set of controllers that we run in Kubernetes that basically tell the proxies what they need to do. And originally, they were written in Go. Because at the time, the Rust ecosystem didn't really pick up too much actually, just kind of in general, not even in the cloud native sense. We had to build a bunch of the Rust libraries that we're currently using from the ground up.  But with the control plane, we kind of resorted to Go because we didn't have the same requirements that we had with the proxy. We weren't in the applications data path. We weren't dealing with all of these very stringent requirements. And we just opted to use something that was easy and that had a very mature ecosystem. And a quick thing to note about our controllers is that they're not very traditional in a sense that we don't really leverage any big frameworks. Our controllers are very read heavy. We basically do no writes.  In 2.11, though, we made a choice. So LinkerD just reached 2.15. 2.11 was about two years ago. We made the choice of introducing Rust to our control plane. And it was mostly an experiment because we just like rewriting stuff in Rust. But we also kind of had enough of nil pointer exceptions. And we had enough of bugs that were very, very hard to actually track because they were happening at runtime. And to be honest, we also had enough of putting mutexes over all of our maps because it was very hard to reason with concurrent and shared data. So with that being said, I kind of mentioned controllers a couple of times. And for people in the room that are not really familiar, controllers are how you implement the operator pattern. And when I was researching material for the talk, I came across this white paper from the CNCF about the operator design pattern. And I pulled out this quote. So the operator design pattern defines how to manage application and infrastructure resources using domain specific knowledge and declarative state. That's a bunch of buzzwords all put together in there. But I really like to quote because it kind of highlights my own understanding of operators and controllers. With our applications, we're used to configure them in two ways, right? You configure them statically for a configuration file or for environment variables, or you configure them dynamically, which is probably what we kind of do in a cloud native environment, right?  And you need to discover configuration dynamically at runtime.   They allow you to extend the Kubernetes API service because the Kubernetes API server is very generic. It only supports, you know, core resources that make it tick. And it just basically offers you an interface to deal with configuration management and to just automate all of your stack to support your applications. And if you want to read more about it, I put the link in here and I'm going to put the slides up too. And of course, that if you want to write a controller, and that's what this talk is about, writing a controller and Rust, you need to talk to the Kubernetes API server, right? What is the Kubernetes API server? It's just an ADP server. It just has a bunch of paths that it manages. You can get resources. All of the resources are versioned. But at the end of the day, it's just an HTTP server, right? So in order to talk to an HTTP server, you need an HTTP client. The only problem is you need to decorate that client with a bunch of config, right? You need TLS config. You need to somehow discover the actual API address. You need to deal with service account tokens because you probably use RBAC. There's a bunch of complicated stuff that you need to do to talk to the API server in order to build a controller. And most operators, or at least the operators that I've kind of seen out in the wild, are written in Go, primarily because the library that you get to interact with the API server comes directly from upstream. It's really well optimized and it just makes writing everything a breeze, right? You don't need to complicate yourself with writing everything from scratch.  In other words, the ecosystem is very mature. And I think one of the things that people have at Rust is that the ecosystem is not as mature, and I'm kind of here to convince you that that's not the case. But first, let's see how you actually use Client Go, the upstream library to build a controller. You can basically create a client. You just have some environment config. You read that in. You create a generic client, and now you can use this generic client to access a bunch of resources. You list the resources all as well. But even though the API server is just an HTTP server in a trench code, it takes a lot more to actually run a production grade controller, right? You need backoff policy so you don't overload the API server. You need to have some queuing strategy in there. You need to subscribe to resource changes. There's a bunch of stuff that's involved in actually writing something that's production grade. So that's why the Go ecosystem actually has some runtimes that it offers. You have controller runtime, you have cube builder. All of them do kind of the same thing. They let you just basically use these frameworks that take ownership of your data and, you know, they take a function that reconciles stuff and, you know, it abstracts all of that complexity away from you so you don't have to deal with it. Which is nice. But that doesn't mean that we have to use Go, right? Again, going back to my Rust evangelism strike force meme, we can just rewrite the entire ecosystem in Rust. And this is what people have been doing for the past two years, three years, I don't know. Timeline's a little bit hazy. But the point is that the CNCF landscape for Rust is thriving. I only have a couple of logos so, you know, like, the slide's not really a mirror of what's actually happening in the landscape.  And here's where, I guess the talk gets interesting. Rust's answer to client Go is the cube crate. Has anyone here used the cube crate before? All right, not a lot of hands. That's good because I'm going to talk a lot about it. It's like half of this presentation, I guess. So the cube crate is basically Rust's answer to client Go, right? It's a library, basically a crate that contains four other libraries that give you all of the abstractions you need to actually interact with the API server because, again, fundamentally everything that you need to do in a controller when you write a controller is to interact with the API server. So you have a client crate that basically abstracts away all of this client creation stuff. You can read it from the environment, you can create HTTP clients, you have a core trait that provides a bunch of interfaces that you can use to build better abstractions or to work with all of the types. It has a derived crate that allows you to create CRDs and it has a runtime in case you don't want to worry about all of the glue code that you actually have to write. So this is how it works. If we kind of compare this to the initial Go example that we had, it's essentially the same thing. It's just a different library and a different language. So instead of having Go's usual main entry point, we have an asynchronous function because most of the stuff that we were going to build and rust, especially in a cloud native ecosystem, probably needs to be concurrent. So we need an asynchronous runtime going to use Tokyo because it's what people generally tend to use and it's battle tested. And then the flow is basically the same as the Go counterpart.  And then you use this API type to list all of the pods. So what's all of this code that I just put on the screen? Well, obviously the client is pretty self-explanatory. You know, you just have a function that creates a client but the API type is looking a little bit weird, especially if you're not used to rust syntax. It's basically a wrapper type that's generic over a type parameter. This type parameter is just a resource that you have in your Kubernetes cluster. It can be a pod, it can be a CRD, it can be a namespace, whatever. And it allows you to actually interact with the API server. The reason why it's generic over a type parameter is because different resources require different interfaces, right? If you're dealing with cluster scope resources, like cluster roles or namespaces, then you're going to want to have a different interface than if you're dealing with a pod. Like for one, the pod takes in a namespace. So the generics look a little bit scary but they're actually pretty intuitive once you get to work with them a little bit. But aside from all of the simple stuff, because we're not just building CLI applications, right? We're building controllers. QBRS has a runtime that has all of the batteries included. So you can create the same style of controllers that you can usually create with the upstream client go library or the controller runtime. And this is an example that I took from the QBRS codebase. You don't really need to understand it too much because I'm going to go into more examples soon. But it basically lets you create this controller structure that takes ownership of everything that you pass inside. You pass it a reconciler function and it just does its thing. So like really easy. You can get a controller up and running in no time. And this is just kind of explaining the same thing. But QBRS is really more than just a runtime, right? Like it contains a bunch of glue code. It's the controller runtime put together. It's Q builder. It's client go. It's everything packaged in a nice, neat box. And to kind of illustrate how easy it is to create a controller using QBRS, I actually set out to create a controller for a resource that we recently introduced in Linkerd. So let's say you have a controller, right? It needs to do some sort of dynamic configuration. It needs to reconcile some resources. That's exactly the kind of example that I wanted to highlight here. We have this external workload resource that you don't really need to worry about, right? It's a CRD. We want to register some bindings for the CRD and then we want to do something with this CRD. Every single time we see an instance, we just want to reconcile that instance. So on the left, is it on the left? Yeah, I guess. On the left, we have the actual YAML definition. So this is what the resource actually looks like in your cluster. Once you define it, you have a bunch of metadata in there that, again, you don't really need to be worried about. You have some IPs, some ports, whatever. But what this controller does that I kind of built just for this presentation, it puts a status on it. So statuses are generally things that controllers modify, right? Because you're not really supposed to modify the spec of an object once you persist it into HCD. So this controller will always slap on a ready status whenever it sees an external workload resource. And just to show how easy it is to just create the bindings with QBRS, we have the bindings on the right. So you use a procedural macro. You have a struct that represents your spec. You fill this struct out with all of the data that you actually have in your YAML. You slap on some macros and at compile time, all of this gets generated for you and you can use it. And this is what a controller actually looks like. So we have a reconciled function. That's the bread and butter, so to speak, of our controller. It takes in our actual object and our actual object is behind an atomic reference counter pointer because we want to share it between threads and because we want to probably store it. We have a context. It's just a shared context of stuff that you might want all of your reconciliation loops to keep track of. In this case, the shared data is just a client. We want to reuse the same client instead of building it every single time. And then inside the body of this reconciled function, you just implement your reconciliation logic. So in this case, we just want to work with a status. On line 14, you can see that we get all of the conditions. If we don't have any conditions, we default to an empty vector, to an empty list. And then for every condition, we just want to check. Do we actually have this condition already put in our status? If we do, then there's nothing for us to do. Just wait for the resource to change. Otherwise, we just create this boilerplate condition. We change the status, we write it to the API server, we patch it, and then again, we say call me when something changes with our resource. And to run it, and to be honest, this is probably a little bit overkill, but I just wanted to prove a point. To run it, we just have a wrapper function around it where we take all of this out of band configuration that our controller might need. We pipe it into controller.new. We have some knobs that we can twist, but other than that, we don't really need to worry about what happens inside, right? We just pass it a reconciled function, we pass it an error policy to share data, and then we just say, okay, do your thing. I'm going to go and focus on my next ticket. But the problem is, or at least the problem that we noticed in Lincardia is that sometimes controllers need to hold a lot of state. Sometimes controllers aren't simply just reconciliation loops, right? So Lincardia's control plane, it indexes a bunch of state, and then it exposes the state to proxies over gRPC APIs. So proxies can always dial in, they can get data, but we don't actually want to write any data. We just want to do a bunch of reads. And there are a couple of reasons for this. The first and foremost is that we kind of took this from first principles, and we thought about Lincardia as a distributed system. So what do we need in a distributed system? Well, we need to replicate the state because we do not want to have a single failure point, right? We want to have a separate failure domain. So if the API server goes down, your traffic's not going to go down because we index all of the state and we keep driving discovery for all of the proxies. We also wanted to ensure that there's a separation of concern, right? We wanted to ensure that we have clean interfaces around all of the controllers that we build and all of the proxy code that we build. So we wanted Kubernetes to be completely opaque to the proxies. And it turned out to be a good thing because we just introduced mesh expansion and we read it and want the proxies to be aware of Kubernetes in that specific scenario. And, you know, the last point is that we can always optimize better in the face of overload because we own the code. So there's a bunch of cool stuff that we can do inside of our controllers because essentially every single thing that we do is to translate them to domain types. So frameworks generally work well in most cases, but not for us, right? We can't use a framework because we don't have a reconciliation loop and we just want to read stuff. And this applies to using kubrs as much as the go controller runtime. So we don't use any of this stuff in our own code. This is exactly why we built kubrt. It's a toolbox with common patterns that we use all throughout our controllers. So in Go we didn't really go down this round.  But in Rust we thought that we can do better. So yeah, we built kubrt which is kind of a general purpose library that offers a bunch of glue code that helps you write controllers that are very heavy on reads in a much nicer way without you actually having to dig in into all of the abstractions that kubrs builds. So kubrt is built on kubrs. It uses the same kind of runtime concepts to talk to the API server but it includes a bunch of things like CLI helpers, an admin server, it has some drain and lifecycle helpers to help you manage, manage your controller better, some Prometheus metric adapters and stuff that's, you know, a little bit more opinionated and wouldn't work in a generic fashion. So it's not upstream into kubrs. But the most important thing is that in kubrt the application controls the storage, not the framework. And I think this is a very important thing to note when building controllers in general. You don't want the framework to own all of your data. You want your application to own all of your data. And there are some really good advantages to that. For one, you don't have to hold all of the Kubernetes state inside your actual controller. Right? You can just prune it as much as you want. You just hold all of the data that you actually need to implement your business logic. So this is how kubrt looks like. Might look a little bit confusing. But on the right, this is kind of our entry point. We have this names-based function. We also have a cluster analogous function that basically does this for cluster scope resources. But it basically takes a store. This is an index. It's a store that's protected by a read-write law because we want to share it between threads. And then it takes a stream of events. So these are all of the events that come from the Kubernetes API server. And what this does is it calls this index names-based resource trait. It calls the functions in there after it flattens the stream of events. So if you have an event where a pod was created, it will call the apply function. If a pod was deleted, it will call the delete function. So basically, this namespace thing just makes sure your state machine is running correctly. And then the index namespace resource trait simply just applies all of these to your index. So it's a very simple kind of way of structuring your controller. And just to show you how easy it is to implement, this is exactly what an index can look like. So in our external workload example, we key everything off by the name of the external workload. And then we don't need to hold the status. We don't need to hold the spec. We don't need to hold any other information about this resource, because it's very esoteric. It's very Kubernetes principled, right? And we don't need that. We just want to know if this workload is ready. That's it. So we just kind of hold the boolean in. And that actually saves a lot of bytes. You wouldn't believe it. And this is how you just implement the trait. You have an apply function. The trait is generic, again, over the actual resource that you want to use. And we say that, OK, whenever you see this resource, whenever you see this external workload and you want to apply it, just look at its status. Find a condition. If you found a condition, then just insert it. If you didn't, then just remove it from the store. Easy peasy. You don't have to actually deal with any reconciliation loop or any backup strategy or anything like that. And then in the main function, you just start the runtime. You create an index. You create a feature to watch all of these resources from the API server. And then you just tell the asynchronous runtime, like, hey, I've got a task for you to run. Just keep running this until we're done with all of our work. That's it. Now, when you have to choose between Qbert or QBRS, I kind of wanted to highlight that there isn't really a strong preference for one over the other. It really depends on what you're trying to build. Are you trying to build something that's right heavy?  But if you want to build something that's purposely built for your application domain where you need to work with your own domain types, then using something like Qbert is probably a better idea because it allows you to structure your application differently and allows you to have control over your storage, which is really important when you operate at a high scale. So in the end, I guess, it's just a matter of which flavor you like most, and it really depends on what your controllers are doing. And then if you want to learn more about mesh expansion, my colleague, Zahari, is going to have a talk about it just because I mentioned this external workload resource. But that about sums it up. And in my trial runs, this actually went 10 minutes over.  Do we have any questions? There's someone over there. I don't know who's got the mic, so. Hello. Thank you for your talk. I would like to ask if there are any disadvantages that you have noticed with Rust? Because most of the people, they mentioned the advantages, but you usually hear about the disadvantages. Yeah, if there are any. That's a really good question. I think that disadvantages that Rust has a bit of a steeper learning curve when it comes to using languages like Go. So I think Go is a very elegant language, for example, for writing network services. It gives you a very nice and streamlined concurrency model. You don't really need to think about what your data is doing. You don't really need to hold a bunch of context in your mind. You can just be very productive in a matter of hours or days. But with Rust, the concurrency model is a bit trickier to reason with. First and foremost, you have this async await kind of syntax, but futures are lazy. And it's a bit of a leaky abstraction, right? You need to know how futures work, and you need to know how the asynchronous runtime work in order for you to use it. So it's a really nice abstraction once you learn how it works. But usually with abstractions, you shouldn't know how it works. And I think that's Rust's biggest disadvantage that I've noticed personally. Perfect. Thank you very much. Any other questions? Yeah. Yes. Hello. Thanks for the talk. You talked a lot about performance and memory in the talk. Did you have the occasion to compare memory-wise if there is an advantage to use Rust instead of Go? Yes, we did. I don't have any numbers. Maybe I should have put some on. Had some slides with some benchmarks. So maybe I can go into feedback. But we did notice it because we run two controllers that index very similar resources.  And one is in Rust. The one in Rust always has less of a memory overhead. So it's something that we always notice even in the resource requirements that we give it. We always just go a little bit lower in both limits and requirements just because it doesn't consume as much and we manage to prune all of these resources. Thank you. I've got another question. And then I'll let it go. Is there any issue on the updating side of the Rust library? Because Go, a Cube client kind of goes fast. There is a lot of work being done very, very, very often. And I wanted to know if you ever had any issue to catch up. That's a very good question. So just kind of as a disclaimer, I'm a contributor to QBRS. It's true that in terms of features, it still hasn't reached the same feature parity. So for example, if you want to use leader election, that's something that's not natively offered by the upstream QBRS. That's something that we implemented in QBIRT in our own opinionated way. So from that perspective, there is a little bit of an issue here because we're still catching up. And of course, you don't have the same amount of people that contribute.  Client Go is like an entire special interest group that continuously drives innovation and updates. So that's one side of it. The second side of it is that QBRS being relatively newer still sometimes ships changes that might completely re-architect the entire thing. And as much as we try to not really touch the public interfaces so that we don't introduce backwards incompatible changes, it inevitably happens when you're still working on something that's relatively new. So that's a very good question, though. Hope I answered it. Yeah, I just wanted to ask, do you have any experience with like caching layers or how would you approach that in a Rust world? Is it built already in the library or because sometimes we need to cross-reference multiple objects, which is a bit tedious because we don't want to hammer the API server for every request? Yes, that's a very, very good question. And that's what I wanted to illustrate with QBRT, the library. So that's how we manage our caching layer in Linkardee. We basically just have a bunch of these global indices that we run for various parts of our work.  Most of the indices that you see in our code are not as trivial as the one that I showed in the slides, right? It's not just a hash map. We have lots of maps, trees, vectors, things that we use to hold all of the state that we transform after reading from the Kubernetes API server. But I guess that's an opinionated way of doing it. In QBRS, you can also do this through an object store. So every controller can also support taking an arbitrary object store that you basically provide out of band. So you can use the same store to share the same object across multiple parts of your code base. And something that I'm working on is bringing that to the controller framework. So you can actually share multiple watch streams. So if you have free controllers, for example, that work with pods, we want to be able to let you pass in a single stream that lets all of the controllers run reconciliation loops on the same object so you don't have to continuously pull the API server for the same resource three different times. Great, exciting. Yeah. Hi, so if I'm not mistaking, QBRS supports defining finalizers for controlled resources. Does QBRS support that too? No, but QBRS basically uses QBRS as a dependency. So you can use QBRS and then you can probably figure out how to rip some of that out from QBRS. QBRS was built more as an opinionated way for us to run controllers and to just aggregate all of our glue code in a place that makes sense. But if you do have a feature request, I guess, always happy to hear it. Cool, thanks. Hi, just a question on tooling. So you mentioned QBuilder.  Can you get that with QBRS today? I don't think with Rback. So I'm not super knowledgeable in QBuilder. Unfortunately, we wrangle all of our YAML by hand. I know. But yeah, I don't think you can generate Rback or any of that kind of stuff. You can generate schemas for your CRDs, but that's basically it. It's just CRD generation at this point. Okay, thanks. Any other questions? Go on once, twice, three times. All right, well, thank you all for coming. Thank you.