This particular one relates to the construction products regulations and is the results of the mistaken claim by one system manufacturer that the smoke classification of S1 is higher than that of S1A or S1B. The duration of the EN5399 test used to classify the smoke production is 20 minutes, during which time a 20.5 kilowatt flame is applied to the test sample. Typically this involves 24 individual cables that are attached to a ladder in a vertical test chamber. The smoke production classification has three levels. S1 having the following limits. Total smoke production of 50 square meters with a peak smoke production rate of less than 0.25 square meters per second. S2 is less than 400 square meters at a rate of no more than 1.5 square meters per second. Lastly S3 is very simple. It does not meet either S1 or S2. Now to clear up any confusion. If you pass S1 you can then opt to add an additional test to establish what is termed transmittance. This test is not new to us and we've been using it for a number of years to qualify an LS0H cable and it is related to smoke capacity or density. Effectively it is the amount of light that can be measured through the smoke produced. More than 80% is classified as an S1A and between 60 and 80% it is S1B. Below 60% it is a fail and could actually impact upon the claimed S1 rating. In conclusion having just S1 is not good enough as the majority of countries have declared or intend to declare a minimum requirements of S1B. The UK being one of them. Furthermore if you only have an S1 cable it could be argued that you're taking a backward step. If you don't establish the smoke density by way of additional or third-party verification testing. We trust this has cleared up any confusion.


Parallisuus understanding, different methods explained. So maybe the first question, what does parallel in general mean? You've been saying this a lot. Parallel in this case means that in general, it means that we're doing more the same thing at the same time. Yes I guess that's the whole point here so. you don't want to run it basically with the power of your computer.  And there's these different paradigms here. Well first if we look at our roadmap picture here. in this part of the course we're looking at the additional screen or actually just a little bit more of its background. Well, first, if you look at our roadmap picture here, in this part of the course we're looking at using multiple of these CPU nodes together. Yes, so we'll talk about the different ways of working so that you can get your code going faster. At this point it's good to iterate that doing something faster or more efficiently or something, it can be faster in the sense that you get all of your work done faster.  We are often talking about throughput, which means that you get all of your stuff done faster. But it doesn't mean that individual things are done faster, but it might mean that all of your things are done faster. And then there are the situations where your piece of code runs faster, so you get it done instead of ten minutes it takes five minutes. And that is faster in the time sense. But there's also this idea of like you get all of your work done faster. And we'll be talking about this in detail when it comes to these paradigms. But maybe you should explain all of these different ways of working. So before you explain them, what choices do people have? Like do people choose which one to use for a code or is it sort of already, if you know what code you need, it's sort of part of the code. So that's an excellent point. So you have some choices. So for example, you can choose what code you use, you know, often. Some of these ways of working, for example, this embarrassingly parallel way of working it or data parallel, also known as data parallel. It can be used with whatever code you use. But in some, in many cases, you are limited to what your program can actually do. So different kinds of programs like I mentioned the word salad, like different words with different paradigms. So different programs work with different parallelization paradigms. And if your code doesn't use those, it cannot use that way of parallelization. So you need to like pick up on these patterns that okay, like this my code talks about this kind of stuff. So it means that it uses this parallelization scheme or idea. And this is what we are going to be talking. So for example, your supervisor says you need to use this code to run stuff and you look at the code and it's MPI code and then well, you're using MPI. And if you're writing your own code and deciding which to use, that's another level that we're not really discussing today. There's plenty of other courses for that. Yeah, if you're writing your own code, of course, you can, based on the problem that you're trying to solve, you can choose which method might work best and maybe we'll go into that in some point. But yeah, not really, it's a full kind of worms that we probably don't want to open. So what are the main paradigms? So first is embarrassingly parallel, which you'd already mentioned a little bit. So yeah, well, let's look at the picture here. Yeah, the picture is the same one. So if you scroll a bit down, you can see both of the pictures. Yeah, so here's two diagrams that show like the first diagram basically shows how the code would be situated in the cluster. And the second paradigm shows a bit more like this kind of an overview diagram of what's happening in one slurm submission. So array jobs or these embarrassingly parallel jobs, these basically that you're doing like two things at once, but with different inputs. Like if you think about like you have like you'd need to do like like Richard said, Richard had to process multiple videos. So he has one code that processes videos and he has multiple video files that he needs to process. So what he can do is he can run each of these video files and process them in individual jobs. And all of these jobs can be run at the same time in the cluster in completely like completely independent of each other. And then they finish well independently. So they're completely independent and they run in their own like on worlds, but they reuse most of the most of the code. So the only difference in each of these jobs when I was running stuff would be each one gets a different input video file. Okay, I think that explains it well. So yeah, we'll talk about array jobs in the next section, but this is like this can be used with any kinds of code.  And there's this structure called array in slurm that allows you to easily like parallelize whatever program you have, so that you run multiple copies of the same program with multiple different parameters. Okay, and that's the next lesson, if I remember right. So what's next? Share memory. Yes, the next one is shared memory parallelism. And in this situation, in this situation we have one computer, like one CPU node, where we use multiple processors at the same time. And the shared memory parallelization means that the different processors communicate with each other and they discuss using the shared memory of the node for doing stuff. So your laptop, for example, it's a shared memory parallelization, like it's possible to run shared memory parallelization on your laptop, because your laptop has like memory inside of it, this ROM that we were talking about yesterday, and it has CPUs, multiple CPUs. So if you're running, for example, like I don't know, like NumPy code or R or Matlab or whatever program on your computer, or even now when I'm running like Zoom, Zoom has multiple, like these kind of threads running around them. It's doing multiple, multiprocessing all the time to run, or let's say Firefox, if you start a browser, it starts multiple different processors at the same time. And all of them communicate through the memory of the machine. And in these situations, you need to reserve, like one of these, your job needs to reserve multiple processors for it, and all of these processors then communicate with the memory. And different programs, most programs or many modern programs utilize this, and it's quite a simple way of parallelization. Like, for example, last night the video encoding itself, not the subtitling, that uses multiple processors. So I was using my desktop, so it has eight processors, and I'd run one job that distributes among all eight of them using shared memory. And that speeds it up fairly well. Yeah. So basically, like, if we return to the, sorry for the hungry people out there, but cooking analogy earlier, like, let's say you want to cook like a full meal on a stove, you need to, at one burner, you have a pot full of sauce that you're making, like your bolognese sauce or something like that. And on another pot, you're boiling the pasta. Like, these are not independent, because both are important for the meal. Like, if you do only one thing and you only have the pasta. They have to communicate somewhat. Yeah, they have to communicate somewhat, but they might do different things. And then you combine the things together. So this is kind of like idea of what's happening here. So let's probably move forward. Okay. Move on to MPI parallelism. And what's the example here? Yeah, if you scroll a bit, yeah. So in MPI parallelism, so you might have heard this, let this MPI. So it stands for message passing interface. And it's this kind of technology that has been decided upon by people, scientists, so that they can run these like a large scale computations. So if you think about the supercomputers running like some weather model or something like that, they're usually running MPI codes that enable you to communicate between multiple processors at the same time in like across the boundary of the computer. So in the first diagram, we can see that there's like two, the reservation here is spread across two different nodes, but these are not independent, but instead MPI programs usually work as this kind of like a collective. So they communicate with each other and they are all running the same program, but they all are running their own part of that program, and then they communicate with like usually neighboring tasks or other tasks, so that they can like have a discussion. Okay, where are we? And they usually run as this kind of like a collective. So let's say like a weather model might be split upon like cubes or something, like each processor. Yeah. Or yeah, let's use the weather model example. Yeah, so each processor or each of these MPI tasks will run its own like own cube and run what's inside there. Yeah, like just to model the weather for the whole planet, the weather in Finland doesn't affect the weather in Australia, so they divide up the world into let's say several tens of kilometers squares, and then each square only has to communicate with the squares adjacent to it, and it can scale up very large that way. Yeah, maybe I would say that it actually affects, like this is like if you know like if you have like chaotic processes and that sort of things like to make it so that it affects, like let's say a weather in Cuba affects the weather in Finland, like you need to have all of them running in the same model, like you need to have all of the stuff in the same like simulation space, and that's all of the workers need to run the same model at the same time. And this is kind of like a paradigm that if your code doesn't use MPI, it doesn't use MPI, right? Like you write programs from the ground up using this paradigm usually, like you don't like decide to use MPI just for the kicks of it, like if you already have like a program, you usually build the program like using MPI as kind of like this base layer that clues the whole thing together. Yeah. And I guess given the power of processors, MPI isn't as often used unless you want to scale to truly massive sizes of stuff these days. Yeah. Like once the last time a big MPI code was written. They are written all the time, like they are written all the time. Yeah. But it's like nowadays they're talking about the extra scale and that sort of thing and it brings like different kinds of problems. Like if you think about, we'll hear about the Lumi Supercomputer for example today from CSC people. And in those scales you need to really think about how the communication happens because you might have thousands of computers working together. But let's move forward to the... Yeah. Moving on. Next is GPU. And this is actually someone asked the question how about... How are LLM's trained? And that's this. So what's the GPU thing? So yeah, so that's like... Yeah, I'll first answer the GPU and then I'll return to the LLM. So GPUs, like GPUs are graphical processing units. Like the parallel execution is a bit different than like the parallel in that we previously mentioned. Like previously parallel execution was done by processors, like CPUs or central processor units. But in GPUs you have this one card which has this like massive amount of like small calculators inside of it called like GPU cores or CUDA cores or computing units or something like that. And these can each execute their own piece of the program independently. Like they usually work like... They all work with like different data or something like that. Sometimes they share data but they usually run their own like program inside the GPU that is written specifically for the GPU. And the CPU part in these programs, it usually like sets up the whole thing. It reads input and output and that sort of thing. It creates like the data that the GPU needs to have. It moves that data onto the GPU memory. Like the GPU has its own memory. And then these like thousands of... We previously in the past analysis we used the cheese grater analysis. Like basically there's like a million little holes in the GPU. Thousands of holes that each individually creates like a strand of cheese when you have a cheese grater. And this is basically what happens that you have like these, a lot of these. And when we're talking about the large language models for example, these are so big that they don't fit into one GPU. So in those cases you usually have like MPI plus GPU grating. So you have some sort of communication. Or there's other frameworks like NCCL. It's hybrid down here. No. But basically you can mix and match these different paradigms. But you really must be certain that your program uses these. Like quite often for example, when you're doing stuff with GPUs, we'll talk about this later in the GPU part. But you usually want to have also multiple CPUs because the GPUs are so fast that you really need to keep them occupied. So you usually need to have multiple CPUs doing work just to keep one GPU doing stuff. So you can mix and match these different paradigms. But these are the main like different like parallelization schemes. And you should be like you should check on your program which one it uses before you start doing. And also like yeah, maybe we should quickly check on like the, does my code parallelize? Does the code parallelize? Yeah, I like the figures you made here. Yeah, so yes.  And each program has some part in it that is serial. So this is like a computing like fact. It's part of the whole computing thing. So all programs have some part that cannot be done in parallel. And you should think about like okay, how much benefit I get from parallelization if I do it. Like if I for example here in the first diagram, we have a program with a really small part in the code that is done in parallel. But most of it's done in serial. So even if you do the parallel part with two CPUs, you don't save a lot of time. But if you have a program that has like a large parallel part, you might save a lot of time. So you should like throughout the whole thing, we'll talk about this, but you should keep this in the back of your mind as well. But okay, like this is a massive amount of words. Do you do an exercise where we talk about this? Yes, okay. So this has been massive amount of words. And like don't worry about it. You don't have to yet understand all of the different paradigms. We'll go through them in order to read actual examples that you can try out. And how you ask Slurm to give you these resources. And I'd say, yeah, like one of the most annoying things is you get a new piece of software and it's like okay, I want to run this on the cluster. And it says this uses multiple CPUs, but you read the documentation and it really doesn't even tell you how it does parallelization. It just assumes it has a computer and runs magically. Yeah. But I guess not our problem. Or something to talk about later. And again, come and talk to us if you have questions. Don't try to do it yourself.


