Yn y gweithio'n hoffi, mae'n rhoi'n gallu'n sgwpeth yn y gweithio'n hoffi yma. Mae'n hoffi ar y ddiweddol yn y ddiddordeb sydd yn cyfrifio gwir, yn y ddiddordeb yn Y Ugan. Mae'r problemau ar y ddechrau sydd wedi gweld ffawr o ddysunfektion o hyd o ddysunffektio ar y ddysunfektion ar y ddysunfektion sydd yn ddysunfektio ar hyn mawr. The solution was to train some of the staff working at the plant to field trial a testing kit, and the benefits from this, of course, were to ascertain the safety of the water being supplies, but also to develop some thinking around recommendations for the future or indeed the approach to be taken to this specific issue in the future. So the context just briefly goes through. Some of you, of course, will be aware of the intervention or certainly aware of the refugee crisis, refugees from South Sudan coming into northern Uganda and some of the largest refugee camps in the world in the area. We, as MSFOCA, responded in Pallorina settlement, as the camp is called, at the beginning of 2017, due to there was an existing settlement there, but there was a massive influx of people over the course of a few weeks, tens of thousands of people. You can see some of the scenes here when people arrived, and this is where we're talking about. And fortunately, in some senses, the site was reasonably close to part of the river Nile, which you can see in this reproduction of Google Earth image. Our activities, including medical activities, but the biggest gap initially, of course, was the basics. That is food and water. And so we started a surface water treatment project here in this location on the Nile, and the water would be trucked into the camp from there. All the trucks being contracted by UNHCR and Lutheran Well Federation. So this gives a bit of an idea of what it looked like at the time. Significant in terms of the water quality issue that I'm talking about here is that there was a very marshy area upstream from the river. Good in one sense because this gave some filtration to the water, but it also added a lot of natural organic matter to the water. So there was a very phased approach to the intervention. We started initially just pumping and chlorinating the water directly from the river into the trucks. We had, when we first arrived, no equipment to set anything up. It quickly arrived, but that's how it started. Luckily, the river water was relatively clear or clear enough so that we could directly chlorinate. But then in the second phase, we set up a more temporary, sorry, somewhat more permanent treatment system and then moved on to what we handed over in the end to the Red Cross. And this included laboratory within the water treatment plant. We were monitoring both the raw water quality and the treated water quality for a number of parameters. Part of that was monitoring the treatment process itself, which involved the addition of chemical coagulants, then flocculation, sedimentation, and of course disinfection with chlorine as is the standard in this kind of intervention. So water quality monitoring also included within the camp itself as well. So we have a comprehensive suite of data on everything that we sent into the camp. So disinfection byproducts. What are they? I mean it's a big, big subject. It's a big subject of interest and some concern within the water supply sector in every country. Particularly for surface water treatment plants. What we are most concerned about or what we were most concerned about was products called, byproducts called trihalomethanes. And there's just a kind of generic representation there of what those are. And they are formed by the addition of disinfectants and we use chlorine but there are also trihalomethanes produced with the addition of other disinfectants as well. We know some basic facts about those that the production of those byproducts increases with the chlorine dose, increases with the amount of natural organic matter, and then also with temperature, contact time, and with pH. So the health concerns of trihalomethanes is quite obviously there's a lot of literature on this. Like I said it has been, it is a concern in most water treatment operations. The thing for us in the humanitarian sector, it's not something that is looked into in much detail. Part of that is because, and especially for us as MSF, we feel like we're intervening in an emergency. There are priorities in an emergency which go beyond what we might see or what we might determine as risks after extended exposure. So we are talking about trihalomethanes being associated in epidemiological studies with a risk of bladder cancer over extended exposure. And there are considered to be some minor effects from high trihalomethane exposure during pregnancy as well. With respect to fetal growth, there's other outcomes, there's a lot of literature, there's a lot of argument and counter arguments, and there's nothing in any of this that is that conclusive. But it does lead most regulatory bodies national or otherwise to set guideline values and represent here WHO guideline which sets one for 300 parts per billion for chloroform. So that just gives a very brief overview. This reference is there to many studies. So in terms of what we were doing for the water supply, of course as per standard we want to ensure that there is residual chlorine at the tap stand when people come to take the water. Chlorine decays over time in water and because of the nature of the water treatment, the nature of the water that we were using there, we need to set a higher target at the surface water treatment plant. To ensure that by the time the population takes the water that is still the required residual amount at the household level up to 24 hours later. So this is why we were doing a comprehensive range of monitoring at the plant and in the camp. And based on that we were able to adjust at the plant what we wanted to see go into the trucks. So we had a target of 1.5 milligrams per litre of free residual chlorine and out of this represents the results from 322 samples. We didn't do too badly at all and then also in terms of the target at the tap stands it was also not bad considering the quality of the water. The fact that some truck drivers would take the water the night before, sit in the market, not deliver it until the next day, you can imagine. Water trucking is far from an ideal means of delivering water to people. So this had an influence obviously like I said on the production of trihalomethane. It's a reasonably high level of free residual chlorine. So, yeah. And what we decided to do in terms of quantifying better what we might be seeing in terms of disinfection byproducts, we searched around for the appropriate equipment, came across this equipment here produced by HAC which we also found had a good correlation with some of the standard methods that are used in laboratories around the world. It had also we found literature where it had been used as a method in a Bulgarian surface water treatment plant and also in the US in Arkansas as well. What do we find in terms of results? It was not the simplest piece of lab equipment to use but we managed to train the staff to use it well. We found and the results of what we, most of the tests are here, we found that with the standard treatment method that we were doing, which was splitting the sedimentation and the disinfection that we were compliant with below the 300 parts per billion set by the WHO. And even, it's a long story to go into it but earlier on in the intervention we had a different means of treatment which was combining some of the processes and that's where there were likely to be higher risks even then we were compliant with WHO standards. So, what were the lessons learnt? Well, top one I've already mentioned. We know that emergency treatment methods are likely to present more of a risk and that we should move to standard water treatment processes as soon as possible. That part is obvious really. But beyond that we know as well from the literature research that was done into it that this is a fantastically complicated problem. There are many disinfection byproducts and not all of them, there's a few trihalomethanes but beyond that there's many more. So, in terms of recommendations for the future, the first one I have to make and that is that regardless of whatever risks there might be perceived in what is done, the quantity of water provided to people is the most important thing above anything else. But of course working on the quality should come as soon as possible and I think that's what we were trying to do here. We were trying to push that as soon as possible closer to get into those things as quickly as possible. I think and the recommendation that comes from this is that we should be monitoring these disinfection byproducts at these parts that we're running. And we should investigate as well alternative treatment methods which might mitigate the risk of their production. And the last point also is something that we found doing these quite large scale surface water treatment parts in several interventions is that we must always assume that these parts are going to be running for a long time into the future and we know that that will be the case in Palerina. That's great timing. Thank you very much. Spot on.


