Welcome to this lecture on digital communication using GNU radio. My name is Kumar Appaya and I belong to the department of electrical engineering IIT Bombay. In the previous lectures, we have seen an introduction to the concept of linear block codes. We have then also looked closely at repetition codes and their utility. In this lecture, we are going to use GNU radio in order to build a repetition code encoder and decoder. What we will see is that encoding for the repetition codes is very easy because we will use the repeat block in GNU radio merely to repeat the bits that many times. For decoding, we will perform majority logic decoding that is we will count the number of ones. The number of ones is more than n minus 1 upon 2 or so. We will conclude that it is a 1. If it is less, then we will conclude it is a 0. For this, we will implement our own python block where we count the number of ones and let us say for a 3 repetition code, there are 2 or more ones we will conclude it is a 1 and for a 0 or 1 ones we will conclude it is a 0. We will also use a histogram with noise to show that the repetition code is very robust even in the presence of errors. We will begin by first having an equivalent of the binary symmetric channel by using BPSK with additive white Gaussian noise as our channel. So let us begin. We will first have a random source so control for command F we will say random. We will place our random source over here as usual we will convert it to byte data type but we will keep the number maximum S2. We will add our constellation related blocks so I do control for command F we will say constellation. We will grab our constellation object and the constellation encoder the constellation object we will set to BPSK and give it the name my BPSK and the constellation encoder we will connect and then we will call it my BPSK so that it uses the object. We are now set we will add a throttle control for command F we will say throttle after the throttle is connected we are now ready to add noise so we will add a noise source but before that let us actually make this real because for BPSK we can do with a real channel. So control for command F we will say complex to real and we will have the complex to real and then add a noise source so control F command F we will say noise we will keep a noise source over here make the noise source as a float and make the amplitude as noise is TD so that we can control the amplitude and control F for command F we will say add and then this add block will convert to float and then of course the noise is TD needs to be arranged for for that we will use a range so control F for command F we will say range and we will double click the range make the name noise is TD the default value 0 will stop it around let's say 10 step 0.1 and we're set now we can there we can then just do a couple of things we can decode the constellation so control F for command F we'll first say float to complex so that we say float to complex over here okay now the float to complex the imaginary part needs to be 0 so we'll add a constant source control F for command F we'll say constant we'll grab a constant source we'll make the constant source of float type and value 0 connected yeah we can now grab the constellation decoder so control F for command F we'll say constellation decoder and once you have the constellation decoder you now have access to the bytes that is the bits as well we will double click this and make this my BPSK now we can compare the original data with the decoded data so for that we will use two approaches the first is we'll have a time sink so control F for command F we'll say time sink we will rotate the time sink using the left key double click we will make the type float and make it have two inputs and unfortunately these are bytes so you need to convert them so we'll have a character to float so or maybe we'll just rotate it right and keep it this way we'll have a character to float so control F for command F we'll say C H A R actually so there is a character to float we will gap that connect the original data source here connect it to the first input we'll come copy another one control C control V and rotate this connect this to the second input and now we can visualize and we have something like this the red and the blue are overlapping because there are no errors now noise is TD controls the error if you now increase the noise is TD you'll start seeing errors occurring and these errors are the points where the blue and the red do not match and it is very evident let's stop and you can see over here the red you know wherever the red and blue overlap it is good but for example at these spots the blue is here the red is here there is an error similarly over here the blue is here the red is here there is an error over here there is no error but there are errors now if you let this run you will see that if you increase the noise variance you'll start getting more and more errors and you will get a completely random effect you can also verify this using a histogram sync so let's just rotate this to the left and maybe I can just add a histogram sync over here let's say control F for command F I'll say histogram sync now for the histogram sync I'm going to actually subtract these two and if I subtract these two I will either get 1 minus 0 which is 1 1 minus 1 which is 0 or 0 minus 0 is 0 or 0 minus 1 which is minus 1 so I can subtract these two and take an absolute value if I get a 0 that indicates no error if I get a 1 I get an error so I'll just control for command F I'll say subtract and I'll make this a float I'll subtract the original stream from the decoded stream and I'll also add an absolute block control F for command F say a b s and we'll make this a float and now we will come pass this subtracted output through the float and now we have a histogram sync so if you execute this flow graph this blue indicates that let's just remove the auto scale y blue indicates that there are a thousand out of thousand decoded correctly if you increase the noise STD you will start getting a one over here indicating errors so over here you have about 400 like 400 errors and about 600 are being decoded correctly if you reduce the P that is the bit error probability then you get 300 incorrect about 600 700 correct so you have a knob within which you can control the errors you can see that a lower probability of error you decode correctly a higher probability of error you make mistakes and if you have an extreme probability of error then it's 50 50 you have bit error rate of half which means it's as good as a coin toss so in this manner we have essentially constructed a standard binary symmetric like channel our next task is to add a code in order to see that the performance actually improves let us do that to do this we are going to use a repetition code and the easiest way to realize the repetition code is to just repeat the transmitted bits and at the receiver as you discussed in class you can decode them and use majority logic to capture them so do controller for command if I'm going to say repeat and I will get the repeat block the repeat block I'll double click I'm going to say interpolation is three and the type is bite so now I can connect the random source over here and now the interpolation is three of course I could have taken the encoded output and repeat it as well but let me just add a constellation encoder again so I'll do control c control v have a constellation encoder I don't need a throttle because only one throttle is enough for one flow graph I'll grab a complex to real control c control v connect this over here now since this operates at a rate slightly different because I am interpolating by three I will grab a fresh noise source so control c control v this also uses the same noise std so I am set I'll add control c control v the ad block and connect these over here next I will get the float to complex because I need to convert it back so I'll actually kind of copy all these three objects by like this and do control c and control v and move these over here now I can connect this to make convert it to real and then this is the constellation decoder the decoded output can now be viewed in the qt gi time sink or the ut histogram sink but first I need to decode and get back the majority logic so I'm going from three to one to do that I'm going to split this output into three so I'm going to use controller for command f and say stream demux so the stream demux can be used to split every three outputs and give them to me in parallel so I will connect this over here of course I need to change the type I double click change this to byte change this to one one one or if you want to write it compactly star one one star three with three and now I need to perform majority decoding logic on this in order to perform majority decoding on this there are multiple ways the key idea is for you to say if there are zero or one ones then conclude that a zero was sent if you have two or three ones conclude that a one was sent this is something that we have seen explicitly in the class so but implementing the majority logic you can do it in multitude of ways we are going to use a python block so controller for command f we will say python and grab the python block we will double click this python block open an editor choose any editor that is convenient for you and now let us edit this to perform the majority decoding logic remember we need three character or byte inputs and one byte output so we are going to just get rid of these comments first now over here we don't need this comment we don't need this parameter now let us first call this majority decoder i'll call this np.int8 i need three inputs so i'll just say np.int8 three times and the output is a single np.int8 these np.int8s are either zero or one they are not they don't contain eight bits it's an eight bit vector containing only zero or one in the least significant bit that is the key thing that you have to understand so all we need to do is to find the number of ones and zeros in each of you know in these three parallel inputs and then conclude what was sent based on that now the work function in the work function we have to change this let us do it carefully the way we are going to implement our majority decision logic is to add up the inputs so if you add up the inputs each entry is going to be either zero or one so if you add up the three inputs you're going to get either zero one two or three so if you add up the input let's say temp is input item zero plus input items one plus input items two now in temp you have an array consisting of the array it's like the addition of the arrays input items zero one and two each of these has zeros and ones and the entries are now going to be zero one two or three now in temp which we're going to map to the output whenever you have two or three you want to set it to one whenever you have zero or one you want to set it to zero let's first handle the zero or one case first so temp wherever temp is zero or one we'll say temp less than or equal to one is zero wherever it is two or more we'll set it to one finally all we are going to do is to map this output items as temp and this is done now why does this work see input items is an array it's like input items zero input items one input items two are all arrays of the same length each corresponding entry has the three repeated code which has gone through your binary symmetric channel now our task is to conclude what was sent based on the most likely event the most likely is that a single error has occurred or no errors have occurred if a single error has occurred then you will either get if you send zero zero zero zero zero zero zero one zero one zero or one zero zero that means if there is a single one you can just conclude zero zero zero was sent if there are two or more ones one one one was sent and then you map back the correct bit so let's save this and exit and now we have a nice majority decoder we can connect these up and this majority decoder output can then be compared let's first do the time comparison so we'll add three inputs go down every input is three and now we can copy this character to float control c control v grab this over here connect this up connect this up and now if you execute the flow graph you see a green also that matches the blue no errors and if you increase the noise then you will see that the green let's say that we set it here you will see that the green essentially will track the blue more often so if you look at the green and blue versus red and blue red will have more errors let's set the error to be a little lower and you'll basically see let's say we set it here you will see that the green and blue have few errors there are very few spots where there is a mismatch but if you look at the red there are many more spots where there is a mismatch of course the true way to find this is to view the histogram so let's modify the histogram so I'm going to double click let's not auto scale and let's add two inputs now the second input you have to perform the same operation you have to perform a subtraction and absolute with the original let us actually do that so I'm just going to copy control c control v I have the subtraction over here connect this output to this over here and connect the original over here and again an absolute so control c control v I'll grab an absolute I'll grab move this absolute over here connect this and connect it to the output let's just move this to the right a little so that you can see what is happening now if I execute this flow graph you can see that there's a red and there's a blue which are overlapping in fact maybe let's actually do one thing let's swap these so that you know the second one essentially or let's just leave let's just let's just swap these yeah now if you execute the flow graph yeah it doesn't matter maybe I just undo that yeah if you now increase the noise you will see that the blue one pops up when the red one pops up the red one is with the repetition coding as you can see the number of errors is much higher in the case of the blue one which is without coding while the red one is pretty robust because of the fact that you are performing repetition coding let's increase the noise as you increase the noise you are able to see that the both the peaks fall but again the red one is below because repetition coding allows you to correct the errors at least one error among three it is able to correct most of the time now as always if you increase the effect of repetition coding you are going to get better performance for example if you set this interpolation to five and if you set this to five and if you change the majority decoder to account for five errors let's do that so we need to add two inputs here we've added two inputs now let's add them here also now in this case when you have five we have to change this slightly zero one or two will result in zero three four or five will result in one let's now inspect our performance okay so let's I think I made a small error I'm sorry so if you now look over here in p.int8 in p.int8 yeah there was a small syntax error I apologize so we'll fix the syntax error there should be a comma here this will fix things now we can connect these over here and this particular code will result in even more of error correction okay let's see so he says list index out of range yes so there's one two three four five zero one two oh three four I'm so sorry yes now if you execute this flow graph you will see that even with a slightly more number of errors you can see that the red one is much better in fact if you see if you can compare with the same let's say 1.5 the noise standard deviation you will see that the red one is actually much lower because you're able to now correct two errors remember the five repetition code can correct two errors even with a higher amount of noise you can see that the number of error correct the amount of error correction offered by the five repetition code is very very significant let us go one step further and let's make this nine here also we'll make it nine and here we'll have to make it nine in order to avoid these kinds of errors let us actually just make this star nine that will give me nine inputs and over here you know you can always just do plus five six seven now in the case of nine zero one two three four will be the result you know if they're up to four ones you can conclude zero five or more ones you have to conclude one right so now let us evaluate the performance of this block connect these connect these connect these connect these and if you now execute your flow graph let's set it to the same 1.5 with 1.5 you can see that the errors with the coding is even lower in fact only about five percent of the bits are in error and rest are all correct even if you increase the noise the red one is very very robust and you are getting a much much more effective error correction because of the use of nine length repetition of course as you saw repetition coding results in very good performance but the price you pay is you have to essentially reduce the rate to one ninth and that is a major price that you have to pay and therefore repetition codes may or may not be very useful in the longer kind of in all kinds of systems where efficiency is needed which is why we will move on to better codes like hamming codes in the next lecture. One final remark in particular I want you to just note a trick when you use the histogram sync is that one issue with the current implementation is that this blue and red are overlapping and it's sometimes difficult to see you know how much height there is and everything like that of each separately you have to hide one over the other so since the values are zero and one we can play a trick by offsetting one of these to a small extent that is let's say you can add a constant to one of these so let me do this so controller for command f I'll say add constant and I'll add a floating constant of let's say minus 0.2 if I add the constant minus 0.2 before sending it to the histogram you can see the histogram bins separately so if I hit run so you can see them separately so now if I add noise also you can compare the heights of these more conveniently on the same graph so it's very very convenient and you can sort of visualize things in a much easier way the other remark that I wish to make is that if you have an extreme amount of noise in this case if I make the noise standard deviation 10 that corresponds to noise variance of 100 so it's like the snr is close to 1 upon 100 then you can see that the performance is essentially really poor for both of these of course still the repetition code's height is better because it is able to correct some amount of errors but this confirms our hypothesis that as the p goes to half that is your eb by n naught goes to zero as you discussed in class the error performance becomes poor even if you have coding if the error is a noise is too much you cannot recover the performance this is something that you have to remember in terms of the bpsk the n naught is very high so you can't really distinguish between the plus 1 and minus 1 very easily in this lecture we have built a repetition code based error correction system in GNU radio as we saw the error repetition based error correction code also encountered errors but it is much much more robust than the uncoded system and we saw that even when you have a large amount of noise the repetition code resulted in a significant amount of error correction and performed much better than the uncoded system as we saw by looking at the histograms comparing the correct and the erroneous bits decoded one major issue with the repetition code however is the fact that it is very poor in terms of rate because you are essentially repeating for nine repetition code you are repeating it nine times so when compared to the uncoded case your rate is one ninth there is a huge amount of overhead or loss in performance in the next lecture we will look at the hamming code which is very effective at correcting a single bit error and it's it still offers a much higher rate than just a plain repetition code thank you


