And maybe this is a surprise. It shouldn't be a surprise anyway. It's too bold of a statement. Okay, let's see. Some comments on the homework coming back. The homework as a group is looking much better than let's say homework one did. I think you're getting an idea of the sorts of things I'm looking for and that's good. Let's see, I'm going to steal your book here real quick. In section nine, problems ten through... Let's see. Where am I here? Let me make sure I'm in the right problem. Now I'm lost. Bear with me here for a minute. There's a totally insightful comment I need to make. I am lost. It's a question about the way they phrase the question. They want you to take a permutation and they want you to write it as a product of disjoint cycles and then figure out the order. Yeah, thank you. Okay, 13D, thank you. In section nine, 13D. I was looking too quickly at the question here. So section nine, problem 13D. The question was not simply find the order of each of the permutations in exercises ten through twelve. The question is find the order of each of the permutations given in those three exercises by looking at its decomposition into a product of disjoint cycles. And what some of you simply did was you took the given permutation and you wrote it as a product of disjoint cycles, then completely forgot about the fact that you wrote it as a product of disjoint cycles and then just started pounding out the order. And the point of that question was to sort of give you the type of computation that we did in class, which was if you write things as products of disjoint cycles, like something like, I don't know, one, two, five, and then three, four, something like that, if you want the order of this thing, if you're going to start raising it to powers like squared, is, well, the point is what? Well, yeah, you could write this thing out in long hand and then just start pounding it out, but the point is because these are disjoint, they commute. So typically this should just be if we're in a general group. So there it is and here I do it again. But the point is because these are disjoint, these commute, so this is one, two, five, one, two, five, three, four, three, four, and what you learned in a previous piece of this exercise is that that's E. So this is just one, two, five, squared. And then continue to go. And what you're being led to is the result in part E, which says that if you have a transposition written as a product of disjoint cycles, then the order of this thing is going to be the least common multiple to length. But if you didn't do a computation like this on part, on question 13E, if you just started pounding out lengths or orders of permutations without doing a computation like this, then you sort of missed the point of that particular problem. So I nicked you a little bit on that. And, ah, yeah, on the extra problem, I saw some less than optimal notation being used. What you have to distinguish between is the apples and the oranges here. The apples are the underlying elements of the set, maybe the numbers one through five. The oranges, the things that you're interested in are the elements of S5, are permutations. So there are functions, those are the things that are of interest. Those are the things that we're composing, those are the elements of the group. And the description of those functions has to do with what they do on the domain in this particular case, one, two, three, four, five. And so, for example, I saw things like in the extra problem.  So I write it in a different color. Something like in part two, take the identity element, so E of three equals three, yeah, it does, and you've justified why that's true. And then what some of you said, NH. And that's, you know, fingernails on a chalkboard. It's apples and oranges. Three is something in the underlying set. It's a number from one to five. The things in H are functions, so this completely makes no sense. If you want to write this, therefore E is in H, not three or E of three is in H, E itself is in H, that's the good notation. So in the other parts, too, the same sort of thing happened. I say sigma circle tau of three equals three, therefore sigma circle tau of three is in H. It's not sigma circle tau of three that's in H. It's the composition of the two functions, sigma circle tau that's in H. So please be careful on that. All right, those were the only two commentable details that came up in the assignment from tonight, so that was good. All right, let's see, as I mentioned in the email that I sent out on Friday, I've put the solutions to this stuff on the web. If you want to download those. And I think we're good to go for Wednesday then. All right, I also will, I have a few extra tonight. If you want another blank copy of the practice exam or if you've lost your copy of the info about the exam or something like that, you can come up and grab some after class, that will be no problem. So, at the end of last Wednesday, we got to this really important punchline. Let me remind you of what it said. So, recap, we're going to start with G, any finite group, finite means it has finitely many elements in it. Oh, here was something that actually came up in a question during office hours today. This word, order, is a somewhat unfortunate one because it's used for two related, but technically distinct things. The order of a group is just the number of elements in G. So, if we talk about the order of a group, it would have been nicer or clearer for students if we'd simply call it the number of elements in the group. But we don't. We call it the order of the group. If we talk about the order of an element, let's call it little g in a group, capital G, then what we're talking about is what? Is the smallest positive integer with the property that blah, blah, blah, blah, blah, smallest? I don't want to write it out because you have the definition of the order of an element. So, technically this word order applies to two different things. Obviously, the two are related if the group happens to be a cyclic group and if you happen to have handed me a generator for that cyclic group, then the order of the element, in other words, the order of the generator is the order of the group that it generates. So, the two words make sense when they do overlap, but we use the two words even in the situation where they don't overlap. Order meaning either for a set, tell me how many elements in it, or order for an element meaning tell me the smallest positive integer for which you get the identity. So, let me say, let G be any finite group, meaning the order of G is finite. But again, I'll try to use the non-order notation here. H any subgroup of G, then here's what Lagrange's theorem said. Lagrange's theorem, at least part two, second part, that's the one we're going to focus on for now, says this, that the index of H in G, and I'll remind you what this notation stands for, the index of H in G, which is by definition the number of distinct, in other words, different left cosets of H in G. Whatever that number is, multiplied by the, well, the order of H, or the number of elements in H, is the number of elements in G. The first part said if you hand me any two left cosets of H that necessarily they have the same number of elements in them, and that number of elements happens to be the number of elements in H. All right, we didn't technically prove all the details of this, but I showed you by means of an example, and by showing that two left cosets are either disjoint or identical, that we get this result in, it is incredibly powerful, this is powerful. And Fraley, the author here, makes a statement which essentially says any time you have a result that allows you to count something, it's going to be important. And this result allows you to count something. It tells you, for instance, well, it tells you how many cosets there are, number of elements in G divided by the number of elements in H. It tells you, for instance, how many elements are in the subgroup, figure out what the index is, or it tells you how many elements in the group, if you know what the number of elements in the subgroup is and you know how many distinct left cosets are. There are many more reasons why this is powerful. There are many really nice, important consequences of this result of this equation. The first one, for example, if H is a subgroup of G, and throughout this discussion today, folks, we're going to always assume that G is a group that has finitely many elements in it. We can talk about cosets for infinite groups, so we'll do that in a little bit, but at least as far as Lagrange's theorem goes, when you're trying to count something, it turns out there's an arithmetic of infinite sets, but we're not going to get through that this semester. That's sort of a first-year graduate course idea. But the punch line is this. If you take a subgroup of a finite group, then the number of elements in the subgroup is a divisor of the number of elements in G. So if you have a subgroup, then the number of elements in it necessarily divides evenly, and the number of elements in the subset phrase is a divisor of however many elements in the group. Refraised, sort of as a contrapositive, if S is a subset of G and the number of elements in the subset is not a divisor, the number of elements in G, then the subset is not a subgroup. For example, let's look at G is D4. G contains no subgroups having, for example, three elements, because three doesn't divide the number of elements in G, which happens to be eight here. G contains no subgroups having five elements, or six elements, or seven elements. Obviously, it has no subgroups containing nine elements because it has no subsets containing nine elements, because the set already has eight elements in it itself, et cetera. This is incredibly powerful. If you're looking for subgroups, don't bother looking at subsets having three elements, or five elements, or six elements, or seven elements, because those numbers don't divide. Now, you've got to be a little bit careful to not conclude too much from this result. If I hand you a subset of this group, and let's say it happens to have four elements in it, then at least that subset is a candidate to be a subgroup. It doesn't automatically make it a subgroup. I can write down four random elements sitting inside D4. At least as far as Lagrange's theorem goes, that set could be a subgroup. But hey, there are other things that might preclude it from being a subgroup. It might not contain the identity element, so don't go too far. One very interesting question that we will take up in about three weeks or so is this. Okay, give me a group, give me a number that could be the number of elements in a subgroup. If you give me D4, then it's got eight elements. If you give me the number four, at least there could be a four-element subgroup, because four divides eight. Is there a four-element subgroup? It turns out the answer is yes, and we've seen one. The group consisting of row zero, row one, row two, and row three is the subgroup. So inside my eight-element group, there is a subgroup of order four. There are many subgroups of order two that we've seen. There's obviously a subgroup of order one. Every group contains the subgroup just consisting of the identity element. So an interesting question, this is sort of how the, I don't know, I guess the way a mathematician would think is you have now this very powerful theorem, is there some sort of converse to it? If you have a subgroup, then the number of elements in the subgroup divides the number of elements in the group. Here's sort of the converse. If you have a group and you have a number that does divide the number of elements in the group, is there a subgroup having that many elements? And in this example, the answer is yes, and in general it turns out the answer is no. You can have a group, for example, there's a group with 60 elements that doesn't have any subgroups having 30 elements. So, you know, as powerful as this result is, it's not the end all be all, it simply gives a lot of nice information. Here's another example. What's the example? Yeah, let the number of elements in G, so I'm gonna give you some indication of how many elements are in the group I'm interested in. I'm gonna call that number N. I'll give it the numbers 8 or 100. It makes no difference to me. Let G be an element of the group. Let, let's call it M, be the order of G. It's the notation for order. I know what order is. It's the smallest positive integer. All right. It's the smallest positive integer with the property that when you take G and you raise it to that power, you get the identity. Here's the punchline. This number is a divisor of M. I'm sorry, of N. Let me rephrase that in longhand. Rephrased IE, the order of G, and this is the notation folks for is a divisor of, means properly divides without remainder, the number of elements in G. I try to avoid this notation because there's too many straight lines and too many squiggles, but that's the way you'd probably see this phrased in the textbook. A straight line means is a divisor of. So, for example, before I go ahead and prove this, for example, if you're sitting back inside this group and someone hands you an element and ask what's its order. In other words, what's the smallest positive integer so that when you raise this thing to the power and you see the identity, folks, the only possible answers are divisors of the number of elements in the group. Our divisors of eight. So, if you try to claim for me that you've written down an element inside D4 that has order six, I don't even have to check your arithmetic. I know that it can't be the case because this says that the order of each element has to divide the number of elements in the group and the proof is easy. Proof? Well, let's see. This is powerful. This first consequence says if you have a subgroup, then the number of elements in the subgroup is always a divisor of the number of elements in the group. But, wait a minute, so is the order of G. The order of G, whatever that number is, is the number of elements in this subgroup. We proved that, I don't know, two weeks ago or so. If you want to know how many elements are in the cyclic subgroup generated by G, it's precisely the number of times you have to take in order for G to get back to the identity. Previous result, result, result. My handwriting is going south here, sorry. Previous result. Oh, now use consequence one. The order, oh, is the order of that subgroup and if you have any subgroup, then the number of elements in the subgroup is the divisor of the number of elements in the group. Alright, questions there, comments? So that's pretty powerful. And the final consequence of Lagrange's term that I want to share with you here is, I mean, is one that to me is truly unbelievable. Look, the definition of a group is simply you have a binary operation that's associative, there's an identity element, and each element has an inverse. There's absolutely nothing in definition of groups that's anything about numerical information. It's also the case, folks, that there are very few cyclic groups. I mean, we know what they look like. It's Z sub n for your favorite n. Z2, Z3, Z4, so those are all the cyclic groups. Those are somehow the easiest groups to understand. Here's the third consequence. Consequence of Lagrange's theorem. See the number of these? Here's the first consequence. Oh, this is the second consequence. Sorry. And here's the third consequence. Consequence three. If p is a prime number, if p is prime and the number of elements in g is p, then g is cyclic. Folks, if I hand you a group of seven elements, it's cyclic. I mean, where does that come from? That's truly unbelievable. If I hand you a group of 11 elements, it's necessarily cyclic. Why? Because the number of elements in the group is prime number. Well, prime number is necessarily bigger than or equal to two by definition. So I've handed you a group with at least two elements in it. And I always know what one of the elements in a group is, the identity. So here's all I want you to do. Grab any element in the group that's not the identity element. There's a lot of them. In fact, all but one of them is. So pick any element, let's call it little g in capital G with g not equal to e. You have plenty of choices. Then here's the subgroup. Look at this subgroup. The subgroup generated by g, the cyclic subgroup generated by g. All right? I'm going to tell you a couple things about it. So the first thing is, it's a subgroup of g. That's no big deal. I haven't used anything about the hypothesis yet. In any group, if you take any element in any group and you look at the cyclic subgroup generated by it, you get a subgroup. Okay, that's pretty good. The first thing is the number of elements in this cyclic subgroup. Well, I've asked you to take not the identity. So when you look at cyclic subgroup generated by it, by definition, what did you do?  So I've already written down two elements in there. So there's at least two things in there. I'll put in parentheses because I've asked you to start with. Not the identity, but let's say, oh, the number of elements in that cyclic subgroup divides the number of elements in the group by Lagrange's theorem. It's a subgroup. If I tell you how many elements are in it, I don't know that number yet, but I represent that by number of elements in g and necessarily that number. That was Lagrange, or if you want consequence one of Lagrange's theorem. Lagrange's theorem, consequence one. So wait a minute. What's the hypothesis? But number of elements in g is prime. That's the hypothesis. So I've now written down a number, that number, whatever it is, that divides the prime number. And I haven't written down the number one. I've written down something else. So what's the conclusion? That this thing is the prime number. I have a divisor of a prime that's not one and the only divisor of a prime is the prime number itself. In other words, it's the number of elements in the group. So here's the conclusion now. I have a subgroup is a subgroup of g having the same number of elements as g. So I have a subset of a finite set and the subset has the same number of elements as the set. So the conclusion is that, in fact the subset is the set. So the conclusion that we're able to draw folks is a numerical one. That the number of elements in the subset is equal to the number of elements in the set. And it's from that piece of information that we can conclude just by set results discrete mass stuff, if you have a subset of a set and the subset and the set have the same number of elements then necessarily the subset has to be the entire set. In other words, g is a generator for g. g generates capital G and we're done. So that's incredibly powerful. So if somebody says I'm thinking of a group of 13 elements and in fact you already know what the group is. It's a cyclic group. And hey, there's only one cyclic group. It's Z13, optisomorphism. Gronch's theorem is incredibly powerful. And again, this is like the third time I mentioned this. And, I don't know, totally surprising. Totally surprising. Just give them the definition of a group. You're impressed hopefully that there is all this numerical data that somehow corresponds to it. All right. Questions or comments? Well, before we move on, I want to spend, I don't know, five to ten minutes talking about, well, an idea that you would expect given what we've been talking about for the last lecture and a half, we've been talking about left cosets of a subgroup inside a group. And the question is what's so special about left cosets? Well, if there's left cosets, there probably should be right cosets and there are. And so let me spend a few minutes talking about right cosets. So, up until now, we have focused, focused on what are called left cosets of a subgroup. A subgroup inside a group. A group, it turns out. Not surprisingly, we can also construct, build what are called the right cosets. H in G. I'll tell you how to do it. Well, let's see. What were the left cosets? The left cosets, just as a reminder. No, I don't want to write it down. Well, yeah, left coset. Oh, well, that's all right. Looks like A H. A H equals all the things that you can write in the form little a times H where H is in the subgroup. Here's what a right coset is. The right coset, coset of H generated by A is simply the set HA. Did I get that backwards? No, I think I'm all right. It's the set of things in the group that you get by putting the element in question, the thing called the little a on the right and multiplying it by all the elements in the subgroup. In effect, everything that we did when we built left cosets can be mimicked for right cosets. There is an equivalence relation on the group. The definition of the equivalence relation is you deem A to be related to B in case AB inverse is in the subgroup rather than deeming A to be related to B by putting A inverse B in the subgroup. You then get these things called right cosets. Any two right cosets are either disjoint or equal. And there's a Lagrange's theorem for right cosets. Lagrange's theorem says the number of right cosets, in other words the right index, times the number of elements in the subgroup is the number of elements in the group. So it turns out there is a lot of similarity between what happens with the left cosets and the right cosets. But the similarity is really only numerical similarity. In general, here's what turns out to be a little bit confusing but true. It turns out that numerically, numerically, left, right cosets share many properties. For example, EG first, the number of elements of elements in any right coset equals the number of elements in any left coset. So somebody sits down and pounds out a right coset. Somebody else sits down and pounds out a left coset. It turns out the number of elements that each person will be looking at is the same. And in fact, both of these numbers simply equal the number of elements in the subgroup. You see, if I write down the subgroup itself, there's no mention of left or right. There simply is. And I'll write it this way. There's sort of a Lagrange's theorem for right cosets. Let's see, what does Lagrange's theorem say? The number of left cosets times the number of elements in the subgroup is the number of elements in the group. Lagrange's theorem phrased in terms of right cosets is the number of right cosets times the number of elements in the subgroup. So folks, the number of left cosets equals the number of right cosets. The number of right cosets of h in G equals the number of left cosets of h in G. So when we talk about this thing that we call the index of a subgroup, technically I define the index to be the number of left cosets of the subgroup in the group. So I probably should have called that the left index or something like that. But the point is, if you want to know how many right cosets there are, it's the same as the number of left cosets. So instead of calling one the right index and the other the left index, we simply use the single word index, the index of the subgroup. But then you're asking, well, okay. So the number of elements in left cosets is the same as the number of elements in the right cosets. And the number of left cosets is, so are they the same? And the answer turns out to be no. But here's the caveat, and we're going to spend at least three chapters talking about this particular observation. In general, the left and cosets of the subgroup might not be the same. I say, wait a minute, they are the same? No, what I've told you folks is that the number of elements in a left coset is the same as the number of elements in a right coset. And the number of left cosets is the same as the number of right cosets. So that's what I mean by numerically, there's a lot of interaction over that. But at the set level, if somebody hands you a left coset and says, is this also a right coset? The answer sometimes is yes, but sometimes is no. The example to look at, example, I'll say, we will see this later. We'll look at this in further detail, detail, much later, but much later, maybe two weeks or so. But I wanted to bring it up at this stage just because one of the homework problems asks you to show that so in certain situations, some situations, we can show that this left coset equals this right coset. Not always, but in some situations and there is one such situation where you ask to show that this equals this in one of the homework problems. I forget which number it was, 28 or 40, I forget. But anyway, it's one where I gave you the hint and the hint was the goal is to show that this left coset equals that right coset and the way to do that is to show that one side is contained in the other. So the point is showing that this left coset equals this right coset can't be done in general because in general, left cosets might not be the same as right cosets. But the punchline is if you have some additional information about the subgroup then you might be able to show that this equals this. So that just gives some sort of context to that particular problem that what you're proving for that particular subgroup sitting inside that particular group holds in that case but definitely does not hold for all possible subgroups of all possible groups. Questions? Okay, so what we're going to do here is another change in topic. What we've done up until now once we got past the general notion of binary operation and we got into the the specific discussion of groups was, alright, we we've had sort of two methods that we've looked at of building groups. One is sort of the from scratch method. Look at this set. Look at this binary operation. Go through all of the computations to convince me that that set together with the binary operation is a group. It convinced me it's a legit binary operation. You know, at least some lip service to making sure it's associative. Convince me that an identity exists. Convince me that for each element an inverse exists, et cetera. Groups from scratch. We did that a lot right at the beginning of our discussion of groups and then we did it again when we built these permutation groups and we built the SN groups, alright. We sort of built them from scratch. The other sort of point of view that we've taken is once you've got something that you've worked hard to show me as a group and look inside those groups to find other groups and presumably those other groups are a little bit easier to verify because to show that something sitting inside a known group is also a group. You just got to show it by the subgroup there. You don't have to worry about existence of this or anything like that. Just show it's close. Show the identities in there. What we're about to do now is play another sort of game and the game, I guess, that are known to be groups and build new groups from them. We've done that in some sense already. Just by you take something that's known to be a group look inside it and see whether or not there are other groups living inside. Here we're going to take things that are known groups and find new groups not by looking inside but somehow piecing them together. In effect, this process is really nothing more than a set process back in the discrete map of course you talked about taking two sets and forming their Cartesian product or their direct product. It's simply the ordered pairs where you take the first coordinates coming from the first set and the second coordinates coming from the second set. It's something you're totally familiar with. When you do R cross R Cartesian product with R you get R2 which is just ordered pairs of real numbers and that's something you're familiar with. We can talk about doing that for all possible sets just ordered pairs and what we're about to see it's pretty easy to see it will be pretty easy to see that at the end if you take two sets that happen to be groups and you simply hammer them together in a Cartesian product then the result is going to give you a group. This is going to be another way of building new groups from known groups and we'll see many more ways in at least the first 10 weeks of this semester. So, new subject this is called direct products of groups and the idea is if we start with two or more groups two or more and we'll see how to do more in a minute groups we can form the direct product of the sets direct product of these things as sets it turns out the resulting set result will be a group direct product so remember what this looks like specifically let's just do it with two of them if I hand you two groups let's call them G1 and G2 and you know what let me be even more specific well I'm going to ask you to start with two groups so one of them I'll call G1 G1 will have its own binary operation well just to distinguish it from the binary operation that might somehow be defined on the second group I'll call it star sub 1 and star sub 2 this might be S5 together with composition this might be Z6 together with addition mod 6 but I don't really care the two operations in the underlying groups that are going on might be completely different of course it might be the same group or in the same operation I haven't precluded that possibility but just start with two groups and here's what you do you form the set G1 cross G2 so what does this consist of it consists of things that look like ordered pairs you can see that little G1 is in capital G1 and little G2 is in capital G2 so that's all we're doing here well it's just some math 215 it's just some basic set theory form the Cartesian product of the two underlying sets now what I have to do is teach you how to make this set into a group with some binary operation it's pretty easy to do now define a binary operation on this set G1 cross G2 it's pretty easy to do let's see so what might it look like take something in G1 cross G2 what does it look like it looks like an ordered pair and folks the things in this set by definition include the parentheses and include the comments just pairs of things where the first thing is from the first set second thing is from the second set now I need to teach you how to combine that with something else in this set well what does something in that set look like it looks like something in the first group but I've already called this thing G1 how about let's call it G1 prime G2 slash or G2 hat or G2 something and I have to teach you how to combine these well there's sort of an obvious way to do it in the first coordinate simply produce G1 star G1 prime it makes sense to take G1 and combine it with G1 prime because both of those things live in this particular set and this operation called star one is a binary operation and then G2 G2 prime in other words I mean the phrase would be just do things coordinate wise then the punchline is then proposition proposition this gives a group structure G1 star G2 with this I'm sorry cross G2 with this binary operation gives a group won't prove it in gory detail but in some sense folks what we've done is we've produced a new group now this isn't a subgroup of a known group so technically to convince you that this is a group have to go through the you know the gory details of have to convince you first it's a binary operation that's a binary operation that's no big deal if you take any two things in this set and the things in this set are inherently ordered pairs here are two things in that set they always get something well defined back in the set yeah because well we're using some properties of the binary operation already we know that if we take two things in the first group and compute their star whatever that is we get something back in the first group and we know that this back in the second group so at least we have a chance of writing down a binary operation that's good is it associative well that's sort of painful but it is what does that mean you got to take three things in the underlying set and convince me that if you combine them in this order and then do that one that you'd get the same thing if you had switched the brackets well look folks in the first case where are you going to get you're going to get G1 prime star G1 double prime that's what we get in the first slot in the second slot yeah but wait a minute each of these two things individual is a group so you can slide them over individually in each coordinate and then things are good third thing we have to show that an identity exists we're back to basics here folks can you identify the element in here that you think might be the identity element just you know take the identity element of the first group and the identity element of the second group put them in the same ordered pair and that should give you the identity element of this new group and it does I mean there's something to show but it's not too hard to do final question is let's see if I hand you an element in here is there something that behaves as it's inverse in other words there's something in here that you can write down so that when you combine the two things in definition of a binary operation that you get the identity sure if I hand you something in here it means I've handed you something in the first group and something in the second group you want the inverse of that thing sure just write down the inverse of that one the inverse of that one it works so this thing g1 g2 inverse turns out to be g1 inverse comma g2 inverse so it turns out turns out that the identity element is that and the inverse so again I think I could spend 15 minutes running through all the gory details but I think our time is better spent just saying yeah exactly where you'd expect to look for the identity element in the direct product and exactly where you expect to look for inverses that's exactly where we should be so let's just do a quick example example here's a group is d4 the second one is z6 and I've just built a group now I haven't carried along the standard notation that we used when we were writing down technically the definition of the product of the two groups the direct product or cartesian product of the two groups but we know what the operation is in d4 it's composition and we know what the operation is in z6 so this is a group I don't know here's an element here's the identity element e is this thing you put the identity of d4 in we call it that you put the identity of z6 in so there's the identity element of the group you just put the identity element of that one notice here folks it makes no sense to talk about switching these things around for example the pair 0 comma row 0 is a complete non-issue makes no sense here because it's always the case that the thing you write down the first coordinate has to be in d4 and the second thing has to be z6 let's do another example maybe something like if I give you a row 1 comma 4 and I ask you for the inverse of that well the inverse of an element in the product is you simply take the inverse of each one individually for inverse and of course you've got to interpret this in the context of the group that it lives in turns out the inverse of row 1 is row 3 because row 1 circle row 3 is the identity the quote unquote inverse of 4 in here it's the thing that you have to add to 4 to get 0 which is 2 because 4 plus 2 is 0 so there's the inverse of that thing let's do one more quick computation if I ask you to compute row 1 comma 3 we are with I don't know mu1 comma 5 let's see what we get well the definition folks of combining two things is you get row 1 mu1 comma 3 plus 5 is 8 but we're doing arithmetic mod 6 so we get 2 and row 1 mu1 turns out to be what so we have the table out say it again d1 delta 1 okay thank you delta 1 so working in these things doing computations in these direct product groups is actually pretty easy now the definition I gave you was the definition that you use if you're only asked to take two groups and form their product there's absolutely nothing special about just taking two groups we can do the same thing the same product process process with more than two groups that's no big deal two groups I won't write down all the details but it's the same idea if somebody hands you seven groups it makes sense to form their Cartesian product g1 cross g2 cross g7 that's a complete non-issue of sets but then it turns out that that has a group structure you just look at the philosophy is you just do everything coordinate-wise and things work out just fine okay questions come in so far okay so here's what we're going to focus on let's see if that's all I need to say about products in general the the philosophy is this process of taking the direct product of two or more groups to produce new groups is somehow viewed as a straightforward sort of building block process that allows you to take things that you already know about and somehow extend them to other things like we knew about the group D4 before tonight we knew about the group Z6 before tonight but until tonight we didn't have information about this new sort of group this D4 cross group even though we know each of the pieces individually and the question will be alright here's this new group can you say something about the new group in terms of what you might already know about each of the pieces that make it up so the goal is goal say something about the properties of properties of G1 cross G2 and I'll do the more general situation where you're taking more than two groups and forming their direct product maybe up through G sub t in terms of or as related to the properties of each of the groups that make it up of individual individual groups G1 G2 up through Gt individually let me give you an example for example what's the order of this group how many elements in it that turns out to be easy because it has nothing to do with group theory it's simply a fact about sets and you form the Cartesian product the number of elements in the Cartesian product is simply the product of you multiply the number of elements in each of the unknowing sets so for example the number of elements in that group D4 cross Z6 is the number of elements in D4 is 8 and the number of elements in Z6 is 6 so 6 times 8 is 48 I've built a group with 48 elements in it example first in the direct product you just multiply these numbers together G1 times G2 and the times here is as whole numbers times Gt so there's an example I can say something about the number of elements in this group by saying something about the number or the property of each of the individual groups that make it up I can tell you how many elements there are so for example the number of elements in this group that we looked at briefly D4 cross Z6 is the number of elements in D4 times the number of elements in Z6 which is 8 times 6 which is 48 so there's sort of a brief glimpse as to the sort of flavor of questions we can ask here's another one that's more interesting suppose I hand you two groups and each of them is properties how we study, how about a billion if I hand you two groups or three groups or some number of groups and each one individually is a billion is the product still a billion that's a fairly interesting question turns out the answer to that one is yes if I hand you a bunch of groups and they're each cyclic is it the case that the direct product is cyclic turns out to be true sometimes but not always and we'll focus for the last 15 minutes tonight on that question but there's other questions we can ask you know if I hand you some non-Abelian groups and I form the direct product is the corresponding group or the subsequent group is still non-Abelian so example two if each G1 G2 through G sub T is a billion then it turns out then so is the direct product G1 cross G2 G sub T that works out nice it's pretty easy to show just because when you do the binary operation in the product it means that you're simply combining each corresponding term with the next one so you have all these products here but if each one of the individual groups is a billion it means you can switch this product and you switch this product and switch this product in the end you simply switch the whole thing so that's no big deal but it turns out this turns out to be the interesting question question but it turns out in general only sometimes is it the case that if G1 and G2 are cyclic cross G2 is also cyclic every cyclic group is a billion yet you prove that for quiz two so if I hand you two cyclic groups and I've certainly handed you two Abelian groups that's no big deal and let's see this property two says because each of these is Abelian then at least this thing is Abelian but the question is whether or not it's cyclic and the answer is sometimes yes and sometimes no let's go ahead and look at two particular examples and then we'll try to make some general conjectures based on the two examples as to when it's the case that if you start with two or more cyclic groups and you form their direct product the result is again cyclic so example let's look at this direct product of and again I'm only taking two groups here just because the idea is only a half hour old and I want to show you a lot of small examples before we look at bigger issues so here's Z2 cross Z3 so what are the elements look like well let's list them out Z2 only has two elements Z3 only has three elements so the product has only six elements so you know this is small enough that we can actually list out things explicitly so one of them looks like zero zero and then what have a zero one and zero two and one zero and one one and one two there they are there's the six elements I'll list them out in some sort of systematic order doesn't matter what system you use what I did of course was I listed all the elements and I listed the first element in Z2 and paired it with each of the elements in Z3 and then heck if you wanted to have listed the elements in Z3 first it doesn't matter so there they are now look at the following look look if I take this particular element and I look at the subgroup that it generates so folks all this stuff is the same it's just the group that we're considering now happens to be that one element that we happen to start with is that let's see what we get well we get the identity element because we always throw the identity element in for free and there is the identity element there's E why because it's paired the two identity elements of the two underlying groups and then you put the element in okay now let's see what's one one I guess we'll use star notation here one one what are you supposed to do you're supposed to take the thing in the first coordinate and combine them of course the operation in the first coordinate is addition mod 2 and then what you're supposed to do is take the two things in the second coordinate and combine them of course the operation in the second coordinate is mod 3 arithmetic so what do we get well here we get 1 plus 1 in the first coordinate which in Z2 is 0 because we're in Z2 1 plus 1 in Z3 is 2 so that's what we've just gotten so what we've just shown is that if we take this thing and we combine it with itself we get that game now let's do it three times one one one one one one in other words do the binary operation on this element with itself three times well we know how to compute these sorts of things because we've got some practice with it just you know don't reinvent the wheel there's one one star one one and I've already computed that from what we just did right now I know how to do this that's then zero plus one in the first coordinate and two plus one in the second coordinate and what does the result of that computation give in the context of Z2 cross Z3 let's see the first coordinate is one and the second coordinate is zero exactly right because the computation in the second coordinate is happening inside Z3 did we get the identity yet nope keep going let's do it four times you know one one well let's use that notation that's one one star one one star one one star one one and heck I know how to do that we'll do it by taking one one three times that's what we already got and doing it one more time and we get what we got one plus one in the first coordinate and we get zero plus one in the second coordinate one plus one in the first coordinate is zero okay so we still haven't seen the identity element yet how about let's see one one is zero one star one one what's this going to give oh let's see it's zero plus one one plus one and so we get one comma two still haven't seen the identity element yet hmm I know the answer to this one already because I remember Lagrange is there the order of any element in any group is a divisor of the number of elements in the group the number of elements in this group is six so the order of this element has to be divisor of six well the order isn't two because I didn't get the identity when I did the operation with itself twice and the order is not three so I didn't get the identity element so in fact at this stage I could have run immediately to the order is six but let's just go ahead and verify that our arithmetic is on target one one which is one plus one inside z two two plus one inside z three which is zero comma zero which is the identity element so that checks out that's nice so the order of that particular element is six or rephrased if I list out all the things that appeared here let's go ahead and do that I got zero two I got one zero I got zero one and I got one two which is all of the group z two cross z three the whole thing so there is at least one element inside this group with the property that when you look at it and all of its quote unquote powers you actually get the whole group back so the group is cyclic so z two cross z three is cyclic proof to show that something is cyclic is all you have to do is somehow come up with what generates it and I've done that now it turns out there is one other element that there's one other element that is also a generator of this group but at least for the purposes of what we're trying to get across here that's either here or there there is at least one and therefore it works on the other hand example here's the group g is z two cross z two it's easier to write out what the four elements of this group look like zero zero zero one one zero and one one that's what they look like a set that's no big deal and what I'm about to convince you hopefully is that this group turns out even though just like the example we did previously is the direct product of two cyclic groups that one turned out to be cyclic this one will turn out to be not cyclic show something's not cyclic just take everything in the group look at the subgroup that they generate and convince me that you never get the entire group that's pretty easy to do look if I look at the subgroup generated by folks this is true in any group the subgroup generated by the identity element is always just the identity element just keep beating on it the subgroup generated by one zero I mean these will be pretty easy to see is well zeros in there are always by default the elements in there by definition now if I combine this thing with itself one zero plus one zero you get two comma zero that's happening inside z two and so that's it you get back to zero zero this has ordered two similarly zero one you get just these two things zero zero zero one just do the computation why because if you do this with itself you get zero two which is zero zero and then finally if you take one one you get zero zero and you get itself now the difference here and I think this is intuitively what makes it clearest in this situation if I take one comma one and I combine it with itself I get two comma two which in this particular group is zero comma zero on the other hand when I took what looks to be the same element over here and I combined it with itself I didn't get zero zero because somehow it sort of skewed off a little bit it's not just excuse me it's not just two comma two it's two comma three so it sort of miss and then alright so you keep going and then oh you keep going to the point where yeah now things have worked out so that you get a zero here but by getting a zero here you didn't get a zero here so you sort of had to keep going so that when you finally saw zeros in both slots it took you six wax to get there where it's here in order to get zero in both slots it didn't take you four wax you wound up there after two steps so not cyclic not cyclic well but it is a billion so that's no big deal this turns out to be an abelian group it's got four elements it's got the property that each element at least the element that's not the identity you take each element that's not the identity and you combine it with itself you get the identity and we've seen a group like that what do we call it V this is the group V you take four elements abelian but if you take any of the non-identity elements and you combine it with itself you get back to the identity that's precisely what we call V it had a different form as well we also realized it as the collection of four matrices each two by two with plus or minus one in the main diagonals so this group now is sort of arising a little bit more naturally so Z2 cross Z2 is isomorphic to V so just as we've realized in a relatively concrete way as the direct product or the Cartesian product of the group Z2 with itself so let me go ahead and give you a homework assignment it won't be due for another couple weeks but it's sort of the right rhythm to give you an assignment on Monday and let you start on it if you choose what we'll do after the exam next Monday is we'll continue looking at this question of when when you have a a direct product of cyclic groups when is the resulting direct product also cyclic and can we say something about the structure of these things so let's see let me make sure I'm not doing the wrong thing yeah here is home and this is due not until October 10th because the assignment that I gave you last Monday isn't due until October 3rd because of the exam in between this is in section 13 problems 1 through 16 28 to 32 and 47 to 51 the ones I'm going to have you turn in are 6 8 29 47 problem if this is Greek letter phi from G to G prime and this is a word that we didn't use tonight but we'll use next Monday after the exam homomorphism show and here's a notation that we haven't used yet but we'll use next Monday KER phi is the subgroup of G so that's a question that we have indeed asked before and then I'll say and I'll repeat these with the appropriate let me just do these on number 8 what I want you to do add the following instruction what property of the group G would ensure that phi is a homomorphism so that's an added piece on number 8 and on number 29 I want you to change the instructions slightly 29 is phrased as is it or is it not a homomorphism it is so I want you to prove that G is a homomorphism and again we slightly touched on some of the ideas