Siwydfodd, ydych chi'n gwybod am y cyfrifol yn y gafodd y nod? Rwy'n hyn yn ymgyrchu'r cyfrifol mewn cyfrifol, mae'n gwybod. Rwy'n hyn yn ymgyrchu. Felly mae'r cyfrifol yn ymgyrchu. Rwy'n hyn yn ymgyrchu'r cyfrifol, mae'n ei gael y Llywodraeth yn y Llywodraeth Cymru. Mae'r cyfrifol yn gyfgaredd. Rydych yn ymgyrchu'r cyfrifol mewn cyfrifol, O'r hyffordd yn ymweld i'r amddangos, maen nhw'n gweld eu ddweud â'r hyn yn ymgyrch yn ymddangos? Roedd, ddweud, ddweud, ddweud, ddweud, ddweud, ddweud, ddweud, ddweud, ddweud, ddweud! O, ymgyrch yn ddweud. Roedd, yn ymgyrch yn ddweud, yn ddweud i'r ymgyrch i'r hyn. Yn ymgyrch yn y pethau ymlaen, ychydig o'r pethau. Yn ymgyrch o'r pethau, os ymgyrch yn ymgyrch, Onw ydych chi'n fawr ond i'r gaelio fel gyda'i hyfforddiad. Felly, ydych chi i'r cyflenni arfer, yw yn rhani gyda'r gwerthoedd, a nid oedd hyblynedd ag y dyrebu ystauwch yn gweithio. Mae'n wneud gyda hyfforddiad yn yr hyfforddiad a dyna rhai. Mae wrth hyfforddiad bod nid o'r gwerthiau sydd ar hyfforddiad. Ond yn rhani gyda'r gaelio, rwy'n yn ysafwyr, ti'n ddim yn rhani gyda'r gwerthoedd. mae'n bwysig i'r ffordd ac yn ystod yn ôl, ond mae'n bwysig i'r llunio cyfnod. Mae'r ysgol yn bwysig i'r rhop sy'n cael ei wneud i'r helpu i'r rhop ffaith. A byddai'n cael ei gweithio'r rhop sy'n cael ei wneud, ond mae'n bwysig i'r rhop. Felly, mae'r rhop sy'n cael ei wneud, mae'n bwysig i'r rhop a gennaerwch. Felly mae'r llunio'r llunio'r rhop, yn ymwysig i'r sefyllfa o'r llefnod fath, ond mae'n fwynhau i'r gwahaniaeth. Gwyddon ni'n fwy o i'r rhop sy'n ymlaen? O, y ffordd. Fy hoeddi. Felly mae'n rhoi'r gynarych i gyda'r peth ffaith yn llawer o'i llunio'r rhop sydd arall, ac yn ddweud o gweithio'r rhop. Yn y gallu ymddans, mae'n ddweud o'r plannu haf hynny ddjanol, You need to learn the ropes. So that's what this talk is, I'm going to teach you about how to use generics. So hopefully it will open more places on that mountain side while still remaining typesafe. Chapter 1, an unexpected danger. So you're probably already using generics if you use type annotations. Things like this. A list of integers, a list of strings, a list of animals. Mae'r bwrthynau hwn, mae'r cwyrdd ddwy'r cyn أis yn cael ei ddweithio'u ddaeth iawn, felly mae'r ddweithio, mae'r ddweithio hefyd yn ddyddolon. Mae yna brydd, mae'n cyfnodd y gallwn loson i'r ddweithio, oherwydd mae'r ddweithio hefyd wedi gwneud, mae'n ddweithio'n ddweithio'n oed, oedd e'n ddweithio'r ddweithio ar unrhywbeth ac mae'n gofynnydd ar glennydd Let's see how it works. So, here's an animal, we can call feed on it and it's going to say yum. I hope, can people see that at the back? Hopefully. So, now here we've got a generic. So, it's a function, feed the animals, it's taking a list of animals. And then it's looping through calling feed on them. And this is how we call it, with a list of animals. And it says yum yum yum. Now, is this code type safe? There's only one way to find out, run mypy. Yes, it is. Great. So, if you think about it, what's going on here is mypy's... mypy's can tell from unpacking the list that the thing inside it is an animal and then it can tell that you can call feed on it. So, this is going to work, isn't it? Oh. Can anyone see the problem? I hope I spotted it. We put an extra E in feed. So, this is nice, isn't it?  Okay, here's another thing, cat. It's a subtype of animal. Let's feed the cats. That says yum yum yum. Type safe? Yep. No. Argument one to feed the animals has an incompatible type list of cats. Expected list of animals. What's happened? We've been walking happily on our mountain side path and mypy's just sort of tapped us on the shoulder and said, you're not on the path anymore. And we looked down and we're standing at the edge of a cliff or something. But it's not very obvious why you can't do this. I mean, the program runs, doesn't it? In order to understand what the problem is, we need to talk about the list of substitution principle. An object may be replaced with a sub-object without breaking the program. So in our case, an animal may be replaced with a cat without breaking the program. So let me ask, why is this a useful principle? Anyone? Why do we like the list of substitution principle? We're short on time so I'm just going to tell you. Polymorphism. Interacting with different types using the same interface. This is where your code might interact with an object but it doesn't actually need to know the exact type of that object. It just knows the interface that that object gives you, the methods that are on it. So this allows you to do things like this. You can loop through a cat and a dog and you can call feed on them. But it's a different type in each case. This is nice, isn't it? This is polymorphic code. If you couldn't do this, then you'd be doing things like this, which isn't nice. You have to check the exact type whenever you interact with it. So polymorphism is a very good thing that we want to encourage. It opens up lots of nice patterns in your code. But I thought you were meant to be able to replace a cat with an animal. So why won't my pie let us interact with a list of cats as if it's a list of animals? We need to go deeper. We need to talk about variants. Who's heard of variants? Yeah, some of you. It's a bit of a weird idea. It's a concept within type theory and it's a quality of a more complex type, like a list, which describes the subtyping that that list might have in relation to the subtyping relationships inside the list. So, for example, a cat's a subtype of an animal, so you've got three different kinds of variants and three different answers to this question about what the variants of a list is. The first one, a list of cats is a subtype of a list of animals. That's called co-variant. Or it might go in the opposite direction to the subtyping of the components. A list of animals is a list of cats. That's contra-variant. I should say if you don't know this notation like the open-headed arrow means a subtype of. Or maybe it's neither, in which case it's invariant. You can't replace a list of cats with a list of animals or vice versa. So, there isn't a right answer to this. Variance is a design decision. Oh, thank you. Got it. Variance is a design decision for a typing system. So, the Maipai developers get to choose what they want the variants to be. The thing that informs their choice is the thing we just learned about, which is the list of substitution principles. Maipai values the list of substitution principles just as we all should. So, it wants to make sure that you have to adhere to it. So, with that in mind, I'm just going to ask your intuition. We're then going to go through this. But what's your intuition for what the variants of lists should be? Should it be co-variant, which is where a list of cats is a subtype of a list of animals? Should it be contra-variant, where a list of animals is a subtype of a list of cats? Or neither. Who thinks it's co-variant? Hands up. Who thinks it's contra-variant? Oh, yes, someone. Who thinks it's invariant? A few. So, mostly co-variant. OK, let's first of all look at contra-variant, the weird one that one person thinks it might be. So, this is the feed the animals thing. Just for the simplicity, I'm saying, this would mean a list of objects, objects for a supertype of animal, a list of objects you can replace with a list of animals. So, let's pass a list of objects to feed the animals. What's going to happen? That is not going to work, is it? So, you can't substitute in a list of objects for a list of animals. Thank goodness, MyPie does not treat lists as contra-variant. It wouldn't be a very good typing system, so it's not. So, this is what most of us thought, but actually, MyPie's already told us that it isn't co-variant. It's already said that a list of cats is incompatible with a list of animals. That was the problem with our code, is list is not co-variant, but why not? Let's get a dog in the mix, we've got cats, and let's have a function here called increase. This is a bit different because it's changing what's in the list. It's going to add a dog to the end of this list of animals. Now, is this type safe? It is, yes, it's fine this. It's fine to add a dog to a list of animals. A dog's an animal. But what happens if we do this? What happens if we pass a list of cats to increase? There's now a dog in a list of cats. That isn't fine, is it? Dogs are not cats. So, this is fundamentally why lists are not co-variant. It's because they're mutable. It would be fine if they were immutable, but the fact that you can potentially put other subtypes in means that it just wouldn't work. There's actually, interestingly, quite an easy way to get the type checker to pass on this. You just annotate animals to say it's a list of animals. What's happening under the hood is, is looking at this list of cats, or this list with three cats in, and it's inferring the type from it. It's saying, that looks like a list of cats. And you're saying, I know it looks like a list of cats, but it's actually a list of animals. It just happens that there's three cats in.  It kind of makes conceptual sense, doesn't it now? If we run my pie on it, it's completely happy. So we just needed to annotate that to say, well, this is the exact type that's being passed in. Anyway, lists are invariant for this reason. And that's the case with other mutable collections such as sets. What about immutable collections, like a tuple? Let's adapt our code so that it takes a tuple instead of a list. It's going to run the same, but my pie is going to be happy with it now. So tuples and other immutable collections are covariant because you can't have that thing of adding the wrong type to it. Incidentally, this is a good reason to use immutable data structures over immutable ones. They'll type check more easily and it's more flexible. We're going to look at two others. Return types first. This animal finder returns an animal when you call find on it. So let's subclass it and then look at what we're allowed to do with the return types of these. So the cat finder finds a cat. The object finder finds an object. So if return types were covariant, we'd be allowed cat finders. If they're contravariant, then we'd be allowed object finders. Or maybe we're not allowed either, in which case it's invariant. So again, let me get your intuition for this. Who thinks return types should be covariant? Okay, a few of you. Who thinks contravariant? Even fewer. How about invariant? Okay, more, but I guess it's quite difficult to think about this stuff, isn't it? But I'll show you how. You can just think through it from first principles quite quickly. So let's first of all look at cat finder. We want to find out if we can substitute the subtype for the supertype. So we want to see if we can interact with a cat finder as if it's a supertype, an animal finder. And if we can, then it's type safe. So we've got a finder here. It just so happens that it's a cat finder, but it's an animal finder. When we call .find on this finder, it should give us an animal because that's like the contract of the supertype. Does a cat finder give us an animal? It does, doesn't it? It's actually fine. That is type safe. Let's look at object finder as well. Does an object finder give us an animal? Guaranteed. People are shaking their heads. An object isn't necessarily an animal. So that is not okay. So return types are covariant too. Actually quite flexible. You can narrow down your return types in your subtypes. Final one, argument types. Passing in. I've adapted the feed method to take in an argument food. Let's look at two options for our cat and the kind of food it likes. Maybe it's more picky. It must have cat food. Or maybe it's less picky. Maybe you can give it any kind of objectily anything. So that would be covariant. Hopefully you're getting the idea now. That would be contravariant with broadening the type that gets in. Or invariant. You're not allowed to do either. Last question, I promise. What's your intuition for this? Who thinks it's covariant argument types? Okay, a few people. Contravariant. About the same number. Invariant. More. I think most of you are keeping your hand down. Probably sensible. Let's think about it. Same principle again. We've got a cat. But actually, we want to interact with it like it's supertight, the animal. That means you can feed food to animals. It's not going to error. So can we feed food to the cat on the left-hand side? No, people are shaking their heads. We've narrowed it down by subclassing it. So we've kind of restricted the interface. So we can't any longer interact with that. So we can't do that. That's not safe. How about on the left? Can we feed food to the cat with the object? Is food an object? Yes. A couple of people nodding their heads. Weirdly, that is all right. It looks wrong, doesn't it? But it is actually type safe. So who would have thought argument types are contravariant? You can now start saying that to your friends. They'll love it. Okay, we're ready. Armed with all this theory to learn about custom generics. So I don't know about you. It feels like you should be able to do this, shouldn't you? Even if you think it through and understand the reasons why the type checker won't let you do it. You can imagine situations where you might want to narrow down the type. It feels a bit of a shame. What if we don't want certain types to be substitutable? What if we don't want a cat to be an animal? What happens if we're just using that animal superclass as a way of sharing code? But actually, you don't really care about polymorphically iterating over cats and dogs. And we're doing something different with our code. And if you think about it, we sort of already got this. So here's a picture of the inheritance of a list of objects with a list of ints and a list of strings. If you were paying attention earlier, you'll know that that is not true. List is invariant. You can't subclass it like that. So this isn't really how lists are made. Instead, we have lists as a generic. This is sort of non-standard notation, but I've sort of just used it to sort of say it's not really a supertype. It's more that it's just a type that's kind of floating out there and it's not a type at all yet. It's just a way of writing some code that then a type can make use of. So why don't we do this here? We could have this idea that we want. We want to model the idea of different cats and dogs, different animals being picky about different foods. So maybe we want to make animal generic, and then when we have the subtypes of animal, we bind them to a particular food that they like, cats like cat food. Dogs, they're less picky, they'll eat anything, even cat food. So this would be nice. This would be nice. Here's how to do it. It's all in the standard library. You have a type variable. It's called type var for short. And you might say, I don't like your variable naming here. T is a bit rubbish. Maybe so, but this is kind of the convention for naming type variables. So you just name this in the global scope. Typically you call it T, capital T. You give it this string T. It's just the same name as a variable. I do not know why you do this. Optionally you can bind it to a type that you want the type checker to make sure is passed in when you pass in a type to this variable. You'll see what I mean in a minute. Then you import generic, and so you inherit from generic in your generic class over T. So that T that you just defined in the module scope, you're going to then pass into square brackets, and you're saying this is the T that is then going to crop up elsewhere in the type annotation in this class. So you can see there we've removed food, and now it's that same T as the type that's coming in. OK, so that wasn't very much code, was it? Now, is this code type safe? Let's run mypy on it. Oh, need type annotation for animal. This is actually what we want, isn't it? We don't want animal to be a type. It's generic. It floats around. You can't do anything with it. It's just some code. So what mypy wants us to do is bind it via square brackets to a concrete type, and then it's going to become a concrete type itself. Let's do that. Let's make an animal and let's say this animal only likes cat food. Now, will mypy like it? No, but that's good because we're feeding it the wrong kind of food, aren't we? Argument one to feed of animal has incompatible type food, expected cat food. This is a good sign, isn't it? I'm going to give that a smiley face. Let's just check it works. Let's feed it the right thing. Yeah, it's happy. OK, now you don't have to do this square bracket stuff all the time. You can just do it when you create the subtype in the first place. So we're binding the cat food to the generic, and then inheriting it in one step here for the dog and the cat. Now, looking inside the cat, well, not literally, hopefully, we've got cat foods here, and these are kind of mirroring the generic type that it's inheriting from. It's sort of a mirror image of it, if you see what I mean. If we run this, mypy's going to be happy with it. And the nice thing is, is once you start doing this, you even find your IDE might be able to tell these things. This is PyCharm. I just started typing this and it just told me. I know this cat doesn't like cat food. That's quite cool, isn't it? So in summary about custom generics, if you've got this kind of inheritance relationship, sometimes you might identify that actually you don't really want to be able to substitute B and C for A at all. And you've just got some code that you want to share between B and C, in which case you might consider, oh, I don't have an animation for that, you might consider making A generic. That's basically the idea. Okay, we're ready to try and get a bit real now. Finally, in the case study. So I work for Kraken. We're kind of similar. Octopus Energy is an energy company, one of the biggest in the UK. We're opening renewable energy companies around Europe and the world. And our product for running the energy company is called Kraken. It does things like taking me to readings and sending people bills. And one of the challenges we've had is that the behaviour across different Kraken's around the world, there's a lot of shared behaviour, but there's also quite a lot of differences. So for example, customer registration, the model of a customer is a bit different in Britain, Italy, Japan. There's some similarities, but there's some differences. For example, in Italy you've got this idea of a fiscal code which the other ones don't have, but you need it to create a customer. And what we found is that how do you do type annotations for this?  Because you can't like... Oh, sorry, that's right at the bottom. Basically it's just a star-star quag's any. And yeah, it's not very good. I'm going to put an invisible unhappy face that the front row can see. So if you think about it, it's like how would you type annotate that? How would you type annotate somehow if you've got fiscal code coming in, but only for some people and not others? And so we sort of developed this pattern called engines and contexts. So first of all you've got this idea of a context, which is like a data class which has all the data inside it that everyone can extend and put their thing in, like the fiscal code. And that plays with an engine which they can also extend, and it's got a hook for saving the custom context. And then this is how you interact with it. So you call this register function with the engine and the context. That's got the fiscal code in there, but all the rest of the stuff is like standard. I'm going to move through this bit quite quickly because I don't have much time, but basically that's what the register thing looks like. It gets the context and the engine. The registration engine is just a stub that you can use as a hook. And the registration context is just a data class there's a data in. This is the interesting bit. We subclass our registration context for Italy with our fiscal code and we subclass our Italy engine to take the Italy context and save the custom data. So let me ask you what's the problem with this design? Does anyone know? I'm just going to have to tell you because I don't have time. Argument types are contrarian. You can't do this. It's not type safe because you can't interact with Italy engines polymorphically with registration engines. My pie doesn't like it. So what's the answer? What we can do is we can say, well we don't care about polymorphism between these engines. We can make registration engine generic and pass in registration context as a type var. The basic idea is exactly the same as what we did with animals. So we make our type var binding it to the registration context. We subclass generic of T with the T there. Then we subclass Italy engine with the Italy context. I mean you're probably not going to remember all this but you can look at the slides later. There's a little bonus that you may put some T's in the entry point function as well. And we run my pie on it and it's happy. And if my pie's happy then I'm happy. So let's reflect on what we've learnt. Static type checkers are an amazing way of detecting errors in our programmes, silly mistakes, but also subtle breaches of the list of substitution principle that cornerstone of object-oriented design. And they're great but they can sometimes get in our way. And if we don't want to substitute things then we can maybe consider a generic instead. They're a bit harder to use but if we learn to use them we can open up new and exciting places on the mountainside whilst still remaining type safe. Thank you. Thanks David for a really nice presentation. So we have time for a quick question and answers. The microphones are on that side of the room. So if you can kindly just come there and if you have any questions that would be nice. I'm not that tall. My talk was great. I kind of feel like some of the issues that my pie detects is because it doesn't have all the information that a typed compiled language would have during compile time. So we are only doing some of those things because we don't have those things and my pie can't be smart enough. I think that so statically tight languages usually have generics for this very reason. So when you... I don't really work with many... I've been doing a bit of Rust recently for example and you absolutely do have generics all over the place with Rust. I think that you need generics. If you don't have generics and you have statically tight system then you're going to be quite annoyed. You need them really. Hi. Great talk. I wanted to ask when you're supposed to use new type because I've tried to use a new type to try and fix some of these my pie errors and it's gone very badly. So I wondered if you could explain. Maybe I've not used it. How do you say it? It's like from typing import new type. Okay. I don't actually know what it is. You can show me the dots afterwards and we'll chat about it. Nice. So I think that would be the end of the session. We have a Discord channel where we can still communicate regarding the session which will be North Hall, the name of this room. So thank you all for joining and let's have round of applause for David and have a nice day.