Okay, we know how to write down the wave function for a three-dimensional particle in a box, a particle confine in a box where there is no potential energy inside the box and is confined to not leave the box. Or that is we almost know how to write down the wave function. We haven't yet talked about the value of the constant a. And the way we get that constant, as we did for the one-dimensional particle in a box, is by normalizing the wave function. Recall what normalization means is the particle must exist. It must exist somewhere. It has 100% chance of being found somewhere in space or for the particle in a box, 100% chance of being found somewhere in the box. So if I integrate the probability everywhere, I have to get 100% and the probability is the wave function squared in this particular quantum mechanical way that we do squaring. So I just need to take this wave function, square it. I don't have to worry about complex conjugation because there's no i's and there's no imaginary numbers in this wave function. So I just need to square the wave function, integrate it, make sure it comes out equal to one, and figure out the value of a that makes that be true. So writing down what that integral is equal to, the wave function is this long thing. If I square it, I'm going to get a squared, sign squared, of n pi x over a, sign squared of a different n pi y over b, sign squared of a still different n pi z over c. So I need to ask myself what I'm integrating with respect to. I'm not just integrating with respect to x because I have a three-dimensional function, so I have x, y, and z. I need to integrate with respect to x and y and z. So this is actually a triple integral. I could write a triple integral sign here. Let me go ahead and do that. So I've got a triple integral over x and y and z. So that's the integral I have to perform. The a, of course, can come out of the integral. The triple integral is actually a product of three separate integrals.  So I can write this as the integral of sign squared n pi x over a dx. That's our x integral. Integral of sign squared n pi y over b. That's the y integral. And a separate integral of sign squared n pi z over c. And that's the z integral. All I have left to do now is remind myself, what are the limits of these integrations? If I've confined my particle to a box that runs from 0 to a in the x direction, 0 to a box length b in the y direction, and 0 to a box length c in the z direction, and those box lengths match the box links that make sure our wave function hits 0 at the edges of the box, then the first integral I have to do, integral of sign squared n pi x over a from 0 to a, that's exactly the same integral we had to do for the one-dimensional particle in a box. So I'll just remind you what the answer was when we talked about that integral. Previously, that was a over 2, box length over 2. So this whole integral is a over 2. For exactly the same reasons, integral of sign squared constant times pi times y over a box length integrated from 0 up to that box length, that's the exact same mathematical problem. So that will also be box length over 2. But the box length isn't a in this case. The box length is b. And so that's our second integral. The third integral, the result of that integral is going to be c over 2. So it's the same problem we did for one-dimensional particle in a box. We just do it three times and multiply them together. That product a squared times a times b times c in the numerator, 2 times 2 times 2 in the denominator, must equal 1. So since we're interested in solving for the value of a, a squared needs to be 8 over box length in x, box length in y times box length in z. Length times width times height of our box, that's just the volume of the box. So the constant a, the normalization constant, is the square root of either one of these quantities. I can write it as the square root of 8 over a, b, c. I can write it as the square root of 8 over v. In fact, I can write it as, if I remember that 8 is 2 times 2 times 2, that's where the 8 came from. I can write this as square root of 2 over a, square root of 2 over b, square root of 2 over c. The reason it's worth writing it out in that more complicated form is just to remind us that that's the normalization constant for a one-dimensional particle in the x direction, times the normalization constant for a one-dimensional particle in a box in the y direction, and then multiplied by a normalization constant in the z direction. So any, any one of these is an appropriate way to write the normalization constant for the special case where we have a cubic box, where the length of the box is the same in the x and the y and the z directions. Then each of these a's and b's and c's is the same. And in that case, the normalization constant simplifies a little further to maybe 8 over a cubed, if a times b times c is the same as a times a times a. Or we can also write that as 2 over a, not raised to the one-half power, but 2 over a square root times another square root of 2 over a times another square root of 2 over a, that gives us 2 over a to the three-halves power. So any one of these is the normalization constant for a cubic box. Any one of these is the normalization constant for a non-cubic box. And that's the constants we would insert here if we want to write down the full complete wave function for the three-dimensional particle in a box.