Hi, I'm Amanda McDonald and I'm the coordinator of the Advanced Research Skills series here at Newman Library and I'm here today with one of the students who completed the series previously so I'm so excited for us to hear what she has to say about it. Could you tell us your name and your major and when you took the series? Sure, so my name is Michelle Cornalty, I'm a junior pursuing a sociology major and I completed the program in spring of 2018. Awesome, so now that you've completed the program do you have like any reflections on it maybe thinking about what was really helpful or something that maybe influenced your future work? Yes, so this program was actually very helpful to how I got started in research. I was relatively new research of last semester and so this program was really beneficial in getting those first steps. I didn't, haven't seen the abstract before, I hadn't done a poster presentation and so when one of the workshops had covered the essential components of an abstract and that when I was also simultaneously looking to submit a paper as abstract for a conference, they gave the program and the workshop itself gave me information as well as tools to not only get started on abstract but finalize and submit it to the conference. Awesome, that's really exciting to hear. So did you end up presenting that research, did you get accepted? Yes, actually that was my first time submitting the abstract and it was also my first acceptance of an abstract and now through that acceptance I was able to present that abstract at a conference in Virginia. Excellent, I'm so excited and happy to hear that. Since then have you continued any kind of work related to undergraduate research? Yes, and this was just like a small moment in the undergraduate career of research that I've had. I've not only been pushing forward to submit more abstracts and more papers and more poster presentations, I've also been involved in the office undergrad research. I've, as a student ambassador, I've been helping other students get involved in their own research journey, guiding them with resources and opportunities around campus and so this program not only allowed me to become more aware of research opportunities but now I'm able, now in this position I'm able to disseminate that information to other students. Awesome, well it has been so great to talk with you today and I hope that your story encourages other students to kind of see the value in advanced research skills and hopefully we'll see more students go through the program and continue to go forth in their journey of undergraduate research.