What's going on everybody? Got Collin and Shawn here with Layton Sports Cards. We are ripping. This one is going to be 2022-23 Penini Flux Basketball, 6 box number 11. Got Andy F with Pelicans. I got Anthony P, Nuggets, Pacers, Thunder. Chun Wei has the T-Wolves. Dallas P has the Jazz. We've got Dan C with the Celtics. Donald T has the Clippers. Fernando S with the Bucks. Gary H has the Bulls. Get It Shipped, 9-2-7 has the Mavs. We've got Harold V with the Grizzlies and Hornets. James L has the Pistons. Jason B with the Heat. Jason T, Nick's. Got Joe M with the Hawks. Joe M with the Nets and Rockets. Joseph D has the Cavs. Got Matthias N with the 76ers. Paul E with the Magic. Richard D has the Raptors. Got Robert P with the Blazers. Rory C has the Kings and the Wizards. Samuel P has the Warriors Lakers. Tira P has the Sons. And Tom B has the Spurs. Righty guys, good luck here. Let's see what we got. Just one spot left on the night. Just Clemson left in Full Case Bowman University. Oh, Mike Piazza. Nothing wrong with that. Yeah, sounds like you got a good bit of cards to go through for sure. From the purchase. Righty guys, box one. Pizza man. Pizza man. Mike P has a high school student taking VP. No. He knows what's up. He knew he was the one. Any of those catches that can hit, man? It's Max Christie on the rookie. Got Ben Simmons on the blue. That one's to 99. And a Fluid. That one's KD for the Sons. 39 for Lily. That is good. That is good. Oh, I got you, Brandon. Yeah, just saw. I got you. I got you. Take a look at it in a second. Jake LaRavia got Silver Jay Chantate. And rookie influx is going to be Ricky Rubio. Just a Julian Champagne rookie for the Spurs. That one is not numbered on the Champagne. Orange and yellows are not numbered. Incoming is Murray. Down on top load. I'm about to break it. He's about to break it already. Muchavich rookie, Marjon Bochamp, Silver Kelly Olenek, and D'Aaron Fox. Get the echo back. Got an Otto Simone. Look, it's, you know, on the Equinox Red for the Jazz, the 35. Nice one there for the Jazz on the rookie auto. Got a rookie Paolo Banquero and Silver Terence Man. It's toggling the jack, the, um, toggling the echo. Oh, no, I made it. Curry got a Silver Rookie, Dale and Terry. Triumph of Embiid. Dude, I watched him play GM on the GM Golf, that grand kid, but he played them. And it was cool to see. He's a big time golfer, that kid. Who do you play? Reeves. Oh, Reeves, really. Yeah, nice. Big time golfer. Good. Yeah, it was pretty good. Malachi Branna. I've got a Mitchell Robinson. That one's for the Knicks on the purple, the 75. We are sold out. Thank you guys. They are sold out on the night. He said no. Yeah. Okay, Jayden Hardy. Yeah, Nicola Vuchovic on the purple. And it's the 75. I mean, you could definitely do that. It's just like, I don't know why I can't get it. Yeah, right. I don't know why I can't get it. Eventually it starts hitting right, I guess. Oh no, man. Ricky Marjant. Bo Champ. Silver's Lebron for the Lakers. Lebron. Let's go. Go golfers, baby. Here you go, Greg. Got a Jaylen Ramsey back this weekend. Go Noles. Jaylen Ramsey back. Noles, too, baby. Oh, Shayabaj. You got a Silver Clay and Kenneth Lofton Jr. on the rookie. Kane's thing. Yeah. Yeah, that game, they blew was crazy. Jesus. That was one of the worst. I got my bow. Really? I think Kane's guy might have destroyed his home. I should talk him down. Probably go to Crystal Ball's home first. Yeah, that's fair. The rookie, Focatino, got a Trey Jones on the blue. That one's the 99. Trey Jones for the Spurs. There's Lamello. I appreciate you guys selling us out for tonight. We'll have a little bit of room for personals as well. Haven't checked that a little bit. Let me open that up. I know a couple came in for Kyle, some Star Wars. Let me see what we got. So, yeah, I got about, looks like a lot of 11 boxes or so. No, eight boxes. Eight boxes. So, not a ton of space. But if anybody does want to get a personal go and can do that, probably tonight. I'll get that going here a little bit later. Silver rookie is Andrew Nimhart for the Pacers. Got a Fluid of Dirk. Little behind schedule, but we were only scheduled until midnight, so we'll have some time. A Silver Kevin Porter. Triumph of Clay. Exploded on me. Yeah, bucks not looking good. Bucks not looking good. There's a Carl Anthony Towns on the orange and yellow, not numbered. Cats for the T-Wolves. And Tarry Eason. That one is the blue and purple. Rookie Tarry Eason for the Rockets. I like what you're picking up, Blaine. I'm seeing a little bit of what's going on. I'm liking it. What up, Rod? I'm liking it. Ooh, nice pillow on the red, not numbered. What's up, Rod? How are we doing today? There's a Jake LaRavia influx. Silver Luke Canard. There's a rookie influx of J. Dubb. Keep Peyton Watson. Got a blue. That one's going to be Herb Jones, a 25. For the Peleys. Got a Shaden Sharp Titans. Silver is Siddiq Bay. And Darius Garland for the Caps. I got you, Lane. No worries. Like I said, man, we're full. We're good to go. You take as many emails as you want. Jaylen Durin on the rookie. And a blue, Karis Lavert. That one's for Cleveland in 99. Incoming Ben Matherin, Silver Rookie. Matherin is a great player, man. I think he's going to be 20 points a game guy easy. Really? Yeah. Last year, he was coming off the bench, and he was putting up like almost 20 a game every time he came in. This year, he's starting. I think he put up 18 last night. Ooh, hot stock signatures to 10.  Home grand. Boom. Okay. Thunder. Okay. That one's going to be Anthony P. Mag that for you, sir. Hot stock signatures of Chet. Two out of 10. Boom. We will take that, sir. Very nice one there for you, Anthony. Get that right in the mag. Very nice, sir. Right behind it, Silver Rookie Peyton Watson and Yokech. Alrighty, that'll do. That will do for the Thunder. Nice one there, Anthony. Very nice, man. That's Lane's boy. That is Lane's boy. Got crossed up by Drummond last night, though. You saw that? Drummond crossed him up. Drummond. He took him to his, took him to his, like, into the floor. He dropped him. Really? Drummond. Come on. Yeah. Yeah, exactly. That's what happened to Jake for sure. We could go today. Johnny Juzang on the rookie Rhett, not numbered. Incoming of Sohan. Very nice one there. Yeah, he was not, he was not looking great. I mean, I figure he'll figure it out, but definitely not looking great last night. Yeah, right, exactly. Silver's Handles. Known Crosser. The Silver D Book. Andre Anklebreaker Drummond. Exactly, man. The Harlem Grobetrotter, the Carl Anthony Town Silver. There's a Keegan Murray. Crazy. 4-2-4-D. It's a rookie Kenny Chandler and a blue Jalen Durant to 99 and rookie Influx Apollo. The only reason I saw that is they had a weird ESPN post about it. It was like him up top. There was the play up top and then him on the bottom as like a interviewed after. They're like, do you have anything to say about the Andre Drummond? He goes, no. I was like, is that really a post? Like, do we really need to, you've essentially said no, I don't have anything to say. Rookie Nimhardt Silver. I was like, is this really a post? Low motion, Paolo. Literally just said, no, I don't have anything to say about it. I was very confused by that one. Silver, Nick Claxton and a Max Christie Silver. Michigan State Legend. Spartan Legend. Spencer and Jace. Spartan Legend, Max Christie. There is a Bones Highland. Now it's going to be autographed Influx for the Clippers. Nashone Bones. Got a Orange and Yellow, a Butchovich, and Fluidja. Alrighty guys, again, we are full for tonight. Appreciate everybody helping us fill up. We got Sammy coming in in the morning. Let's go, baby. Some more group breaks and we got Sean, or not, Rich. Rich on fanatics in the morning. Rich on fanatics. Johnny Davis working in 99, got a Topps Chrome Black Star Wars coming out tomorrow. When the curtains part. No time before that. Silver of Mitchell Robinson. Rookie Influx. Jaylen, how you doing? I'm about to go to the radio house. Walked in in the morning, I let him in, I closed the door and he was like, bro, I'm not going to move because I don't know where anything is at.  I'm not moving. Do you live in a cave? I'm actually living in a cave. That is awesome. I don't care if it's 2 p.m. or 2 a.m. You don't know the difference. Sean lives in a cave, dude. I like it, though. Yeah, I need a little bit more. I actually have a little bit of tape on my blinds. Get him a little more closed. Got some tape on there.  Trayman Silver. There's a J.Dub, Rookie Influx. Saps my landlord so I'm not worried about messing up the walls or anything. Saps not watching, I'm sure. There is no way a speck of light is getting through. No chance. Not even a bullet. Franks McGowan. Got a Cam Thomas on the orange. That one's the 49. Nets. Fluid Yolkich. Geez. I love it. What happens when you go outside? You ever have to go quick outside? It's easy. Yeah, slowly open the curtains. Yeah, play Thompson on the red. Just open it like this. You'll be like, ah. Oh, man. Yeah, you gotta just drop it and turn it away for a minute. Let it all adjust. That's why my mommy used to wake me up if I didn't wake up for school. Yeah, just, oh yeah. The sun was right there. I was like, ah, man. Galoko got a silver vassal in Jaylen Williams. You didn't do it yourself, so I'm getting you up. There's a Bobon Marjanovic. Nice one there. Autograph Influx, the big man for the Rockets. Guy from the Goldfish commercials. Yeah. Bobon, Silver Fred Van Vleets, and Fluid Curry. Oh, you want it? Yeah, I'm gonna have to take a look. Last one I see is a Jeter. That sounds pretty sick, too. Oh, wow. That Jeter's pretty sick, too. Not there yet, but Monty Morris, Silver, and J. Dubb incoming. Yeah, I'm gonna take a look, Lane. I'll take a look. Should come in through in a minute. A D. Anthony Melton on the purple. That one is the 75. Philly, got a Shaden Sharp Rookie Influx. Rookie Silver is Musa Diabate, Trey Young Flow Motion. I like it, Lane. That'll work for sure. I like it, Lane.  Silver D'Angelo Russell, since we got no autos, I really like that. Luca Donchich on the Flow Motion. I really like that. Keep it going here, guys. Again, we are all sold out. Appreciate y'all. We have a little bit of room for personal. It's probably not a ton of space. Got a few already lined up. Like I said, we'll have Sam in the morning ripping group breaks and Rich over on Fanatics Live in the morning. Yeah, I saw the CJ. Yeah, yeah. Oh, yeah. Today, Red Patrick Williams, Go Nolts for the Bolts. Pat Will. Crazy how many guys for the Nolts didn't even start most of the time, like Scotty didn't start like almost his whole time. The Nolts, Pat Will didn't start most of the time. Say Rookie Max Christie, they just had the potential. Devonte Graham and incoming Jay Nivey. Yeah, I saw that one, Lane. I'm a fan. The kid is good. Silver Spencer Dinwitte, got influx Jay Will. LaRavia, there's a Yo-Vitch, Nikola Yo-Vitch for the Heat on the Orange of 49. And Rookie influx Silver is Usman D'Ang. Every time I look, the bills have the ball, man. What is going on? I'm in care of Rookie, right? There's a Purple, Ice Cocoro to 75. The only pass I've seen Baker throw is that overthrow in the first quarter. Yeah, the overthrow, that's it. Is, wow, for the Knicks, best of the best auto. Carmelo Anthony. I don't do. Nice one there, Knicks. Just got back to signing cards. That'll do. That one is for Ryan B. Very nice on the Carmelo. Sunsets, stay mellow. Stay mellow. That's how he signs his auto always. Got a Silver, Doreen, Finney, Smith, and Triumph of Steph. Very nice one there. Carmelo just got back to signing cards, man. I know they saw, they got Tim Duncan signing cards now too. Tim Duncan, first time in like 15 years or something like that. Bochamp got a Kyle Lowry on the Orange to 49. And Jabari Smith, Rookie influx. Rookie Silver, Kevon Harris, Magic. The first Rookie Kevon Harris I've seen. Come on, Bucks. Christian Brown, there's a Silver of Dilma Sabonis. And Kyrie Irving. I honestly think that Demona Sabonis trade, the Magic, might be the worst trade, worst Draft Knight trade in NBA history. Given Sabonis and Oladipo for Ibaka. That was, that set us back like probably about six, seven years. Naji Marshall and Silver, seriously. Fluid of Jeremy Sohan. That was a mess, man. If we had Doma, oh man. I would be thrilled. Alrighty, guys. Box number six here. This is break number 11. Pick your teams. Here's a Red, Anthony Davis. A.D. Rookie influx, LaRavia. One more. Silver, Reggie Bullock. And Jaden Hardy on the Rookie. Silver is Aaron Naismith. And Rookie influx, J.Dub. Marker Kessler. Got a blue, double out. Niko Okanguda, 99. And a Darius Garland. Silver, Okoro. And Blue and Purple is not numbered. Donovan Mitchell. Spider there for the calves. Short printed. Rookie, Keegan Murray for the Kings. Silver, Marcus Morris. And a Silver of Dame. Dame time. A Orange and Yellow not numbered. That one's Ayo Dasumu for the Bolts. Clay Thompson. Oh man. Jaden Hardy on the Rookie equinox. I don't know. Nice one there, Dallas. Jaden Hardy, the shooting guard. Got a Silver, H.A. Griffin Rookie. And a flow motion. Boba and John Wick, Chapter 3. I don't know. I never saw John Wick, Chapter 3, honestly. Silver, Jeremy Grant. That was the, had like a different name to it, right? Wasn't like a, I think it was like an extra word on there. Oh, I don't know. I don't know. I was just saying I hadn't seen John Wick. Silver Rookie, Jeremy Sohan on the back. Bofa though. And we do know Bofa. Yeah. Alrighty guys, do a quick hit recap. Just the autos on this one and we'll get going on number 12. Another six boxer. We had Jaden Hardy on the Rookie equinox auto maps. Had best of the best for the Knicks. Stay Mellow, Carmelo on the base auto. Had Boban Marjanovic for the Rockets. Had Bones Highland for the Clippers. To, which one is this? To 35, we had an equinox Rookie Simone Funkatino and to 10. Big one there, Chet Holmgren on the hot stock signatures. Two of 10. Alrighty guys, take a quick, a quick picture of that one. We'll get going on number 12.