The humble Rubik's Cube can teach us something profound about the world. Since its invention in 1974, the cube has created a passionate following. We enthusiasts even have a name, cubists. Once you know the secret, solving a Rubik's Cube is very relaxing and satisfying. It's kind of like a mental massage for people on the OCD spectrum. But besides a hobby, the cube can serve as a tool for philosophy, like anything else once you begin to understand its underlying abstract principles. The Rubik's Cube can teach us about logic, the nature of paradoxes, and even the differences between rationalism and empiricism. To learn from the cube, we have to dive into the world of abstractions, and we have to start at the very beginning. What is a Rubik's Cube? Well, it's simple. It's a puzzle. It's an assortment of pieces that are out of order, and it's the human mind's job to put them back into order. So a scrambled Rubik's Cube appears to be in a state of patternless and senseless disorder, and a solved Rubik's Cube makes ordered sense. Each color is isolated to its own side. The human mind, as I've written about before, is the tool which turns the former into the latter. This pattern is not unique to the Rubik's Cube. It's what puzzles are all about. Jigsaw puzzles, Sudoku, crosswords, etc. So entertain the first analogy. This pattern of turning senseless into sensible is similar to using language. Humans create sounds with their vocal chords, but those sounds aren't nearly sounds. In the right pattern, they become meaningful. Take the sentence, for example. Cat the the over-jumped chair. Now, in this order, the sentence is a kind of language fail. It doesn't mean anything.  Just rearrange the parts and see what happens. We get the cat jumped over the chair. Now, those are the exact same words. They're just arranged in a different order. But the second time, it means something. Our ears might hear the same sounds, but in this order, sensibility is brought into existence. Communication happens. It's like the words in the sentence are the individual cubes on a Rubik's Cube. Simply twist and turn the cube, change the order of words in a sentence, and you create something sensible. So keep this analogy in mind. It directly applies to the existence of paradoxes, and we'll return to it later. This is a true story. The Rubik's Cube was kind of an accident. It wasn't created as a toy. In the 70s, a Hungarian professor named Erno Rubik created the cube as a tool to teach students about spatial relationships. And at some point, he accidentally scrambled the cube too much and couldn't get it unscramble. He worked on it for over a month before he figured out how to unscramble it. And then he realized he had created something special. It's now considered to be the world's best-selling toy. But put yourself back in the 1970s before anybody had solved the Rubik's Cube. It was an open question whether or not such a thing was even solvable by a human. The reason is because of simple mathematics. There are about 43 quintillion possible combinations for the Rubik's Cube, making it virtually impossible to unscramble by chance. Erno discovered a method of sorting through the combinations. He'd solve the corner pieces first and then put the middle or edge pieces in the proper place. And it worked. But since the 1970s, people have developed very complex and accelerated ways to solve the cube. The best speed cubers, as they're called, are able to solve it easily in under 10 seconds. So consider this question. Can every possible scramble of the Rubik's Cube be solved? All 43 quintillion combinations. Now there are two answers to that question. Both equally profound. Yes and no. We'll start with yes first. Regardless of how you scramble the cube, it can always be solved. It is a logical and mathematical necessity. I know it with certainty and so can you. But think for a moment how remarkable this is. How is it possible to know such a thing? Surely all possible combinations have not actually been solved. That data set is too big. So to what am I appealing to know with certainty that the cube can always be solved? The answer is what I keep talking about. Logic. If you start with a solved Rubik's Cube, you can scramble it for the rest of your lifetime.  Even though that particular scramble has likely never been solved before. This holds true for larger cubes too. They don't simply make three by threes. Four by fours, seven by sevens in the current world record at the time of writing this article is 17 by 17, which you can watch being solved online. But here's the underlying truth. You could have a Rubik's Cube the size of the solar system. And I know it is solvable in theory. Even if it wouldn't be possible to solve it in practice, given the amount of work it would take to solve such a thing, you can still know it's solvable in principle. This way of reasoning is analogous to rationalism. It's understanding the abstract principles of a thing and regardless of the empirical data arriving at true conclusions. In fact, even if all your evidence points to the fact that the Cube has never been solved, you can still know it's solvable. Once we understand the logic behind the Cube, we simply don't need to appeal to empirical data. Every move that can be made can be made in reverse. This is also why sound, mathematical reasoning, is so profound. It's true, applicable to the real world and not dependent on empirical evidence. It too is an extension of pure logic. The Rubik's Cube is a great analogy to critical reasoning in general, returning to our language analogy. If you start with a sensible sentence, regardless of its length, it doesn't matter how long you scramble the words or how senseless the resulting combination of words appears, it can be unscrabbled into something sensible. The same is true of our concepts. If we start with sensible concepts, it doesn't matter how much you scramble them. Hide them, obfuscate and confuse them. If you have the patience, you can return to sensibility. Now, as I've written about before, there's a large group of people who object to this kind of sensibility. I call them irrationalists. They desperately want to find some scramble of words or concepts that is inherently contradictory. They argue that, ah, this scramble can never be solved, that it's because our reason and logic itself is limited and flawed. Then they almost inevitably will appeal to the liar's paradox or quantum physics to prove their claims. This mistake is no different than the child who scrambles a Rubik's cube for a month and concludes, ah, my goodness, this time it's really unsolvable. Nobody could ever make sense of what I've done. This cube is now beyond comprehension. They, like the child, do not understand the nature of logic. It doesn't matter how long you scramble. It doesn't matter if you're able to even solve it in a lifetime. It can certainly be solved. The philosopher's job is to solve the puzzle, sit down and sort through the concepts one by one, twisting and turning the figurative cube until things finally get cleared up and make sense again. Ah, if only things were so easy. This analogy goes even deeper. Remember the question, can all possible scrambles be solved? One can accurately answer, no. How is this possible? It's possible if you start with an unsolvable Rubik's cube in the first place. Rubik's cubes can be disassembled. Then when they're reassembled, you can place pieces into positions that they otherwise could never get in, creating an unsolvable scramble. In other words, if you break the rules from the beginning and start with a tainted cube, you won't be able to solve it. So in actuality, the total possible combinations for a Rubik's cube is not 43 quintillion. It's about 519 quintillion, only one-twelfth of which are actually solvable. So does that throw a wrench into everything I just claimed? What if paradoxes are like an unsolvable scramble? It doesn't matter how long you twist and turn, according to your logical rules, the puzzle is inherently unsolvable. Could reality be filled with such irrational scrambles? Well, not at all. Think once more about our language analogy. We know we can unscramble the words the cat jumped over the chair. Regardless of their combination. But that's only because we're starting with a sensible sentence. What if we start with a nonsensical sentence to begin with? If we start with a broken Rubik's cube, if you will. Take the words belonging walnut, 16 potent under. By George, we've created an unsolvable scramble. It doesn't matter how long we twist and turn these words. We will never make sense of them. But so what?  Therefore, reality is paradoxical. Unsolvable scrambles simply demonstrate that you've started with an error from the beginning, and it is precisely the error in the liar's paradox. This sentence is false. It merely appears to be sensible, and as I have explained, it actually isn't. It's nonsense, not because reality is nonsensical, but because the sentence is flawed from the beginning. Seeking out true paradoxes or true conclusions because of the sentence construction is like saying, if we can find a nonsensical way to assemble these words or assemble these concepts, then we will prove that reality itself doesn't make sense. It's a fool's errand, to say the least. It's not difficult to create a nonsensical string of words, and it's not difficult to disassemble the Rubik's cube into something that isn't solvable. Doing so is not profound. It's irrelevant. It's just creating gibberish. There wasn't something sensible to begin with in the first place. One final analogy. Right after Erno Rubik created his cube, but before it had been solved the first time, he was in an incredibly unique position. He was the only person who saw the cube ordered properly from the beginning. He could know, though nobody else could, that the cube was actually solvable because he saw it assembled the right way. In a sense, he knew the answer from the beginning. And the same is possible in philosophy. How do we know reality was assembled the right way from the beginning? Perhaps things only appear sensible, but we'll discover that we're living inside of some unsolvable scramble. This is the profound understanding you gain grasping the nature of logic. The principles of logic are necessary and inescapable. It's not an open question whether reality is inherently contradictory. Things must be exactly the way they are, and they couldn't be any other possible way. This is why I write so much about logic. It lets you know the answer from the beginning. The law of identity, that A is A, a thing is a thing, it is what it is, is a necessary and universal truth. And when you understand why, it's exactly like seeing the Rubik's Cube in its fully solved state. Thus, at the beginning of any philosophic journey, one must begin with logic. It is the objective standard to which everything else appeals. It gives certain insight into the nature of all paradoxes. They are all just a matter of unscrambling language to reveal errors. So, what appears to be a simple puzzle can be turned into a powerful tool for understanding language, paradoxes, and even the nature of reality itself.