Hello and welcome to today's episode of the International Daily Roundup by People's Dispatched where we bring you some of the top stories from around the world. Let's take a look at today's headlines. Israeli forces and settlers attack villages around Nablus. U.S. police officer convicted for murder of Dante Wright. Colombia sees 169% increase in force displacements. An Egyptian activist Sana Saif released from prison. In our first story, over 120 Palestinians were injured by Israeli forces during protests in the occupied West Bank on December 23. Thousands of Israeli settlers arrived near the village of Burk, located northwest of Nablus on Thursday. They then marched towards the now closed Humesh settlement. The illegal outpost was evacuated by the Israeli government in 2005 because it was set up without permission. Despite this, settlers are operating a religious school or Yeshiva at the site serving as a de facto outpost. Ahead of the settler march, Israeli forces had blocked the main road between Jenin and Nablus. Palestinians were barred from using the road and the entrances to Burk were blocked with mounds of dirt. Residents of the village had already issued calls for protest before the march. Israeli forces proceeded to attack people using tear gas canisters and rubber coated metal bullets. According to the Red Crescent, 42 people including a journalist were injured with the bullets. Another 83 people suffocated due to tear gas inhalation. Meanwhile, Israeli settlers attacked several Palestinian homes and vehicles in the area. Thursday's violence was the latest in a series of escalating attacks against Palestinians around Nablus. These grew after a settler died after being shot near the illegal Humesh outpost last week. A Palestinian official told Middle East Eye that around 25 Palestinian houses were attacked between December 17th and 18th. Over 70 people were injured in the villages of Burk, Beitah and Beit Dijan. Attacks were also reported in the Karyat village by settlers from the illegal Ash Qadesh settlement. Next we go to the US where Minneapolis police officer Kim Potter has been convicted for the killing of Daunte Wright. 20-year-old Wright was fatally shot in his car in Brooklyn Center on April 11th. Police claimed that they had pulled him over due to an alleged traffic violation. They also claimed that Wright had tried to evade arrest when they found out that he had an outstanding warrant. Potter proceeded to shoot Wright leading his car to crash. She later claimed that she had mistaken her gun for a taser. Potter resigned from the police force on April 13th. She was found guilty of first and second degree manslaughter on December 23rd. She will be sentenced on February 18th. Prosecutors argued that even if Potter had intended on using a taser that in itself was inappropriate. Activists had also argued that police used Wright's supposed traffic violation as a pretextual stop often used to target black people. Daunte Wright's murder was followed by days of protests under increasingly militarized conditions in Minneapolis. Widespread use of flashbang grenades, tear gas and rubber bullets was documented. Wright was killed in the same city where 46-year-old George Floyd was murdered by police in 2020. This case sparked a mass uprising against racism and police brutality across the US and in different parts of the world. Next we go to Columbia which recorded a 169 increase in force displacements in 2021. Between January and November 2021, nearly 83,000 people were forcibly displaced from their homes and territories. These findings are part of a report by the Consultancy for Human Rights and Displacement or CODES. The organization recorded a total of 167 displacement events in the first 11 months of this year. This is an increase of over 65% as compared to 2020. The report also noted the disproportionate impact of displacement on marginalized groups. Over 37,000 Afro-descended and nearly 19,000 Indigenous peoples were forced from their homes. 7 out of 10 displaced persons belong to these groups. The departments of Nariño, Antioquia, Chocco and Cauca in the Pacific and Northwest regions of Columbia were the most affected. 2021 marked the highest number of victims of displacement since the 2016 Peace Accords. These incidents are being driven by a rise in violence by paramilitary and illegally armed groups, illicit cocoa production, drug trafficking and illegal mining. Armed groups have specifically targeted land and environmental defenders, union leaders and rights activists. According to Institute of Development and Peace Studies, 166 such individuals have been murdered in 2021 so far. Over 1,200 have been killed since the Peace Accords. The Institute has also recorded the deaths of over 320 people in 91 massacres across Columbia this year. And for our final story, Egyptian rights activist Sana Saif has been released from prison after 18 months. 28-year-old was abducted outside the prosecutor general's office in Cairo in June 2020. She was trying to file a complaint against an attack against her and her family outside the Torah prison the previous day. The family had been visiting the site daily to demand that they be allowed to meet Saif's brother and prominent activist Ala Abdel Fattah. However, they were soon attacked by an armed group of plainclothes women. She was abducted the next day and held under pretrial detention in Kanathir prison. She was previously detained in 2014 for participating in supposedly unlawful protests and in 2016 on charges of insulting the judiciary. Saif was sentenced to 18 months in jail in March 2021 on charges of spreading false news related to the COVID-19 pandemic. She was also charged with allegations of using a Facebook account to terrorize people. Saif was finally released from prison on Thursday. However, this was just days after her brother Ala Abdel Fattah was sentenced to five years in prison for allegations of spreading false news. Saif and her family have been repeatedly persecuted by the Egyptian government after emerging as prominent activists following the 2011 revolution. And that's all for today's episode. For more such stories, visit our website at www.peoplesdispatch.org and follow us on Facebook, Twitter and Instagram. Thank you for watching.