You really can't set out to get the perfect bird for you without having that kind of experience. And yeah, there may be some surprises along the way. Hello, my fellow snippers and flighters. My name is Marlene McCohen. This is Jersey, allowing herself to be in this video today. For those of you who are new to my channel, welcome, welcome, welcome. I'm so happy to have you here. I want you to feel welcome. So let me just tell you what my channel is about. I am here to help you love birds, make a commitment to birds, and help you better understand them, which I think is very important. And birds are extremely misunderstood. So please try to watch as many of my videos as possible so that you can get a good idea about the good, the bad, the fun, the not so fun. Let's do a couple of shout outs before we go on. I want to give a shout out to Janet Burr, Ryan Menard, Sky Tides, Marie Sharon One, and Zuma Dude. Thank you so much for being subscribers. It really means the world to me. So for those of you who have been following me for a while and you enjoy watching all my series, which is how I recommend to watch my channel. Go back to the beginning of a series and see what's going on. I think that this video is extremely important and timely to watch today. So we are going to talk about five reasons why you should volunteer at a sanctuary. Now, I thought this video was extremely important today, and I'm going to tell you why before we get into it. And that is because I have recently found myself with a brand new baby bird. For those of you who are new and don't know anything about me, I have a lot of rescue parents and I promote rescuing birds. Plus show you a little bit of entertainment along the way. Now, in this industry, there is a lot of debate going on. If you love birds, you know that there's a lot of people that are against going to a breeder and getting a bird. And there's a lot of people that cannot handle rescues. So in light of me getting Brando, I thought it was very important to make this video because I wanted to kind of re-go over where my values are and what it is that I'm trying to do with this channel. The parents in this world are in a crisis. If you guys don't know this, you need to research it. We have way too many birds that do not have homes. And on top of that, we have way too many people that do not understand birds. So on one hand, here's the birds that do not have homes way up there. And then here's the people that don't understand parrots, right? And here's where the problem lies in and the way I see it. We have people that don't understand enough about parrots to even go rescue them. Because let me tell you guys the truth. If you knew how many emails I got about irresponsible adoption, it would be an eye-opener for you. People that email me and say, I went out and I rescued a cockatoo. I don't know how to rescue. Let somebody have a cockatoo that has never dealt with birds. And I don't understand how they didn't do enough research to just go out and adopt a cockatoo. So there are a lot of birds in the world that need homes and probably will never be able to find one. And if they do, they will probably be re-homed because people don't understand how to take care of them. And no matter how much research you do online and how much you read, it will honestly never ever be enough. Now with my channel, what I'm trying to do is get you to understand how to make a commitment to your bird from wherever it comes from for you to get your bird responsibly and know what that commitment is going to take. That's why I will show you a lot of the crazy things that birds do. And I will show you a lot of the imperfect behaviors that they have. And then I will show you a lot about how to deal with it and also to entertain you because I need to bring awareness to people that have never ever known a thing about birds. And what's beautiful about this is there are many people in the world that like I was when I was seven years old, I never thought I'd be a candidate for a bird. I never wanted a bird. I thought they were probably useless, honestly. Not gonna lie. And now look at what I have to offer the bird world. And that's where I'm coming from. I want to spread the word on how amazing these birds are but also how difficult they are because there may be people all over the world that could rescue a bird and give it a beautiful home. But most importantly, I want to help you guys make a commitment to your bird, a lifelong commitment. I have made a lifelong commitment to my birds and I wanna help you do the same. So with that being said, no amount of research will prepare you for getting a bird. Nothing that you find online. A lot of these videos that you guys are gonna watch, my own included will never prepare you for what it's really like because when that honeymoon phase wears off and you get your bird home, they start becoming hormonal or different than you expected and they're not your babies anymore. This is gonna come in really handy and that is why we are about to go over the five great reasons and most important reasons to volunteer at a sanctuary, a shelter, or a parrot rescue before getting a bird. So the first reason is hands on experience. This is so important with birds. I don't wanna like compare having a bird to lion-taming but if you notice, there are a lot of people that have sanctuaries and are extremely good with animals that me and you would never really get to have those kind of interactions with but there are people out there with a certain amount of skills and talent to do so. And I believe that although it's not as dangerous, it's definitely as important to have the skills to work with parrots because they are still wild. They're only two generations removed from the wild at all. They're not like dogs and cats at all. And if you don't understand them, they're going to be re-homed or returned again. The success rate for keeping a parrot for its entire life is extremely, extremely low and there's just not enough education out there. And if you go volunteer at a sanctuary, you will get hands on experience with birds that will be unlike anything else. You can also work at a bird store as well and just learn how difficult these birds are. And another thing you're gonna learn from working in a sanctuary or helping out is really how often they get re-homed, how often they come back, how unprepared people are before they take birds home. I can't stress this enough. It's unbelievable the crisis that we have and the only way to see it is firsthand which brings me to reason number two. You will be doing something great, not just for that sanctuary but for the bird. I have gotten emails from people that have thanked me because they have decided to go work in a sanctuary. And what I love hearing from you guys that I've heard more than once is that maybe you got to that place and the sanctuary people were already tired or not bonding with a certain bird and then you came in and that bird took a liking to you because for whatever reason, you reminded them of a previous owner that they loved or there was something about you that they trusted and this bird that never had anyone that could deal with it now has a friend. You're doing so much for the birds in there and also for the sanctuary itself because let's face it, a lot of these sanctuaries have hundreds of birds and not enough people to interact with them. And parrots need a lot of interaction all day long even if you practice, engage, not cage.  These are the things that are extremely important which brings me to reason number three. You will find out pretty quickly if having a bird is right for you. You may love birds. I have friends that come over here and love my birds. They wanna talk about the birds. They wanna interact with the birds. They are so aware of all the talents of all of my birds. They seemingly don't get tired from playing with the birds. They wanna feed the birds. They help me put the birds to bed. For some reason, all of my friends are involved in this. Like when my friends are over, like I include them and part of the reason I'm doing that is cause I'm getting them used to in case I need a bird sitter or any kind of emergency. I have friends that seemingly never get tired of the birds but they don't have birds themselves and when they go home, they get to go home and it's just like people that love kids, maybe you love them but not enough to have the responsibility. So this will kind of be telling and you will start to understand that, yeah, maybe you are the right person to go and bond with a bird but not the right person to bring one home which leads me to my next reason. You might find the bird that you're gonna bring home. You may go in there and really have the time to bond and discover the bird that has bonded with you. A lot of times people go into, let's say a bird store and they set out to get a parrot and they have this specific idea of the kind of bird that they want because they saw a bird dancing on YouTube or they saw a bird talking or they heard that African Grey's talk so they set out to go get that kind of bird and that kind of bird may not be the right bird for them because birds have such different personalities and different temperaments. Every species is so different and then within each species, every bird is different. They all have their own personalities, their own history and their own ideas of who they are. Depending on how long you are with the bird, you're going to imprint that on them or somebody else may have imprinted on them already. You may go in there and really get the chance to freely bond with the perfect bird for you. It's almost like the perfect situation for you to be like the bachelor or the bachelorette and all of these birds are there and one chose you and why would you turn down the one that chose you to go for someone else that is more difficult? You wouldn't and a lot of people don't have that opportunity when they are looking into getting birds and a lot of people don't have guidance when they set out to go get a bird. Obviously I'm passionate about rehoming, I'm passionate about adopting parrots and I feel extremely confident in my skills to take care of all sorts of birds with all sorts of behavioral problems and build up their confidence, which is one of the most important things because a non-confident bird is going to be needy, stressed, plucking, all sorts of different things and depending on where they came from and what their habits are, it may be impossible to change. But at the same time, you need to know who you are and what you can handle and I believe that only a sanctuary is going to be able to give you that. It's going to be able to give you choices and a lot of knowledge and a lot of firsthand experience with parrots which really leads itself to my last reason and believe me, there's a million other reasons why you should go work at a sanctuary, volunteer at a sanctuary besides for these five but these are the five that I wanted to stress on and that is learning about different types of birds. A cockatoo's going to be extremely different than an Amazon and then speaking of Amazon's, Leo is extremely different from most Amazons. You know, just in his behavior and his temperament and then Vinny, my Gala cockatoo is very different from a lot of other cockatoos. So you really can't set out to get the perfect bird for you without having that kind of experience and yeah, there may be some surprises along the way. A lot of people think they want an extremely cuddly bird. I love birds so much that obviously I love those birds that want head scratches and I enjoy giving my birds a head massage so much but truthfully, I found out a long time ago that I am not the type of person that enjoys a bird being dependent on me. So I try to create extremely independent parrots that don't have to be on me to be happy which is extremely important and I found out that I'm more of an African gray type person but I came from a family that really loves cockatoos and enjoys the interaction and certain kind of affection that a cockatoo gives but for me, I don't need that. I need more of the intelligence factor by way of verbal communication and don't get me wrong, my bird doesn't have to speak at all on my favorite bird of my lifetime besides from my African gray George was you guys know my mustache parakeet who didn't say a word. So it's not really about that but it's about a certain kind of communication that different birds give you and you may not understand what you want until you've really experienced it. Cockatoos are considered velcro birds sometimes and personally, I think they're velcro birds when they're getting the wrong kind of stimulation but some people think they're gonna thrive on that and then they don't. Being in a sanctuary among many different species of parrots can really be beneficial for you making the right choice in the long run, right? What I'm trying to get at is that I want you guys to be able to make a commitment to your parrots and if you bring your bird home and they suddenly do something unexpected and a lot of times birds do things that are unexpected and change their moods and behaviors after five years of having a bird that can be extremely confusing. That's why to some people they think it's a great idea to go to a breeder and get a baby bird and then when that bird becomes hormonal and hits puberty, they don't know what happened because they had five years of this perfect little baby and then it turned the devil on them and they can't handle anymore. They take it personally and they don't know what to do. You could get a really quick education in a sanctuary. You would know real fast. I mean, just the people bringing in their birds and returning them and saying why and why they couldn't handle them and what changed in their life. It's all gonna be food for thought for you to think about your future and how your life might change and to be a little bit of an empath not just to the birds, but to the human beings that thought they were prepared and they weren't. So for me, the core of the problem is not just that there's too many birds and there's breeding of birds and then there's birds that need to be re-homed and they can't. For me, a lot of the problem is people's commitment to the birds and that's what I like to stress. I like to stress on the fact that when you get a parrot, it's forever. I want you to know how long they live. I want you to know how difficult they are but I want you to know how fun and loving they are because I kinda wanna reel in those newbies that really could be great for birds with the right education, with the right preparation and with the right ability to commit. I feel like this channel is important to watch in its entirety. So that you watch all the educational videos but then you watch all the videos that are entertaining and seem somewhat, wait, what? Vinny is dive bombing George and then videos that talk about food and videos that you can see how free the birds are in the house yet they're contained. I want you guys to understand every aspect of this. So I don't want you guys to just be entertained without educated but I don't want you to be educated without entertained. I want you to know the personalities of these birds and the potential that they do have because if it's so educational sometimes you come home and you may not know all the things that you can learn from your bird and what they might surprise you with. You might give up, right? I don't want you guys to give up on your birds ever. And with that being said, I want you to share this video and I want you to share it with somebody that either has a bird stuck in a cage that isn't aware of these things. People that love animals and need to be aware of the problems that we're having in the bird world and just generally share it to get the word out of how important it is to teach people about the commitment that it takes before getting a parrot, the commitment that it takes when you get a bird and also the struggle that these birds have or like a bunch of little orphans. I mean, they're not really supposed to be living in our house. I'm the first person to tell you that but I'm trying to improve it guys. All right guys, that is it. If you enjoyed this video, please give it a thumbs up, comment down below. All the other reasons that you think it's important to volunteer in a sanctuary, even a bird's door, wherever you can, whatever it is so that you can learn. Don't let anybody put you down for learning. Learning is gonna be the most important thing that you will ever do. Learning, reading, watching, hands-on experience. If you guys enjoyed this video and made it this far, please subscribe. It means the world to me. Leo wants to tell you something. What do you wanna say, Leo? Oh, he wants to say that he's so cute. Yeah, see, yeah, are you cute? He is extremely cute. You guys love my Jersey shirt? Jersey, did you even make it in this video? She was in this video. Then don't forget to check out my link below. It's www.paritiation.com and you can shop there. I love you guys so much. For those of you who are a part of my Flyders Club, thank you so much. Those of you who don't know what my Flyders Club is, it's my Patreon where I offer you guys Perk's early access videos, exclusive footage and such.  I love you so much, thank you, bye. Hey guys, I am loving the photos and videos you are tagging me in of your new feathered bun box for those of you who don't know, the feathered bun box is our new subscription box of toys, treats and other surprises for you and your bird. So don't forget to check the link below and get in on that. And guys, don't forget to check out my new line of organic bird food called Marlene Signature Blend made with tops for small and large birds. The link is below.