Hi friends, welcome back to my channel and a very special welcome if you're new here. My name is Jen, I'm a certified weight loss and nutrition coach and I'm on WW Personal Point. It's fall. As soon as September hits, it becomes fall for me. Fall is my favorite time of the year. I have always loved fall, Halloween, Thanksgiving, the holidays, so as soon as it gets close to September, I get into fall mode and that includes all of the comfy, cozy clothes that come with fall. As you know, I have lost over 125 pounds on my weight loss journey and I change sizes pretty frequently, honestly. Every few months it seems like I go down a size or two so I'm always updating my wardrobe. And for me, being on a weight loss journey, I don't wanna spend a lot of money on clothes until I reach my goal weight, but I still wanna look cute and I still wanna have all the fall vibes this year. So I hopped over to Sheehan's website and I purchased everything fall. Fall colors, sweatshirts, pajamas, cozy fall clothing and I am here today to share everything with you. Everything is affordable. Everything is extremely good quality. I even purchased a few jewelry pieces and a cute little decoration for Halloween.  Subscribe if you're not because I upload lots and lots of new videos every week. Five to be exact. Check out the description box down below where I will link all of the clothing that I shared with you today. I'll actually pop prices on the screen so you know how much everything costs. Spoiler alert, super affordable. Like super, super affordable. Everything I purchased was the price of one or two pieces at a regular store. I'm not even kidding. The prices are so good and the quality of everything that I tried on today was really good as well. Also in the description box, you'll find nutrition coaching. I recommend personal macros and calories. Highly recommend and I have one-on-one coaching if you would like to chat with me directly. Links and discounts to my other favorite things and my Facebook group, come on over join us. We'd love to have you. So let's jump into this fall clothing haul and try on. First I'm starting with pajamas because I pretty much live in pajamas. I work from home. I love to be comfortable, cozy during the day, but it's still warm here in Arizona even through fall. Not as hot as it is in the summer of course, but our temperatures don't really drop below the 50s or 60s during the day. We do get a little cold overnight, but during the day our temperatures stay relatively mild. So I had to pick up a pair of pajamas that represents my love for Arizona. So I picked up this super cute two piece t-shirt and short set. This is so cute. It has succulents and cactus on it. It is short sleeved and the shorts are great length. They're not super short. They're not super long. This is really, really a comfortable set of pajamas. I did pick it up in a one XL because that is the smallest size that they had. And as you can see, it is big on me. It is definitely loose. So I'm going to wash this in hot, dry this in hot, but it's pajamas. So the looser they are, the more comfortable they are. And I love that this was a two piece set, actually a three piece set because it came with this super cute eye mask as well for sleeping. It's a really, really soft material and they were really, really comfortable. This was actually the first thing I added to my cart because I saw it and immediately fell in love with it. I love the brown color. I love the cable knit pattern on this. This is a hoodie, a hooded sweatshirt slash sweater combo. It feels a little bit like a sweater but is comfortable and cozy like a hoodie. It does have the cute cuffed sleeves and I just love the color for fall. I love the cable knit pattern on here. I love that it has a drawstring with a hood. It is a fantastic link.  You could pair them with jeans. This is long enough to cover all the areas you want covered with leggings. It's a really nice, thick quality material. Like I always say for the price, Sheen's quality is really, really good and this little number does not disappoint. I may actually hop on their website and buy a couple more colors. Like I mentioned, I love Halloween and every year I like to buy a t-shirt for Halloween that I can wear in videos, that I can wear to hand out candy and the great thing about our new house is my neighbor told me we get hundreds of trick or treaters because we live in a community where when we lived in Washington, we got none. So of course, I immediately got excited about all the trick or treaters and ordered this really cute black tee. It does have a crystal skull on it. You can feel the crystals but they're not pokey at all. You cannot feel them through the shirt itself. I did pick mine up in a size large. I definitely, definitely could have probably got a small. This is a very oversized t-shirt but I will tell you that it is really thick, really nice quality and buttery, soft. You could tie this in a knot, tuck it in, wear it with leggings. I'm so excited to wear this to hand out candy and I did pick up a really cute pair of Halloween earrings from Sheen that I'll share with you a little bit later in today's video. I love this shirt. I love everything about this shirt. It is 100% see-through as you can see in the clips of me trying this on. So for me, I would probably wear a little black tank or black candy underneath but I love the sleeves, how they're the poofy, flouncy sleeves and then they have this texture. It looks a little bit like Shea Carpet, the little dots on here but it is so cute. It screams fall. I love the high neck. This could be used for the office for a little bit more dressy. You could wear this casually with leggings. It would be really cute paired with jeans or a skirt like a pencil style skirt. I picked mine up in an extra large. You can see it's pretty oversized on me. I think this was the smallest size they had. I definitely could have picked up a large or maybe even a medium. For reference, I'm normally a size medium or large in tops but it's okay that this is oversized a little bit because the tank top underneath will be more form fitting so it'll give that nice silhouette underneath the shirt and again, it's perfect to pair with leggings because it is long and oversized. I had to grab something floral. Now I will say of all the pieces I tried on, this is probably my least favorite. I did get this in an extra large. Again, I definitely could have sized down. It's pretty oversized on me. I don't know that it's the most flattering on me. Let me know down in the comments what you think. I do like the more ballooned sleeve with the cup at the bottom.  I do like that you can tie it closed and it is a really nice soft material. Feels really high quality. I think the floral pattern on here is perfect for fall. I'm just not sure that I love it on me so definitely leave your feedback down below. Let me know what you guys think. Should I keep it? Should I return it? I love this. I thought this was cute with leggings. Again, would be really cute with jeans, even a denim skirt. Definitely a little bit more on the dressy side so perfect for events or the office. I wanted to pick up a solid black just tunic type of shirt to wear with jeans and I really like this. This is that whole off the shoulder vibe. It does have these two little kind of spaghetti straps that lay really, really nicely on the shoulder and give it a little bit more of an elegant look. I picked mine up in a size large. I feel like it fits me really good. It is a little oversized but I think once I wash it and dry it, it'll be the perfect fit for me. I love that it is long sleeved for fall and again, you could dress this up, dress this down. I pair this with jeans for a little bit more casual look. Pair it with leggings to dress it up a little bit, even a skirt. It again, is really nice quality. It is nice and thick. It is buttery soft. And again, I just wanted a solid black, comfy long sleeve tunic for fall. You guys know I love orange. I wear orange all the time. I feel like it's a great color for my skin tone. It's very flattering for my eye color. I just love anything that's fall color. Those oranges, burnt oranges, browns. I love those.  It does have a V-style neck and I love the scalloped sleeves. It is a little bit thinner dressier material. Not thin as in poor quality but thin as in just the way the materials made. I did grab mine in an extra large. Again, it's a bit oversized but I wanted that on purpose because I thought this would be really cute under a little denim jacket. That's what I was thinking for fall or a little cardigan sweater, either a shorter cardigan or a long duster that goes below the knees with some leggings. I can see everything fall and winter with this. I love, love, love the color. It is really, really high quality. And again, it's thin enough to wear under cardigans, dusters and denim jackets. I love this color block leopard little sweatshirt. You know I love leopard. I love animal print anything. So as soon as I saw this, it was an immediate add to cart. This is so cute. It does have leopard sleeves and then it has a triangle panel of leopard and then more of a black and brown kind of textured look for the other panel and then the top of it is black and the entire backside of it is black as well. Now I did pick this up in an extra large for an oversized fit, which is perfect for me. If I wanted a more slimmer fit, I could have easily picked up a medium or a large but I was going for oversized because again, how cute with leggings, especially brown leggings like a chocolate brown legging would be so cute with this. And I also wanted to be able to wear this with jeans this fall and winter. So no haul, no try on haul on my channel is complete without something with animal print. I do have a few more tops to share with you but let's talk first about pants. I wanted them to be a little on the dressy side so if we go out for dinner or have a date night or if I'm going to some type of an event but I also wanted them to be casual enough that I could wear them every day and I didn't want jeans. I didn't want black pants. I didn't want leggings because I have lots of those in my wardrobe. I wanted something a little bit different. So I actually picked up two pairs of pants and let me tell you, I love them both. First are these, how cute are these? They are that whole burnt orange that I love. They are very, very high-waisted and then they have this tie detail on them. They are kind of a textured pant and then they do get a little bit tighter around the ankle. So similar to a jogger style but they don't have that jogger bottom because like I said, they could definitely be worn as a little bit more dressed up or a little bit more casual. I did pick up a size extra large in these and I feel like they fit me really well. Now they are a bit loose in the waist and hips but this tie is functional so I was able to tighten them up a little bit but I do appreciate that they are a little bit more loose fitting in the legs because I don't, for me and my body type don't love myself in like skinny jeans. I like my pants to have a little bit of flow in the legs and these were absolutely perfect. I definitely could have gotten a size large in these but I'm happy with the extra large and I just love the color of them. I love how cute and different they are. And then for a little bit more on the dressy side, again, you could wear these every day as well.  These are definitely a little bit more flowy on the legs. They do have a little bit more wider bottom and that's why I was saying that they are a little bit more on the dressy side. Now I would wear these to the grocery store or a date night or out to dinner or even just out shopping for the day. They are very, very comfortable and very weighted and high, high quality and I just love the maroon color. I immediately thought that that black tunic off the shoulder tunic would be super cute with these to make them a little bit more casual but I wanted to add a couple more pairs of pants to my fall wardrobe. I actually shocked myself adding this to my cart. This is a bodysuit so it is a full on bodysuit. It is black, it is a little bit of a ribbed material and it has that lettuce style of high color so it's not a turtleneck but it sits about halfway up the neck which I really, really like that look in that vibe under sweaters, cardigan, denim jackets. That's partially why it picks up this bodysuit and I also thought that this would be really cute with jeans or even either of the pairs of pants that I picked up from Sheehan. This is tight. She's tight on me. I'm pretty sure I got this in a medium because that was the only size that they had. I definitely could have sized up to a large. I mean, it's tight on my arms for sure which is not a problem area for me and it's pretty tight on my arms. It's just tight overall but I am losing weight still so I'm going to keep it because I'm betting by the time I get to my goal weight this will fit perfectly but it's still something that's wearable this season, this fall in this winter. And one other thing to point out is it does have that lettuce style of cuff on the arms as well. It's really cute. It's very soft, very comfortable and again, I am going to pick, I'll show you next how this looks paired with a cardigan and a couple of other overlay pieces so you can see kind of how I would style the bodysuit but I absolutely wanted to add a long sleeve bodysuit to my fall wardrobe. So this is actually the first cardigan that I paired with that bodysuit. I also thought that this cardigan would be really cute over a black cami, black tank top, even brown ivory cream or white. It is a very thin material which is exactly what I wanted. I didn't want a big bulky cardigan because I bought a bulky sweater. That is coming up next. This is in a size zero XL. This was part of their sheen curve line. This fits me but it's pretty oversized on me but it does have the option to tighten and tie the base of the cardigan. So I will show you in the try-on portion both ways. Open and tie it up a little bit so that you can see that you can tighten it around the hip or waist area. I love, again, how thin it is. I love that it is long sleeve but still that nice thin material and obsessed with the orange color. I love it. I think it looks really cute with the black bodysuit underneath. I know that this is one piece that I will get a lot of use out of. As promised, oh, animal print piece number two. As promised, I grabbed a sweater. Now, this is a little bit out there but I love it. This is also from sheen curve in a zero XL. This one fits me really, really nicely. It, lots of room in the arms, lots of room around. I absolutely love the purple leopard print, furry cuffs and furry collar. I just think this is so cute. Now, I did try this on with the bodysuit that probably wouldn't be my preferred way to pair it. I would pair this with some type of cami. Something maybe that shows off the decollete and the chest area because this right here is really the star of the show and having a shirt up to here. I don't know that I love it. I do love the sweater. It is a ribbed material. I would say that this runs fairly small because I definitely do not usually wear anything above a large and this fits me really, really well but I love it. It's so soft.  I have some faux leather Spanx leggings. This would be adorable and you could actually wear a cute little kind of brown camel colored cami or tank underneath. It's definitely a gen versatile piece.  Again, I love the chocolate brown color. It says leggings, leaves and lattes please. Again, this is me in a sweatshirt. I wanted a new fall top because I have a few fall t-shirts from last year. I'll be posting some transformation photos. Wait until you see how huge they are on me now. They're just not wearable anymore. And again, I wanted a cozy sweatshirt for fall. This is so soft, so soft. It is, I would say medium thickness so it's not a really bulky thick sweatshirt. It's perfect for the little bit cooler days not the winter days, maybe unless you layered it up. But for those crisp fall days, it's perfect. I love the brown, I love the length of this. It's cute with these leggings. I really loved it paired with these leggings. Again, the faux leather Spanx would be really cute with this jeans. You could even dress it up a little bit with the skirt. I love the saying, I love the color, I love it.  You cannot beat the jewelry prices at Sheehan. I have several pairs of earrings. I have several necklaces that I've shared in other try-on hauls. I will link all of the Sheehan try-on hauls I've done below. I've done a couple of summer and spring ones and I purchased a lot of their jewelry. We're talking $1, $1.50, $2, maybe $3. So the first pair of earrings I picked up are these brown. These are a wood or a faux wood. And I thought, how cute are these for fall with the brown sweatshirt with the black tunic? They just scream fall to me. And I love that they're those big kind of dangly earrings. And then, of course I had to grab some cactus earrings. I have wanted to add a pair of cactus earrings to my jewelry collection since we moved here, but I have never found a pair that I love until I found these. The little cactus on here are kind of like a plasticky type of material. And you can see that they actually have that cactus texture printed on them. And I love the little gold dropdown. I think those are so cute. Again, any green shirt would be really cute with these. Just a fun statement earring. And then lastly, as promised, these cute little Halloween earrings I mean, can we just talk about how cute these are?  This is going to be so cute with that skull T-shirt when we hand out candy to the kids. My neighbors and Troy and I are planning on going to some haunted houses and pumpkin patches. I love Halloween. I told you, I love the holidays. So I will be wearing these probably the entire month of October.  Now, Sheehan has a lot of home organization, home decor.  And I just thought that this little lantern with the pumpkin face on it is so cute. It lights up. You can see that he lights up. He's so adorable. You could hang this. I plan on putting this on my bookshelf in the background of my videos. I am planning on going full Halloween background coming soon. And I thought that he would be a really cute addition. And they are so affordable.  You can't beat the price and it even lights up and it works. So that's a huge win. So that is my fall winter Sheehan Tryon haul. I hope you enjoyed seeing all the clothes that I picked up, the jewelry, the cute little home decor piece. Definitely let me know down in the comments, what do you think of the floral shirt and which piece that I tried on was your favorite. I love hearing from you guys, getting your feedback. Let me know honestly if there's anything you think I should send back if you didn't think that it was flattering on me. Because like I said, I'm still in the process of losing weight. I don't have a lot more to lose but I still have a little bit more to lose and I want comfortable, affordable clothing. So I will go ahead and pop up on the screen here the total that I spent on all of these pieces, mind blown. It's one or two pieces at the department store. Everything will be linked down below for you in the description box. If you wanna be matchy matchy with me and pick up any of these items. And of course you'll find nutrition coaching, links and discounts to my favorite things. And don't forget come join our Facebook group. We would love to have you. Thank you again for watching. Happy fall y'all and I'll see you in the next one. Bye.