Is UX design oversaturated in 2023? This is a really good question that I've just been asked in a live stream and I thought I'd just explain my answer a little bit more. So it's not as easy to get a job in UI UX design now as it was before like kind of when the pandemic hit because a lot of tech companies were hiring then and obviously UX has boomed since then. If you go on Google Trends and type in UX design you'll see that in the past five years it's probably like three times well popular now that it was before. But before you kind of put off from the idea it was still competitive before and hopefully I'll give you some tips now on how you can stand out and get a job because it's not like there are no jobs I've just done a search on LinkedIn and there's over 10,000 going and it's just that there's more competition for the jobs but that's okay I've hired UI UX designers before and I teach online a UI UX course so I know what basically you need to do to get that job. So let's think about how you can stand out first of all. The thing I've seen is a lot of people okay it's more it's more popular now than it's ever been before but there's a lot of low quality designers and your job is essentially to stand out above the ground and also I've noticed a lot of people who come into UI UX design are actually looking for a shortcut and then the portfolios aren't that good when I'm hired a junior designer I get a lot of low quality so here's some tips on how you can stand out so when you apply for a job the most important thing there are two things that you need so the first thing is you need a relevant qualification that is to essentially get you in the door and to get an interview that's the first thing and there are three things you can do so like me you could do a university degree which takes you know at least four years and you probably need some experience before then and that's going to cost a hundred grand at least then you could do an online bootcamp they cost about ten grand I don't know what the quantity is like but I know that people get jobs or have been getting jobs from them although it's not guaranteed and the other one is you could do an online course like course careers which is one I teach which is less than five hundred dollars although it's looked at equivalent as a bootcamp but the goal of my course and what I teach everyone is that once you have that qualification I guess the certificate that gets you in the door and then it's your portfolio which is actually more important to hiring managers like me when they're looking for a job and what hiring managers are looking for in a portfolio is it's made up of case studies so you can actually get a free portfolio at Behance and you can have your own website but what I'm looking for is case studies and they're essentially kind of like stories of projects that you've worked on and if you're hiring a UX designer you're basically looking for as many UX tasks in those case studies as possible and that's basically including research like personas, empathy maps you want to do some surveys, some questionnaires you want to do some sketches, wireframes, high fidelity prototype you don't want to test it with your friends and family you want to make improvements based upon that testing and then essentially you want to do some handover documents to developers that is what you want in case study so if you actually type my name in Anthony Conboy, Behance have a look at my latest project which is a case study that I build on my course and you'll see that's an example of what a best-in-class case study looks like I'll actually leave, I'll link it in the description so you can have a look and that is what you want to build and you want three of them and the reason I say it's not that important that it's oversaturated is that you're actually going to do more work than everyone else this is the most important job to get on the ladder which is the junior role, it's the most competitive and after that you can then work your way up the ladder