Many young Americans with no farming experience are entering agriculture. They are learning about agriculture in college. Emily Sloss is showing visitors around Duke University's new campus farm in North Carolina. We don't use synthetic fertilizers or pesticides. Emily Sloss studied public policy at Duke. Now, she supervises the university's new campus farm. Now I'm a farmer, yeah, believe it or not. In its first year, the farm has provided more than two tons of fresh vegetables for student meals. Nate Peterson directs the dining halls at Duke. It's phenomenal. The produce that is coming out of the Duke farm and coming into our cafes is excellent quality. Maureen Moody has studied what makes young people want to become farmers. Now, she herself is a farmer at the Arcadia Center for Sustainable Food and Agriculture near Washington, D.C. A lot of people that are becoming farmers now are not the people you would traditionally think of as farmers. Me and a lot of people I know, we didn't grow up on farms. I've been eating this food all my life without having any idea where it comes from. Movies like Food Inc. and Books, critical of American food production, have led some young people to consider a career in agriculture. But Maureen Moody says many who become farmers have difficulty succeeding. It's really hard to stick with it after a few years. Some do and I think they figure out a way to make it work, but it's really hard to make any money and to make a living. I'm June Sims.


And this talk, this is pulled from a past talk that I've done quite a while ago. So I'm not going to, I'm going to blaze through a lot of this. You can go find the slides online later. There's links and or demos that you can see and try for yourself or have more information on. This is only a 15 minute talk. So there's more content here than 15 minutes. I'm going to blaze through that. So yeah, pass the file system validation. This is something that came out of an assumption for a lot of the container images. There are things that you can do to make image, you know, make file systems read only. And it was always a rat hole of a conversation because eventually somebody would say, well, you can mount it read only. You could do this other thing. Or you might have a copy on write file system. Or what if it corrupts? What if somebody does cat-dac override and they start going around you and you're like, like OS tree tries to solve certain things and read only ways. And at a certain point you just have to make an assumption that it's either good enough for our use case or if there's like a break glass scenario that you can just like wipe the file system and let the imagery pull itself or something like that. How to verify that what you have on the file system is what you expect to have on the file system. And so some folks would end up having the conversation of, you know, DM Verity and these other things, but they're like pretty tailored solutions. At the end of the day, you had to have some kind of a way to package.  Anyhow, all these different pieces, but still do it in the most generic, like the most common denominator approach. So I think that's all of them. Anyhow, it's crazy when you deal with these packages and different packages try and solve this in different ways. Everybody in the world has seen like a SUMS file. You download some kind of content as a SUMS file and you have, you know, MD5 back in the day and then SHA-1, SHA-2, SHA-56, SHA-512 and you have to have all these different IDs of something depending on what's most efficient for your machine to compute or what's irrelevant these days. And, you know, different formats. We tried CPIO for a little while and it was cool. It's under a similar POSIX standard as tar archives are, but neither one of them accommodate, you know, X adders and, well, file capabilities part of X adders. Anyhow, like long file names and like just terrible stuff, they're all, they just keep recirculating terrible stuff. And even with container images, we're pushing around like 500 meg gigabyte images in their tar archives, several of them together.  And so now you have these bundles that are getting pushed around. They have to have some kind of a content address ability, like an ID that you're pushing and pulling them around. And for folks in here that have, who in here has used Docker either before Docker 1.8 or Docker 1.10, really. Docker 1.8 folks, about half of you. Who knows that the Docker ID that you had, it hasn't changed for a lot of people and now they call it digest, which I'm glad that kind of disambiguated that they're two different things, but that the Docker ID from back in the day, it was a SHA 256 number before Docker 1.8 was not content addressable. There was absolutely no part of pushing, pulling, building, having any hopes that the ID that you got is the same that's on disk before Docker 1.8 was garbage. And every single time you pushed and pulled the image, it mutated. It was actually a different tar archive every single time you pushed it. So having any kind of like infrastructure for signing and assurance model was out the window and it's a, anyhow. And so even further in this content address ability is that once we started getting reproducible tar archives in the workflow so that we could have content address ability and build something like a digest, the things that some system started choosing was the content addressable address of the compressed archive, which was a, is a terrible decision. Like if you're ever in this space, I have ideas, but they're terrible ideas that always take the content addressable ID of the uncompressed piece. Do yourself that service because in that situation, it was relying on Golang at a particular compression level and the way that the Golang does the deflate and inflate, not Merkel, yeah, the Huffman trees, Huffman trees, the cascading trees of the words, it was consistent to itself, but it was inconsistent with GNU or some of the other ones, like there was two or three Zlib, all three of them were inconsistent with each other. And then often people would make certain types of like optimizations, like pass, especially if you were using Zlib. If you passed any of the flag parameters to do optimizations, then it might make your GZipped archive inconsistent with itself from one compression to the next. It would be inconsistent. And that's not even to say like, oh, we've moved to XZ, BZIP, LZ, LZMA, whatever. It's garbage now. So it's, there's some examples here where you can actually see, you have to do, even for GZIP from the command line, you have to do dash in because in the GZIP header, it adds epoch. So one time to the next, it would be different, but if you do dash in, it doesn't include epoch. So you could have some consistency within itself. Real, real exciting stuff here. Zlib, this is using Ruby, but still Huffman only. You have to add that flag, otherwise it's inconsistent with itself every single time. Golang, it's terrible. Well, even at Golang at some point, like we were like, cool, it's consistent to itself. Well, at some point they made optimizations for like architecture dependent optimizations for go, and it broke all the compression. And so every Docker registry out there that had these one gig images, all of that cache was invalidated. Like you'd go to pull an image and it would fetch the new image, checks on it, and it got a different checks on. So all these registries were immediately having to like rebuild all the images and reflush like, oh my God, that was fantastic. So verifying at rest, regardless of like trying to make it efficient for whatever your back end is, whether you are rsyncing files around, gosh, some folks were using like iSCSI mounted over NBD to try and have like arrangements, but you still have to have this content addressable piece, as well as something like RPMQ capital V. How many folks ever touched that? Dan. It tries to show that what's on disk is different from the RPM that you originally installed, like has somebody tampered with some of the files, and so you can actually get some kind of an assurance model. Obviously, if they're at that level anyways, they could have just modified the RPM database, whatever. But DM Verity ends up mostly being like an Android use case, but there's hopes that it could mount and do these like read only like with absolute certainty that the file system is exactly at the state you expected. There's no corruption. There's no root kit, whatever. There's been some IBM research happening forever in the IMA EVM world where you can have keys loaded into the key, you know, key cuddle of the kernel internal key rings potentially have like namespaces with their own keys, and within that namespace, you can only see the things that you're your unshared space can have access to with the keys that are loaded for it. And even if you escaped and got into another namespace that you couldn't see those files because the kernel wouldn't let you read them because they're not in your key chain. Cool. We're not there yet. It's still happening. So a most passive, most generic approach at some point when I was trying to figure out how could we do this given all the file system approaches, given all the different package format styles was something I remembered from back in the BSD days was mTree and they used it largely just for like the file system layout piece of like them and their source trees and ports. So it's in free BSD, open BSD, stuff like that. There is a mTree port that was done for Linux and it's kind of kept up to the free BSD approach. Neither one of those accounts for extended attributes and some of the other, like some newer checksum, I think they've got up to five, shop off 12th now, but X adders was the biggest thing. And even though free BSDs has since added EXT adders into their file systems, they're not using it heavily so they haven't added support for it in their mTree. Those are some of the things that I wanted to tackle. So at some point I started, I set out and I write a lot in Golang. So I wrote a clone of, you know, a drop-in equivalent in Golang but it added support for a few different pieces like extended attributes. There are things available in the Linux space today. So if you DNF install BSD, BSD tar, you can actually say tar dash format mTree dash CF, you know, like you would make a file from this tree and the output file won't be a tar archive but it will be an mTree looking output. Leonard has CA sync, which has an mTree output. So you can either do an mTree of a directory which is similar to what Go mTree can just do like an mTree output of a directory. Or if you've made an index, like a CA IDX index, you can say give me the mTree of this backup that I did. It's kind of useful. And Umochi that I mentioned a second ago that can like manage container file systems. When you do an Umochi unpack, it actually creates an mTree of the expected output. So I've got like two minutes left. This is the Go mTree looking output. I don't think I included the X-datters in this example but the new mTree output has this notion of sets. So you can say in the following until I unset or until each individual file overrides it, expect these to be the defaults. And so then it will only have that keyword if it's different than the prior. And so then it walks through and it actually steps through directories. So these are children of the bend directory. And it's got an annotation format to, like this is actually angle bracket for the beginning part of test, the command that's square bracket. So it escapes that in its own way. And so you can see here that these files, even though it's on disk, that this is indicative that it has passed through a TAR archive at some point in its life because the nanoseconds have been trimmed off, TAR can't support nanoseconds. But you can get a timestamp of those things. And then the SHA-256 digest or whatever. CACync does more of the old style mTree approach where every line has a fully qualified path rather than stepping down into the children. Some things are not quite as compliant with the old approach. It's not as much an issue anymore. People know how to handle some of these characters. But for the BSD world, they considered use cases where it might pass through a system that can't handle all the character sets for God's knows reasons. Anyhow, but this is, you see this whole approach here. This file system also has passed through TAR archives at some point. Leonard introduced this, and it jammed me up when I first tried it out, but SHA-512 digest was a key word, but doing the SHA-512 trimmed to the 256 length was not a key word. So I added support for that in go mTree. But that's neat enough. This is just an example of doing scopio copy like I talked about in my prior talk about what Aaron Antonio talked about as well. Doing an emoji unpack of that image that it just fetched into a directory called busybox bundle. And then seeing that there is now the digest of that image.mtree is a file. And then you get that same output. So now you have something you can check. You can, even if the user mutated it, they can check that out against it later. I made go mTree be able to reproduce and check against TAR archives, not just at rest file systems. So you could know what you're about to validate before it's like in flight. You might have a workflow where you get an archive, check the signature, lay it on disk, and then have something to check later for an assurance step. So there's several more examples here. You can go through them all up, but libarchive or bsdtar, there's. So you could do that on most Linux systems and it does the old style approach, but it doesn't escape everything. So if you find yourself in any kind of an assurance model where this might be important to you, these are the kind of artifacts that in some of the work that I'm doing, I'm looking at including these so that you could have a sniff check of the contents of an image without having to download it and run an analyzer first. You could actually say like, this is the SHA 512 or 256 or 512 256 of the files that I know are bad or whatever, that you could actually sniff check an image, like do a remote inspect and look for that image or get the file system layout, interpret the file system tree before you ever unpack a TAR archive or whatever it might become one day, like peer to peer. The work that I'm doing is on this repo, obviously there's other things like CACyncMTree and otherwise. I do encourage to stay in a communication loop so that these, if you're either outputting or interpreting those manifests, they are compatible. Like I said, I've added support and I didn't have a picture up there but for extended attributes so that you could have SELinux context or whatever preserved on the files or otherwise. Because obviously if you set a file capability that makes a difference. If you've added Capsus admin or whatever to like user bend time, that's a problem. So that needs to fail a check. Yeah, and so then VBATS talks as these slides are up there as well. You can see those examples and try them out later. Do we have time for talks, any questions? So any questions from the audience? Have you? Yeah, it's on. Yeah, have you ever looked at FSVarity? FSVarity. Yeah, it's like the invert you went on the file level. Really? Yeah, it's pretty cool. It's like a work in progress from what's its name, Ted. Is it Ted doing it? No, I have not. I had only looked at the invariate and ruled out that it's a narrow use case. Basically you write down the content of a file and then you do a Merkle tree hash on it and you add that at the end of the tree and then you call like a file control thing on this thing that seals the file, makes it read only and hides the Merkle tree from the user space. Is it like in like an X-hatter? No, it's in the file. So you write the entire file plus the Merkle tree and then you seal it and then it looks from user space as if the Merkle tree isn't there but it verifies it every time you access the thing. Really? It's pretty cool. Yeah, I'll take a look at that. It's like work in progress. I haven't tried it, but. Sure, it seems even I'd be interested if it could help and do some kind of attestation or if there'd be like a callback cycle there. That's cool. Cool, nah. Yeah, Liz. Does that have any relationship to the contents of the manifest in a OCI image spec? This is completely independent but I very much think that it would be something like an additional manifest or MIME type descriptor that would just be shoved in so like you'd build the image and before you'd push it at a time where you could sign it that you could append some kind of artifact like this in it so that when you go to pull an image later that you would see it in the list of MIME types and you could fetch the first piece like what the Scopio remote inspect does. You just get like the first bit of JSON and then if your tool knows that that MIME type like, oh, I know how to read that that you could then fetch that and get a better idea of the contents of the image and kind of yay or nay yourself on what you do next. That's a hope, active hope. All right, I think we have a break next. So thank you, everybody.