Hello, everybody. Welcome. Hope you enjoyed the keynotes today. My name is John Bellamerick from Google and here my co-speaker, Yong Tang from Avanti. Thanks for joining us today. Talk about Kordianus a little bit. So the first bit of this, we'll talk just kind of give an update on the Kordianus project in a little bit of an overview and then Yong will drill in a little bit on what it takes to develop the Kordianus plugin, which is actually really really easy. And then we'll have time for some Q&A probably. So most of you use Kubernetes, I assume, which means you're probably using Kordianus, whether you know it or not. Most Kubernetes clusters out there use Kordianus as their in-cluster DNS for service resolution. But in fact, Kordianus is an independent project with uses outside of Kubernetes and it kind of grew up alongside Kubernetes for the most part and was built to provide an alternative to the traditional DNS server. So if you look at something like Bind, it's a very venerable code base, quite difficult to extend, quite difficult to kind of manage in a cloud native way. And so Kordianus was built to start to provide a DNS server that one was written in a sort of a modern language that was memory safe, so it's written in Go, but also because a lot of bind vulnerabilities came out of just being in C. And to be able to be evolved quickly and to be able to add functionality quickly, to be able to kind of adapt to the rapidly changing cloud native environment that we saw happening a few years back as in the growth of containerized services. So Kordianus started with a focus on service discovery, but kind of the most important part in my mind to it is this, what we call a plugin-based architecture. And it's different than most DNS servers. It's a sort of request handling process. So the individual DNS requests come in and we feed them through a series of sort of pipeline of plugins, and those plugins can make decisions, and we can compose the plugins and the configuration of those plugins to really do some interesting things with the DNS requests. We do have quite a few contributors, nearly 400 now, and a lot of growth in the project. Part of CNCF process is this idea of a public contributor's file, so there's many, many more public adopters file rather. So we've got 35 people, 35 companies who've said they're using Kordianus in some way or another, but really it's in the thousands or more because, like I said, anybody using EKS or AKS or I'm from Google, but actually GKE not the core GKE. We don't use Kordianus, but we do for our on-prem and bare metal offerings we use Kordianus. So really the vast majority of people using Kubernetes out there are using Kordianus in some way or another. We did, in the last year or two, shift from a benevolent dictator for life governance model to a steering committee. So now we have, I think, five people on the steering committee, both of us are on the steering committee, but it's a pretty low drama project, so not much happens in the steering committee, but if anybody's interested in jumping in and participating in Kordianus, we'd love to have you. Very friendly, welcoming place, and we'd love to see you there. Since the last QCUT EU, this is some of the new functionality that's been added. So a new plugin for dealing with the configuration of listener timeouts, which we're just using the defaults before, and a bunch of new features on individual plugins. We had a release, our most recent release was in August, but we should be having, I think, a new release, in particular with the new, using built with a newer version of Go coming out pretty soon. Like I said, Kordianus is really originally targeted around service discovery, and what we'll show you in a moment is just an example use case of how you can use Kordianus outside of Kubernetes as a DNS server that can be backed by multiple different data sources rather than a typical DNS server, which is backed, say by bind, or maybe just serves data for your Kubernetes cluster. You can actually take Kordianus out separately and configure it to do additional things. So what the example core file, so I guess I didn't give that much background. So Kordianus is, you know, as a process is configured by something we call a core file, not a core dump. It's a different thing. And it's just a very simple file that allows you to specify for any given zone, what are the plugins that are active for that zone and what are the plugins that are then, what data sources are used for that, for those to serve up the data for that zone. And what are the interesting things I think in Kordianus is that a single zone can actually be divided among different data sources. So you can sort of create a hierarchy of your records that are served for your different zones where you'd say, I'm going to allow the, I'm going to allow you to override, say directly in the core file a few A records for this zone. But if you don't find it in that list for like a host file type of list, you can consult your Kubernetes cluster. If you don't find it there, you can consult a file or something like that. So there's a sort of, allows you to construct a single DNS zone from a composition of different data sources. And in this example that we have here, what we've done is allowed you to compose a zone from that's backed by your three different clouds. So, or I guess we have two here, AWS and Google cloud DNS. So essentially this allows a single zone to be served up in part by AWS, backed by the AWS API and in part backed up by the Google cloud API of services that are out there and in part backed up by a local, local data source. Who am I plugging? And honestly, that's all there is to it. It's not much to say. This is what, this is an example core file. We can digest this a little bit. It starts with dot, dot colon 53. So the dot just means root zone, right? Any, any query coming in for any zone will be processed by this block of, of plugins. The first one processed is route 53. So what's happening here, the, the, if we go back to this, this diagram, quarter DNS is a process is sitting there. You're configured with the route 53 plugins. So what you do is you actually take your AWS credentials and you connect to the AWS API and you load the data from there and you use that to synthesize the records for the zone. Similarly for cloud DNS, this connects back to Google cloud, brings in the, the, or synthesizes the record based on the API data available in Google cloud. And the fall through statement on here basically says that we can, if we don't find an answer in this, in that data source, fall through to the next data source. So that's why it goes from route 53 to cloud DNS, which then eventually falls through to this just sort of plugin that returns an answer for everything. So that's really all you need to configure this. It's a really very simple, simple process. The functionality, and I don't know if we have a slide here young on the, no, the, the, the functionality available. There's many plugins available and we tend to divide it into three different categories.  There's plugins that provide different data sources. So like I said, the different cloud vendors, a file or a Kubernetes cluster or even multiple Kubernetes clusters can be, can be used to back data for, for zones or database. And each of these plugins, you know, if you have your own data source, you may decide that you want to be able to serve up data from that data source, say an internal, uh, CMDB or something that manages your services. And what young is going to cover in a moment is how easy it is to actually extend court DNS to, to do that kind of, um, uh, add a, add a data source. The third kind of, um, plug in that we have is what we would call sort of data manipulation plugin. So here you can, um, you can use policies to block particular queries. You can add metadata to a request and then you can alter the request based upon the content, the contents of that metadata. So we have another talk tomorrow where what we'll look at is, uh, in a Kubernetes cluster, you could actually configure the Kubernetes plugin to append client data information. So if a pod makes a query to your court DNS server, uh, within your court DNS plugin pipeline, you'll be able to see the, the namespace of that client pod. And then you can make a policy decision on that and say, Hey, this, this client, uh, pod from this particular namespace is trying to access a service in a different namespace. I'm going to disallow that. So that's the kind of functionality you can do with these plugins and with the kind of infrastructure, uh, that's really would be extremely challenging to do in any other, uh, DNS server with that, um, do you want to jump in on the demo piece? Okay. So first of all, you know, like, uh, John just mentioned that, uh, if we are going to combine different sources of DNS information from different sources, like from cloud windows from let's say your local DNS, uh, zones or from your local DNS servers, you can combine them into one under that's the data consolidation process. And why you need that is because sometimes you may want to have a, let's go back. You may want to have a so-called a single source of truth. Let's say you'll have DNS server all the place because your IT infrastructure has DNS server, your cloud vendor has DNS server. You have some coordinate clusters on AWS. Uh, you have some, let's say, uh, uh, database services, uh, let's say on Azure or maybe on Google cloud. And then you have your VPNs with some, like a corporate, uh, internal IT stuff. All those things you can consolidate it into one. And in this case, putting us, it's supposed to be just, uh, what should I say, a front end of all the source of information. You can have one place to control the information. Uh, you make sure there's no collision. If the collision for DNS will sort out, like, uh, you can, you can go through the order of different, uh, information. So you can decide which information will be exposed first. If the information is not available, you move to the next plugin and maybe you'll search for the next source. Let's say, uh, Google cloud or AWS to find out. That's, that's one process of consolidation. But now here I'm going to share another example of saying you'll have the same, uh, DNS record and, uh, you wanted to adjust your response based on the, the, the request. So what does that mean? Is it's a source IP based service discovery. Uh, let's just hyper-sector say you'll maintain, uh, let's say, uh, uh, DNS server and, uh, this DNS server is located in your, uh, company VPN. But of course your company may not just have a VPN, right? Your company may have some external information. Your company may, may also have some, like, a test workload. And sometimes, uh, when you're doing test, uh, when you're doing testing of your companies, let's say your company have, uh, active development, you may want to manipulate in DNS to configure, configure additional stuff so that let's say, uh, a QA tester can potentially get a different DNS record based on which network it is in, right? So that's, that's very common practice. But then you're going to ask the question, how do I return a different, different response if for, I only know the source IP of the request, uh, right? So there's an easy way to do that. Of course, you're going to say, is there any existing plugins available in QoDNS so that I can utilize the, you know, core file to manipulating different plugins and get the information? Uh, there's no such thing, uh, unfortunately, because, uh, there, there was some pretty, no pretty extensive discussion in the past about you should we set up certain, let's say, source IP based survey discovery plugins. And the conclusion was that, uh, the source IP based survey discovery is fairly easy. However, to sort out different, uh, different use cases by different users, it's a hard process because we had to make sure if we're going to, uh, write a plugin, we have to make sure it can fit into all different scenarios. Unfortunately, all the scenarios look like to be totally different. Some people may have one request. Some people have another request. Sometimes they say they want the source IP to be based on side block. Sometimes they say they want the source IP to be, to be, you know, like a single standalone source IP or sometimes they say, okay, so they have some additional filtering rules to decide how they are going to do the source IP based survey discovery. So eventually we say, okay, so maybe we can, we will ask about the source IP based survey discovery plugin for many years. Eventually we just say, okay, so maybe we can just write a simple plugin as a demo plugin to let people see how this can be done. And unfortunately, this is super easy. I'll just show with the total of, let's say 80 lines of Golan code and you can get job done. And this is actually going to be a lot of fine experience, right?  You can build a plugin with Quoting S and you can get through all the necessary customizations as you need and feed your scenario, right? So let's just give an example of how exactly this demo plugin is going to work. So as this slide shows, the demo plugin is the source IP based survey discovery. Let's say you assist admin or let's IT admin and you just decided to say, okay, so I have a server. This server is going to be serving multiple purposes. This server has a DNS server. If, if a request is within certain, you know, like a side block or within the internal VPN or a segment of VPN, you want to return to one IP address, which potentially could be your testing server. And then you'll say, if the requester is not from this specific side block, you're going to say, okay, so let's just assume anyone else requesting a DNS, DNS record will return by default one IP. And if request is within a specific side block, it's going to return another IP. So this diagram, as you can see, actually separates the network into two parts. The first part is internal network. That's <IP_ADDRESS>.0 slash eight. That's internal network. And then anything else will be outside. So let's just make it everything simple because we can certainly pick up any IPs to return. But just for fun, I pick up like two IPs. One IP is <IP_ADDRESS>. Another IP is <IP_ADDRESS>. It's very unlikely you're going to use those two IPs, but <IP_ADDRESS> is Cloudflare's DNS server. And as we all know, <IP_ADDRESS> is actually Google's DNS resolver. So let's just set up this scenario and see how we can get the job done with minimal lines of Golan code. So as we can see, if it's internal, we are going to return <IP_ADDRESS> IP. And if it's external, it's going to be <IP_ADDRESS>. And the request, we just make it straightforward. The request will always be example.org. You set up example.org server, you return different IPs. That's fairly simple. So you're going to write a plugin for Quoding S. And the plugin, surprisingly, it's very simple. So how simple it is, it don't require three functions to fill in. And two out of three functions are just available. Start function, you need to get the skeletons in place. And there's one function that you need. As you can see, the first function is a need function, which will perform a one-time initialization because you need to register your plugin with Quoding S. So Quoding S knows they will pass the information to a plugin, allow your plugin to process the request. Setup is plumbing in place so that it can pass the configuration from the file and capture it at the struct. Sorry. Okay. The setup plugin, by itself, is also straightforward. If you wanted to make your plugin a little complicated because you have different configurations, then you need to add more content. But in case, all you need to do is just register a plugin, then that's fairly straightforward. And finally, the need of the plugin is a serve DNS function. This function is doing the processing of a DNS request and return the response. And once the processing has been done in this plugin, you just return and allow the next plugin to process. The next plugin can be a standalone plugin or another plugin you wrote. But let's just focus on one plugin for this demo plugin. That's going to be the source IP-based server discovery. Okay. So as you can see, the need and setup function are fairly straightforward. For need function, you register a plugin because the plugin is a DNS plugin. So you're going to register the server type as DNS. By the way, you'll probably notice there's a caddy in place. The reason caddy appears in QuotingS is because QuotingS started by itself as a plugin of caddy. Some of you may know that caddy is a web server written goal. So at the beginning, when QuotingS was developed, there was some design scenarios you had to figure out. So you need to get the plumbing in place. But as we are developers, sometimes we just think, what's the best way to write some system? You probably want to reuse some more code as much as possible in open source field, right? Because you don't want to waste time writing something from scratch. So that's how QuotingS gets started. QuotingS started as a plugin of caddy by itself. Of course, you're going to say caddy is what should I say ATP server, right? But it's all similar, right? It's either ATP or DNS. It's pretty much the same thing. You can utilize the plumbing to get the job done. So that's some of the creations to make your code reusable, to reuse other people's code. That's a unique function. Now the second one is the setup. The setup is essentially just a pass configuration. Now for the service-based source IP-based discovery. The configuration, we don't want to have any configuration because we just want to hard code everything. But in the future, you want to make it a little fun. You can certainly write more stuff. But for now, let's just assume there's nothing. Everything is hard coded. Okay. So that's the setup. Setup is to just get the configuration. And finally, that's the service DNS, which is truly the need of the plugin you need to write in Go. So first of all, the service DNS will pass three parameters. The first one is going to be context. That's a pretty standard. The second one is a response writer. And the third one is just a request. So the first thing is you have to construct the request state to figure out what exactly is the information that has been passed to this plugin. As you can see, you can get a kill name, which in our case, in our example setup case, that's going to be example.org. Then you're going to say, I want to reply. What kind of IP address I'm going to reply? I'm going to reply either 8.8.8 or I'm going to reply <IP_ADDRESS>. And because I want to, I want my plugin to be source IP based, I do check the IP of the request. And the IP of request, I'll just make a very simple go-down function for prefix search. If IP starts with 172. something, okay, that means it's internal IP. I'm going to reply <IP_ADDRESS>. Otherwise, I'm going to reply <IP_ADDRESS>. That's fairly straightforward, right? And then you have a, there's some like a logging facility to say you'll just print the kill name, the IP and reply so that you can keep track of what they have done. And finally, you just need to construct the answer. Now you're going to say, what else do you need? Well, that's pretty much all you need. You just return the answer. And if you cannot process, you just let the next plugin to continue. So that's all you need. Then you'll say, okay, so if I build this plugin, so what else do I need to launch this plugin? In order to start, you also need to initiate the plugin in the profile, the profile, the configuration, because our demo plugin, a hard code, everything. You saw the code, we use specific IP addresses in the go-down code. So there's nothing to config. As I said, that's a setup function. There's nothing. So we just invoke by specify that demo is a plugin we wanted to invoke. And that's it. Now next thing is going to say how to build that. In order to build this plugin, you have to do several things. First of all, you can just download a code in a source code. And your go-down plugin should be placed under the plugin directory. In addition to that, there's a plugin.configure which is needed in order to allow your go-down compiler to pick up this code and build. And that's it. There are some easy ways to compile this plugin. I managed to draft a pretty lengthy dummy doc build code that you can just get the job done. There are some flags to pass. That's mostly just to get around some security-related like restrictions. So you can just build it. If you run this one line command, it's several lines, but it's just one doc command. You can build your plugin as well as coding as code. And you will see a binary that's coding as local directory.  You can just run this coding as a binary. And that's it. Just one more thing is, you see like in the core file, you use 10.53. Of course, you can pick up for 53, but in case you pick up 53 in certain Linux system, you may realize that you need a root address. If you're just doing some testing, you can start with 10.53, which will avoid the collision. And that's it. Okay, so you're going to see where the source code. The source code is in the small repo. The repo is part of the coding as well. And if you just go to this repo, you're going to realize the whole repo consists of virtually 80 lines. And with 80 lines of Golan code, you'll pretty much write the service discovery based on the source IP. And why we showcase this plugin is because many people ask, okay, I want to achieve this thing. How to get the job done? Is there any core file we can use? And sometimes the answer has been, okay, it's a little, you know, if you just want to grab the existing plugin and tweak around some configurations to get job done, you know what? It's going to take some time to be a little creative to manipulating or even hack into the core file. And you're going to spend a lot of effort.  I think it's a fine process. Okay, so that's a demo plugin we showcased. As I said, you can go through this repo. You're going to realize it's super simple, extremely simple. That's something very important because we don't want to solve a problem in a complex way. We want to solve a complex problem in a simple way, not the other way around. Okay, so that's a demo plugin we showcased. And finally, we wanted to go through several bullet points about coding as a community. If anyone is interested in contributing to coding as, you have several ways to contribute. You can start coding as a GitHub to increase the visibility of coding as. You can also add your institution's name to adopt the start MD. This will actually allow you to have a chance to create a pull request. No, you can just create a pull request and should be easy. You can also become a maintainer. In order to become a maintainer, you probably need to contribute a significant pull request. What is the definition of significant pull request? If you write a plugin, that's a significant pull request. You also need to be sponsored by one existing maintainer, which is a very low threshold.   Right? So it's interesting you can do. Like I said, the lecture I mentioned, we have 28 maintainers. So the threshold to be a maintainer is extremely low.  Okay, that's pretty much it from our side. Any questions? All right, it looks like we have about five minutes for questions. So gentlemen here, there's a microphone there you can go stand at. That way you'll show up on the recording properly and whatever. Yeah, thank you for the talk. Very insightful. Also very interesting that GKE does not use cordiness. Thank you for this insight. I was wondering whether you considered using WebAssembly runtime as an extension to your current plugin system, because on the one hand side this would allow an author to create a plugin in basically any language, plus you would avoid the recompilation step of cordiness. You said wasm, is that what you said? WebAssembly wasm. Yeah, wasm. Okay. I haven't explored that. I mean, it's definitely a possibility. At one point, one of our maintainers was looking at adding Lua support, but I think that that's a reasonable thing to do. I have not looked at it and you're welcome to join in on GitHub and our Slack channel. We have a Slack channel on the CNCF Slack, but on the Kubernetes Slack and we'd love to see something like that. Right now you're right. It requires a recompile of, we don't have a dynamic plugin system. It's a built-in compiled in plugin system. All right, I have created a ticket. Any other quick, looks like there's somebody here. Hey, thank you for the presentation. Small question about the testing. What do you suggest for the testing of the plugins? Are there any tools or techniques? Well, unit tests for sure. Just go unit test, standard go unit test. We have some end-to-end tests that are part of our CI infrastructure. I don't recall what we're using there specifically, but years ago I put together a container image with some testing tools in it for DNS, but I don't have anything specific that I can recall off the top of my head. We do some performance tests. If we go look at the tooling we have in our CI, that's probably where I would start and pick up the tools that we have there. What if the plugin is not going to land in the main base, code base of core DNS? What if it is a homemade plugin and we would like just to run the tests in our CI, apart from the unit test of course?  It's pretty straightforward. So as far as testing query tools, it all depends.  But if you want to do load testing, sorry, it's been a couple of years since I looked at the testing tool, since I was working on the testing tools in this, so I can't recall. There's a few that we used to really, so one of the interesting things, and I don't have one minute left, like when you do start to do some of the load testing on DNS, you start to tend to be limited by things like the packets per second that your cloud provider will even allow on that particular level of node because the packets per seconds tend to be pretty high on the DNS server. So with a bunch of, do you recall any of the names of the tools? I would have to look it up. Frankly, I'm going to say, if you're going to test DNS, I mean, dig is certainly the best tool available, frankly. On the other hand, if you're going to say you want to write something in Golan, as you walk through the plugin, you'll probably realize the DNS by itself is fairly straightforward. You have the query, you're going to return a response. I mean, you can find many ways to test, frankly. Looks like we have one more question. Maybe we can sneak it in quick. We're being yelled at now. Yeah. So my question is based on how core DNS might be used or be helpful for like blockchain networks where you need to find peers and stuff like that. But it's a bit different because in this case, it's like some peers might behave in some way that you might not want to keep it up, but not about behavior, just like about finding the peers and maybe putting them down if it's not working anymore or something like that. And this is the first question in the following what is like, if those peers are not supposed to be kept in there, like in a file if they're not working anymore, or if we can find them anymore, like is deploying core DNS on a stateless service a way to go or that will be like a no go? I think I'm going to need a little more context and we're out of time. Why don't you come over here. We can talk about it offline. Sure. Okay. Thank you. Thanks everybody.