The registered pharmacist compound that speedy, refreshing headache. Waked for his money. Love, Uncle Pete, I've never seen it. You did it, I saw you. All right. His apartment is 6C. The elevator is over there. Thank you. He might have been thinking of how the misery of a headache may be found in the company of a stomach upset and a case of jangled nerves. Lodge is bet the person is the least. Gee, he must have known about bromo-selta being the answer to the triple trouble of a headache. I think so too, Ellen. Your friend, the refreshing glass of speedy bromo-selta, helps relieve not only your headache itself, but the sick stomach and jittery nerves that may accompany an ordinary headache. That's the triple trouble bromo-selta is so good for. Isn't this how the little rhyme about it goes, Mr. West? Fight headache grief with three-way relief. We'll shortly be moving into a relevant requirement.


So hello, I'm Jose and I'm gonna talk today here about Something we have been working on in Oracle in the toolchain team like for the last good five six months Which is to support the kernel the internal, you know virtual machine Whatever you describe it, right? Bbpf, you know in the new toolchain by the new toolchain Well, I mean, you know like this collection of development tools like the ccb new deals Assembler disassembler and so on So this is what we will go through today very fast because we only have 35 minutes to cover everything so Let's start. What is this about the project that we have started in Oracle and we are working on well Basically, we have three different phases here The goal is to add support for ebpf to the toolchain which basically means to introduce a new target in the same way that you know I don't know x86 on Linux is a target. Well, in this case, it will be ebpf to the new toolchain We will see that we the support that we specifically added to each of the components But then of course and that is what makes you know this target interesting One thing is to be able to generate the bpf programs from, you know from your compiler And then something completely different is to generate programs that can actually be run in the kernel Why because the kernel it has a kernel verifier, right that can reject your program actually quite easily So that is the face to and that is the face that where we are right now Because we have the target on board on the toolchain But now we are fine-tuning it so the generated programs can actually be run on the kernel context And then there is the third phase which is in parallel with the second one basically, which is an ongoing activity Which is to expand the support for this specific target So basically the general idea is that the bpf developers Compiled the bpf developers. They should have you know, you know a Complete and useful toolchain right toolset like the developers for any other platform basically even though bpf is very peculiar Okay, I think that I don't need to introduce bpf here, right? But just in case because especially the naming part, you know, I mean it can be a bit confusing Well, bpf is the Berkeley packet filter Originally it was intended to be used to filter packets basically to describe the characteristic of a network packet to discriminate it Well, especially in the recent years it's been evolving into something else which is a much more generic sort of Virtual machine that runs in kernel if you ask the bpf hackers kernel hackers They will tell you that ebpf is not a general purpose virtual machine But everything else indicates that it's becoming one, right? So This ebpf ebpf bpf think is that originally what was the original restricted bpf for field for packet filtering Now it's called cbpf or classic bpf The new more general bpf is now called ebpf or extended bpf But I was told a few weeks ago like two or three weeks ago that now Basically, we are going to call or they are calling ebpf. Just just bpf Which is I think it's good So what is ebpf? From a programmer perspective Especially from a tool chain person like me perspective right compiler person like me Well, basically ebpf is an instruction set architecture Which if you look at it is pretty straightforward, right? Most instructions are 64 bit long. It's very uniform. There is one instruction which is 128 bits that yes It's used to load 64 bit constant into the registers But then it has some peculiarities like for example, it doesn't give you a stack pointer Which is quite weird when it comes to instruction sets and you know, one human machines and It has no floating point support which makes full sense because those programs are to be executed in the kernel and in kernel floating point You know, it doesn't make that much sense The instruction set is supposed to be orthogonal to ndns It is not which is a bit unfortunate, but okay and The instruction set is in purpose by design limited Right. It's not like a general architecture like a spark or meeps or exit the six that it's designed, you know To write very general purpose languages ebpf is not It has registers which are 64 bits Why they are all general purpose registers, but one which is a frame pointer, which is read-only And this is the instruction set. This is how it looks like Right. I mean the same the first row is, you know, it's divided by the different classes, right of instructions It's pretty straightforward like that. It is a small and simple Then like in every Architecture, okay, you have an instruction set, but then what about the API? Well In the case of compiled ebpf Well, what do we do with the compiled ebpf? We put it in L files in object files Now, what is a valid Elf program containing a BPF program? Elf file contains a BPF program. What makes it valid or not? That is what typically in more Normal architectures that is typically what the ABI will tell you the PSABI for example in the case of a Unix system Well in the case of ebpf Currently in practice What constitutes a valid BPF program in an elf is determined But what the existing lbm backend produces and what the different kernel loaders Basically accept, right? There is a BPF load.c in the kernel which is seen in some samples directory But the main consumer of elf files with BPF is BPFleaf, which is also part of the kernel so It is not really documented this ABI Why because up to now there were only one compiler producing compiled BPF code and from C and Only one consumer which is the Linux kernel now We can expect that there is only to be continue being only one consumer Which is the Linux kernel, but now we have another compiler Generated BPF code and then at this point. I think that it will be good if we start thinking about documenting You know the ABI of What constitutes a valid BPF program like what relocations are used for what purpose the section names You know things like that So we have started the port so the first the first thing you have to do when you add a new port To the Knutulchen is to decide the triplet the triplet basically is you know three parts is a name Like for example x86 linux new for example, right? The first part is the CPU then you have a vendor part and an operating system part In this in the case of BPF which is sort of a bare metal architecture, right? If we imagine the kernel as being like the hardware which is actually executing BPF BPF doesn't run in any kind of operating system Also, you know where case the vendor doesn't make much sense. So at the end the triplet became BPF unknown none And of course you can use you know, which is a good thing You can use shorter names like BPF none or just BPF to refer to it Once we defined a new triplet Then we had to add the help support so the help support. We already had defined an I'll identify the identification number for BPF which is 247 for LVM and then we added a new list of relocations of Which of those relocations three of them which are the only ones which Surviving the object file after linking It we did that carefully so they use the same relocation numbers than LLVM So we are stay binary compatible with with programs generated by LLVM. We don't want to break compatibility With what LLVM produces obviously that we very see that will be totally silly So once we had elf support then we had to To create a BFT port BFT is a library in the new toolchain that basically gives you support for object files and we added the support for elf 64 bit L files, you know for BPF in both big Indian and little Indian Then the next part was to define the op codes, okay? I come from the Noodle's cultural meeting and I am reusing some stuff here. So this is maybe too detailed, but well It's nice anyway Some of the new ports are using a software called season Where basically you define the characteristics of the hardware you want to target in RTL So in a language which is very similar to what GCC uses internally You know as intermediate representation of the programs, right? So well, we define the architecture, you know hardware elements like registers fields of instructions operands You know instructions including semantic of instructions because that is how we generated the simulator for example See Jen is very nice anyway, so from the CGN description we generated BPF assembler at this assembler So we have the BPF as which is the gas the Gnu assembler port for BPF and also well using object dump You can disassembly BPF code in exactly the same way that you will do with any other architecture and Well, that is how it looks like Very straightforward We also made a port of the linker Now this is a bit Not that straightforward why because BPF is peculiar and the way that Leap BPF and the kernel is using elf You know to load BPF programs It doesn't match that well to the elf model, right in elf We have object files Which are relocatable and then we have executables, right now when you compile an elf executable An elf executable has a single entry point Which is I think minus a start and the score a start whatever, right? BPF today it doesn't quite follow that model because when you load BPF object in the kernel an elf object in the kernel containing BPF programs basically the leap BPF in the kernel expects the elf file to contain a set of Sections and the names of the sections specify where those BPF programs and how those BPF programs are installed in the kernel, right? So an object file containing BPF programs It has multiple entry points and when you try to reconcile that right with the elf world It doesn't work that well We are going to explode you know to explore you know in the future in Oracle how to maybe You know look for some alternative models, but We got the linker working and at least it allows you you know to Compile a set of functions in an object file Another set of functions in another and then generate a third linked object You know containing the combination of everything How useful is this at the moment at this point? I'm not that sure of that but you know in real BPF development, but we are going to continue exploring that that line and Then of course well the rest of the plethora of the binary utilities, right? You have you can make archives you can get symbols from the objects You can copy the objects adding new sections, you know the typical like in any other port Then finally, and this is where we are working right now Also, we have a gdb port and We have a simulator We have not pushed this stuff upstream yet because it all it still requires work and Due to BPF been peculiar a specific especially you know the execution model of BPF There are some problems that we are still working on For example, because the idea of course is that if you are a BPF developer The idea is that you should be able to do the same that if you are writing software for any other architecture Let's say embedded architecture, right? I mean like for example to be able to inspect your program with GDP Now we will see that BPF is problematic in that sense because the instruction set is so restricted and the verifier is so strict That for example, there is no way to get backtraces in a BPF program So how useful will at the bugger like GDP without the ability of doing backtraces? We shall see anyway, we have a simulator it works, but it doesn't work very well So we are working on it as soon as we have the simulator working properly We will port it we will push it to GDP upstream. So it will be released with the next version of GDP of GDP And then finally well the compiler we made a GCC backend And then those are the architecture specific options that this port supports I was in the Linux Plumbers conference two weeks ago and I got a lot of feedback from the kernel hackers for which I am very grateful actually and It's this is funny because I mean I am a compiler guy. So I look at the BPF Problem and world, you know from that perspective, right? I mean you give me see I give you BPF, right? But when it comes to use the BPF and you know an applicant usage of it I really appreciate, you know any feedback that they can get for me that is Super precious, right? So for example something that for me made full sense What they was writing the back end which is for example, just to have a minus M kernel option Which will be the key valent of minus CPU option in other architectures, right? Well apparently it's not that useful Why because of the back ports, you know that the care that the kernel the production kernels have, you know Like in distributions and and so on. So, okay, the option is still there is the false to latest But probably will remove it at some point Then you can specify if you want to generate big indian program BPF programs or little indian BPF programs And also I added an option there which is Well, you know that the size of the stack of a BPF program is limited Currently to 512 bytes, which is not a lot. So I added an option So the compiler will will basically give you an error by default, you know, if you Overpassed that limitation. So, you know at compile time rather than at runtime, you know that your program will be not will not run on the kernel Then well, I also added some compiler buildings in this case for generating non-generic load instructions in BPF LLVM has similar things and Well, initially, you know the function helpers of BPF in the kernel Basically, the BPF programs are so limited that in order to do certain things basically you escape to the kernel is sort of a sort of a Seudo system call that a BPF program can do so the BPF program runs in the kernel But then it can call to one of a limited set of kernel functions, right To do complicated the stuff or stuff that requires, you know, like writing memory reading memory, you know, which could be potentially dangerous, so At the beginning I used the kernel built-ins Compiler built-ins for them. Then I realized it was a bad idea at the Plumbers to using the feedback from the kernel hackers So now I have a patch I have not pushed it to GCC yet Substituting, you know, the built-ins by this attribute That you can apply to to function declarators and then well When you write a BPF program in C using the LLVM Then you always want to include a header file, which is called BPF and the score helpers dot H Which is part of the kernel of the Linux kernel that the header file defines helpers and they find some data types and goodies which are generally useful for you At the moment GCC is not able to use the kernel header because the kernel header has some stuff Which is you know, LLVM a specific we are working right now. I'm working now with the kernel hackers on this But for the moment, I am shipping a file, which is BPF dash helpers dot H along with GCC That should give you the same interface that BPF underscore helpers dot H gives you But please note before you jump to my neck that This file is to be obsolete. All right. I want to remove it. I hate this file, but At least for now temporarily We actually need it Does it work? Well The number that you can do see there, maybe they are not that impressive to you But I can tell you for a new GCC port. This is not bad at all. All right. I mean this is Well, there is the result of running two big test suites, which are part of GCC Of course, those are compilation only tests because until I get my simulator up up running I cannot run the GCC backend GCC test suite that requires running the programs But they will so this was the part where I show you what we have done now, um, I Don't know if we have time how much time we have left like Nine minutes. Oh, we're plenty of time. Yeah, sure. So BPF is peculiar, right? It's and that it makes it that makes it, you know, like very especially interesting and fun to compare to so then Examples for example, and the anise In theory BPF was designed in a way that it is orthogonal to and the anise Which makes full sense for something like BPF. Why because the Linux kernel can work in both big Indian machines and little Indian machines Right now the idea the initial idea is like. Well, let's make our instruction set Agnostic to and the anise right so the fields are the same everything is the same But of course the values encoded in the different fields in distractions Well, it follows one and the anise or the other depending on their architecture where the linux kernel is running It makes full sense, right? That made me very happy. However, the way a BPF instruction is defined in the kernel somehow Basically makes this basically not possible why because it uses bit fields which are smaller than one byte and In the C specification basically tells you that the compiler is free to reorder those fields freely And it happens that GCC and also LLVM When they see something like this the destination register field and the source register field is swapped Depending if you build in a little Indian machine or in a big Indian machine so despite the good initial intentions basically in practice There is no one BPF instruction set There are two one for little Indian and one for big Indian the difference between those Instruction sets is that in one the destination register field comes first and then in the other it comes after their source register field Okay, this if you work in the kernel using this definition It's not that painful because it's transparent to you But trust me if you want to if you if you make a toolchain to generate the stuff for this architecture It's extremely painful because you have to you know, you have to swap those fields all the time So for to naturally see Jen this program I mentioned before to make to describe Hardware architectures it has a very good support for macros. So I Could tackle that, you know, like now I have problems in the simulator to because of this anyway What else is peculiar about BPF? Well, this is the function prologue and a p-lock of a function in MIPS. I Choose and MIPS because it's one of the most straightforward architectures, right? This architecture. What do you use? Well, you get the stack pointer of the caller, right?  This is the typical that every architecture or most of it should do in BPF you don't have a stack pointer First shock. Okay. I don't have a stack pointer. So where is my my stack finishing is automatically allocated sort of With the kernel very fire One of the things that it does when you load a BPF from in the kernel is to scan it instruction by instruction Then it finds where the functions are where a function start its function start and where the function ends Then it tracks the usage of the frame pointer that is given to the function And it is able to determine how big the frame the stack frame for this specific function is It's super cool because you know, I mean this is like At hardware architecture that does automatic memory allocation for you So that's why you don't get a stack pointer. You don't need to keep a stack pointer. The hardware keeps it for you Okay, this which is Very comfy, right? It's not that nice when it comes to compilers. Why because GCC, you know, I did not like this idea that that well that much So initially, I was like, okay, I will tell GCC to eliminate the stack pointer in Favor of the frame point and that worked until I tried to compile the first function using a variable length array or a And then GCC went into an infinite loop, you know, it was very very very sad. What happened there? So basically I had to I made a hack, you know, so I'm using the register number nine, you know to implement sort of a pseudo stack, right? So you can use things like variable length arrays and a loco Of course, then the kernel hackers probably will tell you but you don't want to use a loco or anything like that in BPF programs. Well, fine, but as a BPF compiler, you know, I mean, I want to really support as much see as possible Especially because recently BPF is getting so popular in different kernels as kernel subsystems That really I mean, I will not be surprised if in five years We can't support C99, you know on top of BPF Whether that is good or bad. I'm not getting into it, but I will not be surprised. Actually people are starting Oh, I want to get half a virtual machine in this user land application. Can I use PPF for that? I have heard that more than twice in the last few weeks. So it's coming. Yeah Another peculiarity Basically in the kernel, this is an excerpt from the kernel interpreter The kernel has two different implementations of BPF. It has an interpreter and also it has a just in time compilation Right, which are each architecture has one The kernel every time one BPF function called another BPF function The kernel allocates a new the interpreter allocates a new array Which is the stack frame of the cold function of the collie, right? And this means that the stack is this joint or we should assume that the stack is this joint actually in the JIT Implementation the stack happens to not be this joint, but you cannot assume that right? so this means That generally speaking you cannot access the the frame the the stock frame from the caller of the caller The verifier supports referring to it using an absolute address and that is used I was so grateful for that that is used to implement passing arguments by reference, right? You pass a pointer instead of a value, but You cannot access the stack frame of the caller as an Offset applied to your frame pointer relatively from your frame pointer And what happens then that there is no chance of passing arguments in the stack So you have a very hard limit of the number of arguments that you can pass from one BPF Function to another you can imagine how painful this is for me, you know when it comes to test for example the compiler There is also the stack limit. Yes, five minutes another Interesting thing, okay BPF doesn't give you assigned division instruction, which okay It should be that people don't need it. I guess I don't know but well LLVM gives you an internal compiler error if you try to compile this code GCC generates a phone call, which I think is much more elegant, but the same useless, you know BPF doesn't have a zero register I come from maintaining the the spark back end of GCC so you know for me a zero register is like I don't know Underwear, you know, I mean I feel uncomfortable without one, but it works, right? And it has many other limitations And those limitations are not capricious, you know If there is a reason why the instruction set is limited like this, but then when it comes to implement the You know see on top of this Well, it's fun. It's funny Very good news Alex say say it in the plan verse Last week that a memory model is coming You know memory model in an architecture basically tells you How the memory writes and loads are ordered? Implicitly or explicitly with explicit instructions So it's good that BPF is getting a very well-defined well-defined memory model because that means that I can add an instruction scheduler to GCC and This is something that I am doing and it's also a proposal Which is that I have a huge problem BPF is so limited that I am find myself in great pains to test my compiler Because the number of arguments to functions is limited the size of the stack frames is limited Everything is limited. So when I try to run the GCC test suite It's a car mates. So I'm introducing a new target an option which is XP PF. I call it six XP PF for exceptional as BPF or whatever I don't care about the name actually which basically is BPF without the restrictions right The main purpose is to test my compiler Also using this you should be able to have backtraces and if I support that in the simulator and in GDB You should be able to sort of debug your programs before you know Using the kernel side the bugging facilities that Alex say and the others are designing on the kernel side and also I think it will be good, you know to Explore, you know the impact of okay. What will happen if we change this limitation or we limit this limitation? So this XP PF thing is happening on the toolchain It's working progress So the current status is that the binutil port is upstream so it will be part of binutils to 30 Something I forgot that will be released soon and it will be part of GCC 10 Which will be released next year next step the face to I was talking before which is okay now the programs that we generate from GCC should work on the Kernel I'm working with the kernel hackers to on that Because for example now working on on that the self tests in the kernel They should work with with both LLVM and GCC and they should do the same thing right should be interoperable and To support the compile ones run everywhere, which is btf. Basically, I don't have time to get into this but it's actually quite interesting and And well in general to work with both the kernel community and the LLVM people So we can all together evolve this field of compiled BPF, which Well, it needs, you know, it needs love basically and And that's it any question So what would this simulator be able to do like for specific BPM program types? Are you going to mock out the context or something the simulator? Yeah, well the idea is that we are going to simulate kernel contexts Because I mean our main idea is that you should be able to develop and the back your BPF application as much as possible Before doing assist call to the kernel I am aware that the perspective of the kernel hackers is different in this sense Because they test the LLVM backend with the kernel tests and they do all the testing and the kernel side I Sort of disagreeing that point, you know, because I think that we should be able to do as much as possible before Going into the kernel and I think it will be beneficial for the kernel as well So we are going to to support some kernel context. Yes, I Would like to come back to the kernel options. You were talking of removing. Yeah, sorry about that.  Yeah, they suck Understand correctly is that means that in a way newer GCC would not be able to compile BPF for older kernels No, that's not like that. No, basically if you if you had a build system, you know I mean the idea was that in the same way that GCC Tells you that an instruction doesn't exist in this version of the ARM Architecture, for example, then my idea was well if any BPF instruction was added in In the kernel 5.3, right?  That's an assumption. I'm not sure it's true at least in the embedded world So maybe we can discuss that afterward. Yeah, anyway, I think I found the solution for that Which is to support the option, but it defaults to latest So basically if you ignore it is not gonna bite you. Yeah, so with the strike stuck trace generation could could you just have like a External channel where the machine would help you to generate the stack trace if you if you need for debugging What do you mean with external channel? well that you don't try to derive the The the the the stack trace from from pointers on the on the stack, but you Query somewhere external. Yeah the simulator just gives you a list of the functions because it knows them Yes. Yes. Yes. Yeah. Well, yeah, actually it's gonna have to be like that because This is the concept of return address in BPF is not I don't think it exists actually, right and My problem is dwarf in this case, right because I found this problem straight away when I was writing the backend And it was like, okay, what is the CFA address? Ops Oh, yeah, okay. Well, and But yeah, yeah, that's a good idea. Yes, it's gonna be it's going to have to be something like that or XP PF Which is that I know it's not optimal But hey compile with your problem with minus X minus XP PF then you can debug your program logically Because that's the thing. I mean logically, right? I mean the generated code with minus XP PF is not gonna be the same that with Compiling real BPF, but at least you can do some logical debugging right on the algorithms that you are implementing in your Of course currently BPF doesn't allow you to have unbounded loops for example So the algorithmic that you can encode in a BPF program is Well, very limited But I don't know it may change in the future Okay, thanks. We done. Thank you