So my beautiful people, I am back with another hour of rigging video and today guys I'm going to showcase to you how you can get this exhaled armour set. How's it going guys? My name is dpj and if you do enjoy the video, leaving a like really helps out and if you like what you see and want to see more be sure to subscribe. So this is a well a kind of all-round set in my opinion. You can see it's got stats here, stats there so it's definitely for somebody out there. It's just experimenting with a build for sure. Now to get this is relatively straightforward but you do have to be a margy who is one of the first main bosses once you hit Stormvale Castle.  So once you beat Margy you just come around guys you followed her to the main gate and then it's basically the next grace point you can hit. You can't really miss it to be honest.  Come and activate this. Now there's three adds or enemies at the top of this hill that you just want to quickly go and kill and all of them have a chance to drop this exhaled armour. So what you want to do is run past them like this. Well hey you didn't see me. Never mind it doesn't matter. There we go and then just take them out one by one. They should as well just come in normally they gang up on you but it doesn't really matter if they don't. Just still take them out one by one. Come on boy. And then they all have a chance of dropping this set and it is as simple as that then what you want to do guys is just run back down the hill go back to the campfire and simply just reset it. It really is that easy guys. Well yeah just sit down stand back up rinse repeat rinse and repeat but I got it all in about 10 minutes. I got actually I killed all three of them at the same time with like one below and I had two pieces drop so yeah. So it's like I said these guys are quite easy and not even they don't want to hit hard or nothing so you should be relatively fine. I mean you can take out Margie you should be able to kill these pretty easily. So just keep doing it guys rinse repeat back down the hill. Tina Grace got my cop kill them rinse repeat guys and that is it now guys if you enjoyed the video leaving a like really helps out if you like what you see and want to see more out of the ring be sure to subscribe and hopefully people I will see you on that next one