So, Brazilian President Jair Bolsonaro is often referred to as the Trump of the tropics, and it's easy to see why that's the case, because he very much is a Trumpian figure. He is a far-right demagogue who is a pseudo-populist, he's a fascist, and he's proving to be a menace to Brazilian society already when he was only recently elected as president. He's already causing lots of destruction, and it's not just that he's ruining things in Brazil, his actions are directly affecting everyone, the entire planet. So we'll get to that, but first of all, to kind of give you a snapshot of how petty and authoritarian this individual is, well, as you all know, Glenn Greenwald, prestigious American journalist, lives in Brazil, his husband, David Miranda, is the only openly gay Brazilian member of Congress. Now, Glenn Greenwald published an article in The Intercept with other journalists that exposed how Judge Sergio Moro, who oversaw the prosecution of Lula de Silva, illegally colluded with prosecutors to take down Lula, and then he was subsequently appointed as justice minister by Jair Bolsonaro after he successfully took down one of Jair Bolsonaro's biggest political opponents. Seems pretty fishy, right? So what Glenn Greenwald revealed in that article is that Sergio Moro illegally broke the law, ironically, in the process of trying to bring about these bogus corruption charges against Lula. Now, Bolsonaro retaliated against Greenwald for his reporting by launching an investigation into him, which is insane.  And I really, you know, I feel for Glenn Greenwald here.  But I mean, it shows you that Bolsonaro is petty in the same way that Donald Trump is petty, but definitely, you know, measurably worse.   But it's not just that, you know, this is a problem for Brazil that his presidency poses a threat to Brazilians, because what he's doing is harming the planet. And I don't even know how to process this story, because I just feel so hopeless. So as you all know, in Brazil, they control the Amazon rainforest. And we often refer to the Amazon rainforest as the Earth's lungs. And for good reason. But what Jair Bolsonaro is doing is accelerating the process of deforestation. He's basically opening up the Amazon rainforest to private companies and he's saying, how about it?  Now, as Tom Phillips of The Guardian writes, illegal loggers are ramping up a brutal fast assault on the Brazilian Amazon with the blessing of the far right president Jair Bolsonaro, the sacked head of the government agency tasked with monitoring deforestation, his warrant speaking to The Guardian five days after his dismissal. Ricardo Galvallo, the former director of Brazil Space Institute said he was praying to the heavens, the far right leader would change tack before the Amazon and Brazil's international reputation as an environmental leader were ruined. What is happening is that this government has sent a clear message that there will not be any more punishment for environmental crimes like this government is sending a very clear message that the control of deforestation will not be like it was in the past. And when the loggers hear this message that they will no longer be supervised as they were in the past, they penetrate the rainforest. Galvallo said claiming enormous damage had already been done since Bolsonaro took power in January. It is a question of brutal fast economic exploitation. Galvallo, an internationally respected scientist, was director of Brazil's National Institute for Space Research until last week when a public clash with Bolsonaro cost him his job. Days earlier during a meeting with foreign journalists, Bolsonaro had publicly questioned INPE's data suggesting an alarming spike in Amazon destruction and accused Galvallo of peddling lies. So in other words, he's crying fake news. How very Trumpian of him. So understand the Amazon rainforest is Earth's lungs. Jair Bolsonaro is accelerating the destruction of Earth's lungs. We didn't elect this guy. There's nothing that you or me can do about this. We just have to sit back and watch it happen in horror. But you know, usually in these types of situations, we would have our president maybe put pressure on the Brazilian government and say, hey, maybe, you know, destroying the planet isn't the smartest thing since we all kind of want to live here.  He still believes that climate change is a hoax. And he's not even, you know, progressed to the point where he can say climate change is real, but it's not anthropogenic.  It's almost like him and Jair Bolsonaro are antagonistic towards the planet, which doesn't make any sense to me because we all have to live on this planet. We only have one that's habitable. So I mean, this is what's happening. Donald Trump is doing nothing as one of our allies is destroying the planet. Now, thankfully, one country did decide to speak up and the way that they spoke up was to retaliate in the form of cutting funds to Brazil. So Germany decided to cut 35 million euros in funds to Brazil that was intended to help preserve the rainforest. And basically what they're doing here is they're saying, look, if money is what you care about, then you're going to lose money if you continue with this trend of deforestation because we all depend on Earth's lungs to live, to keep our planet habitable.  So please stop. But Jair Bolsonaro's response was pretty much, meh, I don't care. He said, you know, we don't need their money. They can keep their money. So it's not even like it's about the money. It's not even about the money.  He wants to open it up to private industries because he's a psychopath. All of these fascists around the world, Donald Trump, Jair Bolsonaro, Narendra Modi, they are all psychopathic individuals who don't care about the destruction caused by their behavior. They think short term and not long term. And it's just it's, it's horrible to watch because, you know, it's hard to not feel hopeless because what can we do about this? Again, we can't vote him out of office. We can't hold him accountable in the United States. And there's only so much that the citizens of Brazil can do because this individual is an authoritarian figure.  So if they get too rowdy, you know, he'd crack down on them more. It's just, it's disgusting to see, you know, human beings picked a really bad time to allow fascism to rise, you know, for fascism to get its second win when the planet is dying, when we need to act quickly.  I mean, it's never a good time for fascism to arise, right?   I don't know what we can do. There's nothing we can do. We're essentially hopeless. The one country who tried to do anything was unsuccessful. So we just have to sit back and watch and hope that he's voted out in the next election.  How do you not care about the planet that your children will be inheriting? How do you not care that if you get rid of earth's lungs, we're far worse off? How do you care or how do you not care rather that you are accelerating the death of our planet? Like we need this planet to be habitable?  I mean, I don't know. I just don't think that these people thought this through. I don't think that they care because these are psychopaths, not normal people.