Hello everyone this is Amit Dan of amitdan.com. Today I'll have another episode of unboxing and review video and I'll be opening the air deck playing cards which I have it right here. If this is your first time or you can visit Thank you for your support on this channel. I'm also trying new and different ideas If you are into thinking outside the box, this is the channel to subscribe If you are looking for more review videos, there will be links in the description box below So I looked at this card When I was like searching for cards then I found this card and then The first thing attracted me was the size It's in a half of the regular card size for example if we take these regular cards and if you just you know Hold on to here then you're going to see that you know it's kind of half of the regular size cards and then this is very Handy and travel friendly because it's very small and it looks really nice and cute And that's the reason I bought it and I wanted to give it a try So this is not a paid or affiliated review. There are no affiliated links. No nothing I purchased this with my own money and what I noticed that this card is kind of you know Hard to get a hold of you can find them online but everywhere there's like in a lot of shipping charge and on Amazon it's more expensive than other online retailers So I decided to pay a bit shipping charge and then purchase this from a different retailer than Amazon And the funny thing is when I received it, they actually shipped it in a huge box like this And I was even not sure if the you know card is in here because it's so much bigger than the real cards So some of the features of air deck cars are that you know They're waterproof and it's travel friendly light weight and it's 3.43 by 1.26 inches or 87 by 32 millimeter. So I have it water here and I'm just going to you know, put some Up them in here just to make sure that this is waterproof and let's just you know, go through the unboxing so There's no additional box or anything for this card it just came like this in the big box and I'm just going to you know, remove these plastic wrappers Okay, looks like they're a little bit Difficult to open Okay, so I took that out So now here I can see that this is actually kind of a box and this one looks like made of plastic as well So this is going to hold, you know on the cards Well and also this can be your travel pouch or travel box for these cards when you travel So I'm just going to remove them and let's take out all of them Okay, so the box is empty and It holds a very nice in your hands and Actually, it doesn't feel bad at all Initially, I thought that you know is going to feel bad To hold because of its size, but it doesn't feel bad at all So what I'll do let me just put some two in the water and let's them just you know sits there for a little bit And let's just take a look here So yeah, it has that nice feeling and you can tell that this is high quality and It feels very you know good in hands. So this is made of some sort of plastic material That's the reason you get the the waterproofness and It feels not bad. So we'll just leave it here and let me just take it out of the water and As you can see that it's not you know Holding the water is kind of like you know slipping off So definitely these are waterproof you can see that you know the water drops So it's just kind of like you know not sticking to the card. So The waterproof is really working so this is going to be very good or handy when I travel and you know instead of carrying a full set card like this I would be You know happier to carry these small cars and also it looks very cute and eye-catching So definitely I'm happy with the product just to mention that they do have other size or other like you know designings, but this is the one I found but they're like you know more I saw a variety of like you know designings. They have one some other sites But definitely I'd like to try or buy another one if I find something in the future So that's all for today. Thank you for watching this video. There'll be more videos coming up. So I'll see you shortly. Thank you