Thus, the Arthur Lewis Community College, through its agricultural program, is contributing to national efforts get towards achieving food security. The College's farm strives to be the model example of advanced agricultural techniques via the use of precision farming. It provides students the opportunity to exercise agricultural practices and is open to fit-form students working on their student-based assessments, SBAs, at a CXC level. Students seeking to improve their knowledge of farming measures are welcome to visit the farm. St. George James is the technical officer at the College's farm. For instance, I know we were the first set of people, I think, that grew with the hydroponic system that we grew our crops in flower pots, in bags, to control the salt bond disease, water bond disease, and to have a better production on farm. The technical officer says the farm contributes significantly to the country's food security and provides agricultural produce to hotels and supermarkets. If I may elaborate more, it's not just the teaching service that we have. We also have services where we help with food security. We have our outlets where we sell what we produce on farm, which is the eggs, the pork, all the crops. So we sell in the supermarkets the hotels and also the public. And we have a thriving market even at the college itself. The introduction of the Agri-Entrepreneurship and Climate Smart Agriculture programs is an example of the College's continuous innovation with a view of improving the student experience. Dr. Keith Nurse is the principal of the Sir Arthur Lewis Community College. For the last academic year, we switched around the agriculture programs, so it's now entitled Agri-Entrepreneurship and Climate Smart Agriculture. And in fact, we have several programs both in relation to teaching and research and also to new crop generation. So for example, with the Canadians, we have something called SAGE, Skills to Access the Green Economy. And that's very much focused on generating some new practices in relation to climate change and climate smart agriculture. The Sir Arthur Lewis Community College Farm is located in Denry and runs several units, including the crops and livestock unit, open field production, wind tunnels, aquaculture and hydroponics.