Hi and welcome everyone to this session on type 4 development by Tony Morris and we're so glad you could join us today. Thank you. I'll just share my screen. Hello everyone. Thanks for coming along and sorry I can't be in India. So I'm here in my home office in Brisbane Australia. And my plan this evening or this evening for me is to talk to you about your 30 countries. That's pretty cool. Talk to you about just some workflows in solving some problems, some programming problems in this case using the Haskell programming language. So my plan this evening is to just because you know we're online and so on.  So these problems that you see here there they're available on GitHub. And I think there's a link there available if not just let me know. And what I'd be really I can see the chat we're having chat problems early but I can see that. So what I'd really like to do is if anyone has any questions along the way. You know how do you solve this or why this or anything please just put it in the chat. I'd be happy to take those types of questions as we go. Okay, so we're on a pretty limited time budget. And so I'm going to talk you through some problems. One option by the way is, you know, because I'm not there I don't really know your skill set for each of you in the audience some of you may have never seen a problem like this. Before in your life. So I'm going to start from the start. Maybe you want to see a bit of a hard problem as well. That's no problem just let me know and I'll skip over to that. Not hard but harder. So just to give you a bit of a rundown of what we're looking at here. We're looking at a GitHub repository contains a bunch of exercises. These exercises I developed with a bunch of other little few other people about 16 years ago, I think it was needed to build over time and you're looking at where it currently is. It's written in the Haskell programming language. So I'm going to assume to be that you're not familiar with Haskell. So I'm going to talk you through that a little bit. That is the repository that someone just asked. That's the correct one.  If you get any questions along the way, please let me know. So what you're looking at here. So that this is on this line here line 14 to 17. I'm just going to explain to you what this is this is saying here. So this data keyword. What we do with the data keyword is we define a data type. No different to if you're familiar with Java or C sharp or anything like that. You define data types using the class keyword but in Haskell use the data keyword. And following that we have the name of the data type. So in this case the name is optional. And then we have what's called type parameters. After the after the data type name. In this case, there's only one type parameter. I'll call it a. So this is the data type name. And one type. Follow by equal sign. And then we have a list of constructors. These are called constructors after this. So the constructors are followed by the pipe sign. Sorry, there's pipe sign six in between the constructors. This constructor here. That's to say the name of the constructor being full. And so we put the constructor name and follow by that we put the, the arguments that go into that constructor. So like I was talking about before, Java and C sharp constructors in those languages have to have the same name as the data type or the class. But in Haskell that's not necessarily true. So we have this constructor full with one argument. And then we have this constructor empty that and empty has no arguments. So if we just kind of, let's just develop a little bit of an intuition for this data type. So I, when I say type parameter, you can think of it as like a generic or it's just saying optional of anything. It's, it's, it's a, when we fill out the type for this data type, it will be substituted. So just like you can have a list of integers, we could have an optional of integers. A stands for the integers part. So it's just saying anything. We can construct it with full. And when we do, we have to pass in one of those A's, or we can construct it with empty, in which case we don't have to pass in anything at all. It'll just make one. So one, one intuition or one way of thinking about this data type is optional is a list of A's. However, it has a maximum length of one. So that's one way to think about this data type. So it either has one A or it has no A's. So that's just one way to think about optional. There's other ways to think about it, but that's, I find that a pretty useful way. It's a list of A's with a maximum length of ones, or another way of saying that is it has zero or one A's. Now onto the type whole development sort of theme. Pardon me. I'm going, so that's the data type there. There's no exercise there. The first exercise to look at is this exercise here. I'll just have a quick sip. And the problem with this sort of notation is it's quite simple in terms of its concept, but the words when you try to explain it, it doesn't sound simple. It's always been a bit of a puzzle to me is how do I explain this so that it comes out simple. So I'll try my best. So you may think of this. So map optional is just a function name, just like you might think of functions in any other language. Double colon means has the type. And we're saying that map optional has the type and there's the type there. It's that big expression there. And the way to read this is we are first past a function and that function turns A's into B's. And then you pass an optional of A. And don't forget what optional is. It's a list of A's with a maximum length of one. And then it returns an optional B, which again is a list of B's with a maximum length of one. And our goal here is to solve this problem so fill out a function that has this type. So first of all, we're going to delete this and feel free to follow along on your computers at home or wherever you might be to solve this problem. But when I solve this problem, and like I said, I'm going to solve this problem as if I've never solved it before, I'm going to show you the tools that I think would be really, really helpful if you came across a problem like this before that you've, that's unfamiliar. And so I'm going to pretend that I've never seen this problem before and I'm going to use those tools to solve it. So first of all, is the first thing I do is I simply just delete that. That was just a placeholder for the exercise. And at this point, you might ask yourself, well, maybe you might say, look, I'm just totally confused. I wouldn't even know where to start. And the key tool. So you might have a little bit of a clue of where to start or you might just have none at all. Now, if you have none at all, there's just absolutely no idea where to start. You simply go for the underscore. All right, so you go for the underscore. Okay, you just type underscore. And then I'll just back up here a little bit actually. Okay, just to give you an idea of what. So here I am in the repository and I just typed GHCI. Now, in this case it won't, it won't, hang on, I'm just going to type GHCI and then I'll put the underscore in. And so I'll put the underscore in and I've just said, look, I have no idea where to start on this kind of problem. And so what we want to do every time we make the changes, we want to reload. Okay, so colon reload at GHCI. And when we reload it says, hey, you know what, this doesn't compile. All right, it doesn't compile. And I'm just scrolling up here. And what an underscore denotes, it's called a type hold. All right, so we said anything starting with an underscore is a type hold. And we just said, look, there's a hole in my code. I don't know what goes there. And this error message that you see down here is basically really trying to help you out to solve what goes into that hole. And it says, look, I found a hole and there's the type of the hole. You need to put something that has that type, right? Because we know that that's the type of our expression here. You need to put something that has that type into that hole. Something needs to replace it that has that type. So that's tool number one, which is just underscore. I have no idea, underscore.  I'm going to ignore those. Some of those are actually the answer. Sometimes it does just give you the answer, but I'm just going to ignore those. So we're just looking at the type hold here. Now, the second tool I want to give you is you see a type hold and it says to you if the type of the hole is a function, which it is, right? And it's a function because you can see that there's these arrows here. So the second tool is if the type of the hole is a function, then what you need to do is replace the type hold with backslash. So backslash means lander in Haskell. And then you need to give it a name. And I'm just going to give it a name or F or Fred. And then you type arrow and then you type underscore again. And you simply just do this mechanically.  And we're going to have a look at the hole again. And it says, look, I found another hole in this time, but this is the type of that hole. So the type of the hole has changed. You know, it doesn't say this at the start anymore. So the type of the hole has changed. But the type of the hole is still a function. So I'm going to use that second tool again. I'm going to replace that type hold with backslash and then arrow underscore. I'm going to do that mechanically. And then I'm going to reload yet again. And now I'm looking at a type hold. The type hold is, well, it says it's anything of type optional B. So it's not a function anymore. So it's not a function anymore. We need to put something that has this type in that hole. I need to substitute some value that has that type into that hole. So, you know, I'll show you a couple of other things that will help you with. So the next thing it will show you is something called relevant binding. So relevant bindings are simply things that have values that are available to you. These might help you solve this problem. And it says, well, there's X and so there's X there. And X has that type optional A. And then there's F, which has the type A to B. And then there's myself. So the function is trying to solve. Maybe it needs to be recursive. I can tell you it doesn't need to be recursive. So relevant bindings is saying, hey, maybe these things will help you fill out this type hold. And then the other thing to look at is something called the valid holds fit. So what this is saying is it's saying, if you type this, if you put this thing into that hole, it will work. It will compile. Sorry, I should rephrase that. It will compile, but I don't know if it will work because the compiler doesn't know exactly what we're trying to solve, but it will compile. And if you have a look at this valid hold here, it's empty. It's saying, hey, if you just put empty there, it'll compile. But maybe that's not what you want. It doesn't really know that. We'll just scroll there. And just to demonstrate that, I could just put empty there. So empty, and then I reload. And it says, hey, everything compiles. Everything's great. Now, however, with this particular problem here, this is actually not the solution that we want. So there's some tests up here. So I'm going to copy and paste this test. There's a way to run the test, but just a quick dirty hack is to copy and then paste. So I'll paste the test in a GHCI. I'm going to run it. And you can see it didn't give me the same answer. It said empty rather than full nine. So basically what we want this function to do is, if this optional, this thing here, this X is a type optional. X is a type optional. If this optional has an A in it, so it's full, then we want to run this function on it. We want to add plus one to the eighth and get back nine. So what we want to do in this case is, we want to examine the optional and we want to say, hey, look, which constructor were you constructed with? Were you full or were you empty? We want to pull apart the optional, this X here. We want to pull it apart and say, hey, which one of these two things are you? So that's not the correct answer. It does compile, but it's not the correct answer. And the way you pull apart a data type is you do what's called pattern matching. Now, the quick dirty way to do pattern, there's a number of syntaxes to do pattern matching in Haskell, but the long-handed or just, you know, if you just don't want to think about all the other ways, is you just type case X of, okay. And just to get going. So when you say case X of, you're saying, well, is X one of these things? It's like a switch statement that you might see in other languages. We're just saying, hey, which of these, which of these ways was case, was X constructed with? So one way may be empty. And what you do then is you just put an arrow and then you say, in this case, I'm just going to say, I don't know. And in this case here, we're going to say full. And I'm also going to say, I don't know. So we basically split the X out and we said, hey, were you empty or were you full? In which case this A, by the way, is not the same A here. So I might rename it just to make that clear. Pull out anything you want as long as it starts with a lower case character. And these typos, by the way, they can say, they can be called anything as long as they start with an understore. So I'm going to see how these type two typos are both understore. I'm actually going to name them both. I'm going to say there's the empty typo and there's the full typo. And the reason is it'll give me a better error message. It'll give me messages for both the two typos and it'll give me their names so I can know what to do about each one. So again, I'm going to reload. And when I reload, I'll just scroll up to the top and it says, hey, look, I found this hole, this type hole. It was understore empty. And it needs to be an optional B that goes there. So let's have a look at our other sort of helpful things here. It says, well, there's relevant bindings. There's X of type optional A. That's actually not going to help us because we need an optional B. And then there's F, which is A to B. And then if you have a little bit of valid holes here and this is one point of confusion that I come across quite often because I've just told you that we need an optional B. But empty has the type for all A optional A. So is that a type optional B? And the answer to that question is yes. And the reason is because of the position of this for all here. And it's saying it's just anything at all. It's not that A. It's any A at all. It's just it's not that A. I pointed to the screen. You can't see me doing that. It's not that A there. It's just anything at all, including B. So one point of confusion, like I find regularly and I don't have a good answer to trying to help you with it other than just to try to really explain it is these type variables have scope. Is that A the same as this A and so on? It's quite difficult to point it or explain it. It's with some practice. You do get an intuition for it though.  It'd get a bit confusing in terms of the scope of each of these things and it'd be hard to talk about. You might say this A, well, which A, this one here that was declared here, not this one declared here and so on. But so I'm just going to sort of tell you that this A here is a different A to this A here. And the for all is saying it's just absolutely anything including B. So empty does fit there. And actually that is the correct answer. Because if there are no A's in my optional A, well then I just don't want to return any B's. I'm just going to return an empty list of B's. So empty fits right there. It will compile. I'm just reloading and have a look at the next typo. And again, I need to make an optional B. I have a look at my relevant bindings and it says I've got an additional value here which is A, A, A, A, or R. If you want to call it that. It has the type A. And when I say that, I do now mean that A. I have X and I have F. And I have myself my optional. Again, I get valid hold fits empty. Now in this case, I don't want empty because what I want to do is I want to examine these relevant bindings. So just just to be clear here, this will not always give you the answer. It will just really try to guide you as much as it can. So it says, well, I have an A right and I have a function and that function turns A's into B's. Cool. That would give me a B if I use those two values. But I actually need an optional B. Okay. So I want to give you sort of a thought process that you may find yourself in some time, which is you might sort of stare at this and go, hey, look, I can get a B, but I don't think I'm quite at the answer yet. So it's like you've worked out one of the puzzle pieces, but you haven't quite worked out the entire puzzle yet. And I want to give you this tool, which it'll just be another type hole. I want to give you a tool to help you express the piece of the puzzle that you've worked out while just leaving a type hole with a bit that you haven't yet quite worked out. So the mindset and I'm just imagining a particular mindset in this case, which is I can get a B. I know how to do that by putting this A into this function, but I don't quite know yet how to get to an optional B. Now, and one way of writing that is the code. So I'm going to write this in code using type holes. Okay. So you know how to get a B, right? Because that is a B. I've passed in the A. It was its name was AAAA. And I've passed it into the function F, and F turns A into B. So yeah, I had a B, but I know that that's not quite the right answer. What I want to do in that case is I want to just put a type. So I want to put a type hole. So I don't know how well you can see that, but there's another store there. Something. Okay. Something. And I want to put parentheses around this so that it gets. So I'm saying something goes here and it does something with the B, but I don't yet quite know what, because I've worked out this piece of the puzzle, but not this piece here. And then I'll reload. And it says, look, you've got this type hole here and it's type is a function B to optional B. And as we know, if I have a type hole that is a function, I could simply just start typing backslash and name and then an arrow. But I'm going to skip that step because we, well, I'm not going to skip that step. I'm going to just have a look what happens below first. Okay. So here's my relevant bindings, the AAAA that I've got. I still got F, I still got F, and I've still got myself in that optional. So I've looked at my relevant bindings and like, you know what, that is not going to help me make that, right? So if you just kind of stare at this and you're like, yeah, that's not going to help me make that. Okay, cool. All right. Well, that wasn't very helpful. Let's have a look at ballad holes now. And I just realized there'll be three of them there. I was expecting one, but I saw three. But there's one, right? So the full constructor will take anything. And again, this is including B, and it'll make an optional B. So I could take that code and I can literally just simply copy, oops, I pressed the wrong button now. I can simply copy and paste over the top of the typo, reload, oops, reload, and it compiles. Now I'll rerun my test. Yeah, my test works. So does the other one, by the way, this one should work. That one's actually impossible to fail. And I would declare a victory at this point. So look, I've solved this problem, and I did it using type holes to help me get there. Yeah, ballad hole fits. It's one of the most useful tools I've just seen come in. I cannot stress how useful that tool is actually because this could be day one Haskell for you, right? And this would be a pretty good exercise for you to have a go at and try to crack it using type holes. But I just want to reassure everyone that every time I write Haskell or any code at all actually, but preferably Haskell, I am using those type holes. I will look at the problem and go, yeah, that problem doesn't fit in my head. I will use type holes to get me to that answer piece by piece until I get the answer, and I'm satisfied that's the correct answer. It's a mindset that comes, it's kind of a consequence of functional programming. You can see we're not doing any side effects here, and you can't do that in Haskell at all. So using those type holes is, I think, one of the best ways, particularly for a beginner, someone who's only just starting out, just looking at those type holes using those tools and just mechanically following those rules, you will quite often very reliably get yourself to an answer. What I'm going to do is I'm going to solve, actually, no, I'm going to keep ranting a little bit about this problem here. There's actually a little bit of mathematics. I'm not going to show it to you. I'm just going to promise you it exists, and that's just due to time limits. There's a little bit of mathematics that I could do, and I could do it on the type, on this bit here, actually. I could take this type, and I could do some, it involves some arithmetic, a little bit of type theory, but nothing too complicated.  It doesn't really get much harder than that. A few little theorems and letters and so on, nothing too difficult, but I could do a calculation on this, and I'm going to sort of, I'm going to skip the calculation, and I'm going to get to my answer, and I'm going to tell you the answer. The answer is two. The number two is the answer that I would get if I did that calculation. And what does this mean when I come to the answer two? Well, that means that there are only two things that will ever have that type. There are only two possible answers that I could put here. All right? And by that I mean, well, we looked at the wrong answer. All right, let's just go back to the wrong answer. Comment this one out. And there's one answer. Reload. That compiles, but the tests don't work. So this is one answer. And this is the other answer. So another tool, and you'd have to practice a little bit on the mathematics, but I really want to promise you that it's quite easy once you get the hang of it.  You work out, hey, look, there's only two answers to this problem. Two possible answers that have that type. Ignoring the tests. There's only two things that have that type. I found the wrong one. It must be the other one. And so because it's two, and the test failed, I know for certain that this is the correct answer. There's no other possible answer. And two, so, you know, like I would encourage you to have a look at mathematics. It's called free theorems or theorems for free. But another really good exercise, and this is one of those exercises that is better than you probably think it is, which is to try to make that not true.  The guy told me it was two. I'm just not going to believe it. I think it might be three. Cool. Okay. Now that you think it's three, you just, or three or more or something. The goal now is to put something in this position here. That is neither of those two answers and it compiles. So I'm just, I'm making a promise to you. The promise is you can't. But when I say that, I don't want to discourage you from trying anyway. Do try it because by trying it, you'll find that you can't. But by finding that you can't, you'll develop an intuition for what it means to use types to get you to your answer. There are only two ways to solve this problem with that type. And to me, that is an incredibly invaluable tool because you and I, let's suppose you and I, well, first of all, we changed India. Everyone is writing Haskell now. We'll do that one day, right? And so we're all writing Haskell and you and I were on the same team. And I had the day off yesterday because, you know, this wasn't well or something. And I come in the next morning and you're not there, but you've left me this code, right?  Now to help me work out what you were doing yesterday, I can kind of look at this type. I can get my notepad out and do some maths on here. There's only two answers. They did one of those two things. So to me, that is a really useful tool. And when I say you and me, sometimes it's just you yourself, right? I wrote this code a year ago. What was I thinking, right? And the answer to that question is one of two possible things. That's what you were thinking a year ago. So, you know, I was working on code just the other night that I wrote 12 years ago. You know, I looked at my gallery, jeez. I wrote that 12 years ago. What was I thinking again? And yes, I just use that tool. And it really helps me kind of get up to speed and work out what it is that I was thinking that day 12 years ago. So this is how you solve this problem. Just looking at the time. I'm going to skip ahead. I'm not going to solve this one just due to time. That one's a really good exercise. I'll tell you the calculation. The calculation is two. There's only two possible answers for that one. Follow the types, use type holds. I bet you can get to the answer. I'm just going to show a hard one. I would say a bit of a harder problem. And I'm going to show you this problem. You know, because I'm sure there's some of you. Maybe you are a bit more familiar with Haskell. But you're finding intimidating. I think everyone's capable of practicing and getting to this ability. But yeah, I'm going to work through a more difficult solution, difficult problem. So I'm kind of fast forwarded a little bit. I'll explain a little bit of syntax for you. I'm just going to find a problem, actually. You know what? I've changed my mind. Yeah. I've changed my mind. Okay. I'm going to make up a problem. It's very similar to the one that we saw back then. There's a lot of syntax that will be unfamiliar potentially. So I'm just going to call a problem. I'm going to make one up. And we're going to type here. Okay. So problem. And I want you to imagine you came across this and said, you know, I believe in you. You can do this. You can solve this problem. So let's reload. Make sure it compiles. It compiles. The key to compiling is just this OK down here, by the way. So yes, it's solved. Sorry, it compiles. But we need to solve it. I'm going to talk you through my thinking again. So, yeah, I have looked at that, yeah, with Jim. Yeah. So the connection between manual typehold development and programming or pre-searching with Jim. Yeah, I have. It's quite interesting. So yeah, there's a, if you take this sort of, this mental model of thinking that code, there's a lot of rabbit holes ahead of you. They're all beautiful and elegant in their own way and some very practical and useful. And that's certainly one of them. Yeah, that's for sure. So just to give a bit of background for the people who aren't familiar, Jim is a tool written to Haskell. And what it does, have I even got it on this computer? No, sorry, I'd show you if I did. So what Jim does is you give it a type. You just pass it. You say to Jim, hey, here's a type. And it comes back and says, well, here's a program that has that type. So it fills out the code for you. So it is related to what we're doing here. And there are other tools. Jim is one of them. So yeah, type it into Google if you like Haskell Jim and knock yourself out. But it does, it does, it's called program searching. It finds a program that has that type. So, okay, let's look at this. Let's have a look at this type. Okay, so the problem with this notation, like I said, is it's hard to say in words. It's really hard for me to say in words. But it is, it is quite simple. I'll do my best in words just to give you an intuition. So it says, if I take a function and that function turns B's into C's. And then I take another function and that function turns A's into B's, then return a function. Thank you for the time check. So, and then return a function and that function at your return should turn A's into C's. Okay, so even a function B to C and a function A to B make me a function A to C. Cool. All right. Again, it's day one. I've never seen this problem in my life. I have no idea where to go. Where to start. So I go underscore. And underscore is just, I don't know. I mean, I have no idea. I reload and it says, well, I found a title. It's called underscore. And you need to make something of that type. It goes right into that title. Okay. And you stare at this and you know, what does that mean? Well, it's a function, right? It's a function. It says right there it's a function. And so you pull out that other tool that you've got in the pocket. And that tool is, well, the type. Backslash and then another underscore. Yeah, correct answer. Nilesh, correct answer. So yeah, you start with a lander. The backslash is called a lander by the way. If you go and look up the Greek lander symbol, the backslash is the closest axis character to it. So that's what Haskell uses. It uses backslash the lander. And then we reload again. And we have a look. And it says, hey, you know what? I found a type hold for you. And it has that type. You're like, oh, okay, cool. Well, that's a function. I hope you all agree. So I'm going to follow mechanically. And I'm going to type that in. And then I reload. And it goes, I found a hole. And it has that type. And that type is a function. I can see that it's a function. A to C. So reload.  The answer is no. I found a hole and it needs to be a C. I need a C. A C goes in there. Okay. I need to make a C. Hmm. How do I make a C? All right. Let's have it with the relevant bindings. Okay. So I have an A. I have G. G is of type turns A's into B's. And I have F. And F turns B's into C's. And I have myself. There's no valid holes. Okay. Wow. How do I solve this problem? Now, I see that my hole is a C, right? And if I look at my relevant binding and say, you know what? I would have a C if only I had a B. But I want you to imagine that you've identified just that part of the problem. You have absolutely no idea where you're going to get a B from. I've worked out that if I pass something into F, I should get a C. All right. So you go, here's F. Here's something. I should get a C.  I found a hole. And the hole is of type B. So I need something of the type B to slot straight into that hole where the B underscore is. And we're going to have a look at our relevant bindings. And our relevant bindings where we have A type A, we have G type A to B, and we have F type B to C, and we have ourselves. And there's no valid holes. Damn. Okay. Let's have a look at our relevant bindings. So just refreshing again on what we need. We need a B. I need to get a B from somewhere. And when I have a look at G and I look at G and I go, if I could just give it an A, it'll give me a B. I want you to imagine again that you've just worked that out. I just, I found G and if I give something to G, it will work it out. So I'll just colon R by way of short for reload. I was going to try not to do that, but I did. So colon R is short for reload. So I reload and it says you have a hole. The hole is of type A. And I look at my relevant bindings. And well, that one looks pretty useful. And actually valid holes. A will go there. So copy paste. And then I reload and yeah, it compiles. So one thing to think about here is, do I have the correct answer? Is this the solution? There's no test obviously. I didn't write any tests. But is this the correct answer for this problem? And the answer to that question, well, it really depends on the tests. But it also depends on something else, which I want to talk about. But I think is more important than tests. Tests are the last result. Types are where it's at. So I told you earlier that if I did some mathematics on this, I would get to the number two. And there's only two things that have that, two possible functions that have that type in the entire universe. So I showed you the one that doesn't quite work. And I showed you another one that does work in terms of the test. So this one here does need one test. This one here, by the way, is redundant. It's impossible to fail that test. But this one here, it needed that one test because the answer was two. To disambiguate and say, well, which of the two possible answers is the one that's the correct one? It's the one where that test passes. And that disambiguates which of the two possible answers is the correct one, this exercise here. Now, this exercise here that we've just done, when I do the maths, and again, I encourage you to do, maybe when I come to Bangalore next year, I'll hang out at lunchtime and we'll get our notepads out and I'll show you. But when I do the mathematics on this one here, the answer's one. So it comes to the answer one. There's only one possible function with this type. And because of that, I can now conclude it must be the correct answer. There's no other possible answer. So if it has that type, that must be the answer. There's no other way to satisfy that function's type. So I've just noticed I'm running out of time. So I just wanted to help you out with that. And yeah, that's exactly right. Yeah. I wanted to say, I know that a lot of this stuff can be quite overwhelming for some people when they first get into it. And it looks like when you watch someone who's experienced doing these kinds of problems, it looks a little bit sort of wizardry. But I want to break those steps down for you and just say, hey, look, these are the steps that those people are going through, even for hard problems. And I encourage you to follow those steps as well. And I would happily help anybody do the same. But yeah, hopefully next year, I can, you know, if you need help, send me an email, of course, but hopefully next year when I get to Bangalore, we can hang out and do it together. So yeah, better wrap up. Just got me out of time. Well, yeah, thank you, Tony, for this great session.


Penguin Presents. Two evils by P. J. Tracy. Red by Sarah Borges. Chapter 1 Sometimes the water was glassy and still, and the boat sat on it, like a piece of paper on a flat table, motionless, utterly silent. Other times, particularly when they were tied up in port, the tide would push in a wave that made the boat hump over the water like a roller coaster topping the big hill. But on the rarest of nights, the ocean off the keys was like a cradle, and on those nights it was safe to anchor a few miles offshore where the gentlest of swells rocked you to sleep and the water made kissing noises against the hull. Grace McBride liked listening to that. It reminded her of the sounds Harley's koi had made when they took food from your fingers before they'd all been butchered by some serial killer raccoon. There were no human serial killers in the keys that she knew of, and the proof was evident.  And here she was, still alive. The heat and humidity had sent her to a boutique on her second day here, put her in a sundress and sandals for the first time in over a decade. And something about that change of outfit had changed her head, gobbled up the fear she'd lived with forever as if bare toes and legs were the one antidote to paranoia she'd never thought to try. Poor McGotsey. The Minneapolis homicide detective was the only man she'd ever opened her heart to, if only just a tiny bit. And he'd worked so hard to get her to the point where she could walk outside her house without a gun and, as it turned out, a sundress accomplished the goal in a single day. You can't wear a shoulder harness with a sundress, it just looks bad. Grace McBride hardly knew what to make of this new life, where the elements ruled and people simply went along for the ride. There was no choice but to cede control when a sailboat was running in front of the wind, and at first that had terrified her. For all her life, control had always been the key to her survival. Excruciating attention to every detail of her surroundings had been the only security. Sailing had taken all that away. There were no startling noises out here, no muggers, no killers, no sudden movements caught in the corner of your eye that made you want to run for cover. There was the endless expanse of water and sky, and the constant smell of salt on the wind.  John Smith had given this to her, this exotic experience of living without fear, as if she were a normal person living a normal life. He was FBI, twenty years her senior, a solitary, humorless agent who lived for the job in little else. Three months ago he'd been assigned to work with Monkey Wrench, Grace's computer software company, and the Minneapolis PD, on a series of internet murders. They hadn't bond it in any serious way, even defining each other as friends would have been a stretch at that point. And yet when John had asked her out of the blue to go sailing with him in the Caribbean, Grace had said yes. To this day she didn't fully understand why she had done that. The way he'd delivered the imputation hadn't even been particularly persuasive. I have a boat. When I get back to DC I'm going to get on the boat and just sail away. You want to come along? It had been a ridiculous question. What kind of person would walk away from her life and sail off with someone she barely knows? And yet the moment he'd asked it, one of the very few happy moments she'd had in an otherwise frightening childhood popped into her mind. The night when a weary, distant foster mother had relented long enough to read a bedtime story to her. The owl in the pussy cat went to sea in a beautiful pea-green boat. They sailed away for a year and a day to the land where the boundary grows. To an unhappy child the image of sailing away from her life had been magical. Maybe it still was. Maybe that was... Sample complete. Ready to continue?


The next item of business is consideration of business motion 7375, in the name of George Adam, on behalf of the parliamentary bureau, on a change to future business. I call on George Adam to move the motion. Thank you, Presiding Officer, I moved. Thank you. I call on Alexander Burnett to speak to and move amendment 7375.2. Thank you, Presiding Officer. Obviously, we do not support the SNP's plans to make independence the very first thing Parliament debates in 2023. With all the issues facing Scotland right now and all the problems they could try to improve that lie within the Scottish Parliament's competence, they instead decide to waste time on a reserved matter. My amendment puts Scotland's issues into the agenda for 2023 and I encourage all self-respecting members of the Parliament to support it and I move the amendment in my name. Thank you. I call on Neil Bibby to speak to and move amendment 7375.1. Thank you, Presiding Officer. The minister and I have had many, many conversations over the last few weeks about the timetableing of parliamentary business, which I have enjoyed very much. I do have to say the suggestion that on the first day back in 2023 we should prioritise a debate on the SNP's general election strategy on a de facto referendum is not something I or Labour are going to support. I have consistently argued on the parliamentary bureau that we need to be responsive to the needs of our constituents and tackle the big issues facing them. Instead of discussing the Government's business suggested, we should be discussing the crisis affecting our NHS when we return in January. NHS workers could be on strike and that is frankly what should be at the top of our agenda. It is an extremely serious situation. If those strikes do come to pass, I believe that our constituents would be astonished at the idea that we would debate anything else. Not only that, and as Sarwar highlighted earlier today, there are very serious and significant concerns that need urgent attention, such as A and E waiting times, mental health waiting times for our children, cancer treatment and many more issues. We want to put forward our proposals for improving the situation right here and right now. Labour has long-term solutions to help to fix the NHS crisis, such as Labour's plan to end non-dom tax status and invest £3.2 billion in the NHS to provide the biggest expansion of medical training in the NHS's history. The first debate of 2023 should demonstrate what our priorities are for the year ahead. We believe that priority and that debate should be on the NHS and, therefore, I move the amendment in my name. I call on George Adam to respond on behalf of the parliamentary bureau. I find it somewhat ironic that those who are seeking to deny a democratic debate which highlights how the current constitutional settlement is denying democracy in Scotland. Frankly, the case for the people of Scotland to be given the choice and the chance of a better future is becoming stronger every day. With inflation running at 10 per cent, household incomes predicted to fall to 2014 levels, the economy in recession, people facing horrific choice between choosing between heat and eating this winter, millions facing eye-watering increases in their housing costs in 2023 and Brexit, of course, compounding all of these, creating labour shortages, trade barriers, higher business costs and lost tax income. All this shows that it is time for the people of Scotland to get the choice to choose a future where they are wealthier, healthier and happier. I will not ever apologise for encouraging this Parliament to debate the people of Scotland's right to choose their own future. The question is that amendment 7375.2, in the name of Alexander Burnett, which seeks to amend business motions 7375, in the name of George Adam on behalf of the parliamentary bureau, on a change to future business, be agreed. Are we all agreed? The Parliament is not agreed to, therefore we will move to a vote and members should cast their votes now. The vote is closed. Point of order, Marie McNair. I didn't refresh out the voted no. Thank you. We'll ensure that's recorded. The result of the vote on amendment number 7375.2, in the name of Alexander Burnett, is yes, 30. No, 68. There were 24 abstentions. The amendment is therefore not agreed. The next question is that amendment 7375.1, in the name of Neil Bibby, which seeks to amend business motions 7375, in the name of George Adam on behalf of the parliamentary bureau, on a change to future business, be agreed. Are we all agreed? No. The Parliament is not agreed, therefore we'll move to a vote and members should cast their votes now. The vote is closed. The result of the vote on amendment number 7375.1, in the name of Neil Bibby, is yes, 54. No, 68. There were no abstentions. The amendment is therefore not agreed. The next question is that motion 7375, in the name of George Adam, on behalf of the parliamentary bureau, on a change to future business, be agreed. Are we all agreed? No. The Parliament is not agreed, therefore we'll move to a vote and members should cast their votes now. The vote is closed. Point of order, Megan Gallacher. Thank you, Presiding Officer. My app froze. I would have voted no. Thank you. We'll ensure that's recorded. The result of the vote on motion 7375, in the name of George Adam, is yes, 68. No, 55. There were no abstentions. The motion is therefore agreed. The next item of business is portfolio questions. I'll allow a moment or two for front benches to organise themselves.


in the name of the law we bring you another of the thrilling stories in this exciting series taken from actual police case file our story begins on a perfect fourth of July morning in Fort Smith Arkansas as a happy family prepares for picnic to the accompaniment of sputtering firecrackers not those firecrackers you come and help me bring those chicken that ham out here on the porch rock and pack them in the back all right I'm bringing them oh gosh I hate these for the July picnic like a bear hate honey I hate them and now put those fried chickens here on the bench those chickens look good enough to eat man face what do you think a friend of four now Mary and the others will be here any minute we've got to hurry if we want to get the big clear quick in time for dinner but the crowd's on the road no gosh Julia I'd rather eat my vitals here at home on the porch get out where the ants begin that's what you always say Joe Barrett but we couldn't keep you away from a picnic let me put you in the street just a fugitive from a picnic that's me here you are and here's the ham and the cheese and the jelly and the coffee and the hey where's the tomatoes in your hand Joe it's usual I reckon up my wax paper Mary just loves nice ripe tomatoes oh say how about me Mary won't even think about food today the girls in love isn't it grand just think Mary and Harry engaged I've known them ever since they were babies Mary's a mighty fine girl you and Harry's a fine young man but oh Mary's a young she's only 15 and him to think of marrying wife well Mary's older and her ways and most girls are 15 I'm glad she's marrying a good boy like Harry where are my heart-boiled eggs now you know you shouldn't eat them they can make out with chicken and ham and chocolate cake oh shucks you can't have a picnic without heart-boiled eggs you know how I like them are not you you know I like it when you do can I help you do you and no thanks Mary you can at the picnic all right I shake you up a cocktail how about it Harry well whatever the other thing goes to me I make this up well before the July only comes once a year what do you say Alex well alone all the world seems to stop today here no time no anything just you and me and the flowers looking they're prettiest and all for you Mary oh you're lovely look at the water doesn't it look cool oh gee it's so warm now I wish I were any what's the photo July without a swim you're such a kid Mary I wish I had my bathing suit I duck right in that water Mary you're so impulsive sometimes I get scared oh scared of what scared something will happen before before we get married or marry kiss me hold me then I'll be sure you're really here where does that convince you what she does yes Mrs. Barber get some water your will be glad to my hand be turned hot yeah man was talking about a swing don't be too long Joe's yelling free zittles already I brought in some eggs and I'll be boiling them soon as I get that water else you'll never stop going I'll wait here for hours Harry you get the water for Julie yourself all right see you later honey all right thanks for waiting there oh well wish we could go in bathing why can't we well we didn't bring in what does that matter we go in you know step in oh I don't know somebody might see oh there's nobody around here and really like the bathing suits are just like step in come on Alice let's go big clear-freaking Crawford County icons are good enough for me well here I don't wash your analysis along it's good Julia and you'd better hurry up on your share Harry a dusty won't leave anything he's pitching it in just like it was a hey my brother's lost his appetite but nothing's the matter with my wish we waited for Mary and Alice seems kind of unsociable like to start dinner with Adams unsociable my eye we waited half hour I wonder where Mary and Alice are I think I'd better go hunt oh they're all right there's a dozen pairs from the creek down here you might miss him don't be so nervous all right don't write trusty but right now don't take on so we'll find her she's all right you and I search both sides of the creek Joe and Roy have beaten the woods now look the bull she fell asleep oh she's being a joke on it while Mary is full of you yes Roy what is it is it Roy look for that rock Mary's clothes it's a dress well kid she's drown and here's a flipper than a slip oh she's been drawn I know she has call the police stay here and do what you can sure sure well Roy no no hair we'll find this you'll be all right was up to something we'll find it we'll find a sure let's look alone the creek here oh Mary Mary big rocks in it mom yes out of the water is lovely this is called Big Clear Creek the water comes way down from the Ozarks the Ozarks thought I would only read about them in books mom I'm sure glad we could leave New York and have our case in here vacation also it was good of your father to send us here all this distance to Arkansas for a visit look mom look at that walk around the bend which rock oh I see now the one where the girl is taking a sun bath we can't be taking a sun bath mom her head's in the water why some so it is that is strange creek on these rocks what's the matter yet you look six inches all the water isn't enough current and Big Clear Creek at that spot to bring a body up on the rock that hard yeah that's my idea on you how far down the creek today finder 400 yards downstream from where she was last seen bathing current isn't that strong what does the corner say well he says the poor girls Nick she could have been diving was from a terrific blow with a club or a rock crushed her spine with any water and along for the bottle yes you saw the body girl was only 50 I know that's what makes it more horrible just the child and yet a woman on you I want you to get together all the people who are on that picnic all right chef you don't suspect any one of them do you they were all married me house friend friend or no friend one of them could have met you're barking up their own trees we were all together when this thing happened you're all of the last to see Mary me how a lot that's why you're here to tell me I must I do the talk or not and I'll do some questioning which of you saw her alive last I did I guess I was in swimming with it and tell us the whole story well it was warm so Mary and I went in Mary slam around the bin and after while I dressed and came back that's all I know I guess the last time you saw Mary then was when she swam around the bin yes that's the last time what did you do then I went back to the crowd they were eating and and then they asked me where Mary was I told them what I told you yes yes I know Miss Gray just a gilford here is your your friend isn't he Roy Joe he's my friend I've known him for years why didn't you go in swimming with him with Roy why I've just never thought of it that's why I guess that ain't the reason you had a date with someone didn't you you met someone at that creek now didn't I did not meet when you went in swimming nobody I tell you I was there with Mary nobody else you didn't see anybody else there either no nobody where were you gilford what do you mean you know what I mean where were you when the girls went swimming with the other oh no not all the time you won where did you go I didn't go any place yes you did you were away for a half hour before Miss Gray I remember I went for some words that's right we were going to build a fire and we needed some twigs and it took you half an hour to find a few twigs you expect us to believe that well I don't care if you believe it or not it's the truth you like Miss Mayhaw didn't you gilford no more than I did many other girls well you liked them more than you did Miss Gray didn't you well that makes no no I didn't marry with Harriet girl I didn't make any difference to you now did it what I mean chef ask your friend here what I mean he'll tell you don't believe him Harry he's only trying to make trouble we're only trying to find out who killed Mary Mayhaw now tell us what you know gilford or we'll tell you a few things and you may not like that for much all I have to say is that I didn't kill Mary and I don't know who did about that other thing I I did go out with Mary once or twice I don't see what that has to do with solving this case you went out with Mary why didn't you tell me Roy all it was nothing Alice I'll fix you for that Roy you'll be sorry you messed around with my girl how about you mr. Barrett what were you doing while the girls were in swimming I can answer that chair my husband here was interfering with everyone on account of those hard-boiled a hard-boiled who are they all you don't understand relayed for me Joe's crazy about them and he wants us to make some for him right in the middle of setting the table I see I see did you leave the party at all Barrett no but I should have so it's gone down for the July picnic give me a pain oh you gave Mary Mayhaw a drinking toxicating liquor before you went on this picnic didn't you what in the world you driving at you don't think I had anything to do with it do it so happens around the sheriff here Barrett now I'm asking the questions not you all right yes Mary Mayhaw had a drink before she left but so did we all what about it I'll say we ain't getting anywhere folks and a job which one share me and my brother you are the one who was engaged to marry aren't you yes when was the last time you saw when she went in swimming you see her go into the water no she said she'd like to go in alone but Mrs. Barrett called me to do something later I found out she went in with Alice you found out yes from Alice she came back and when we asked where Mary was she she said she thought Mary had come back then you were the last one to see Mary Mayhaw live miss Gray I guess so outside of the one who killed her Mrs. Barrett who was missing besides these two girls well I can't say for sure but near as I can remember Harry Jordan here was the only other one he went for some water off any all the others was there with you I think so but I can't be sure sure Joe here was making such a fuss about what about guilt oh he was there oh yes yes later he left for a little while they get some twigs yeah he said or Jordan and me share no no no not this time your brother now dusty yes I share what is it were you away from the party at any time while these girls were swimming not that I remember well that's the yes you were come to think of it I I was for a little while I I went for some water oh so you went for some water to yes Mr. Barrett here one of some hard-boiled eggs so I figured I'd surprise him and get some water and but Mrs. Barrett sent me for the water yes I know that was that I thought just a minute you went before your brother did I don't know that is I might have I really don't remember you went for water what you expect to carry them I had the only bucket I but why you remember Harry I had a canvas bucket in my motorcycle kit I was going to get I remember now I remember what's the matter Miss Gray I just recall something something that might be important oh yeah well come on what is it but you remember asking me if I saw anybody when Mary and I went in swimming yes I remember now did you know I didn't see anybody well I'll say what's the idea you playing with us or something no but but I heard something something that I just thought he did well come on tell us what was it well when Mary swam around the bend I heard a motorcycle coming down the road it stopped and then I heard a boy a man for it they must be fun in that and then he said something else but I couldn't understand what it was just a ride the motorcycle but I don't know what I'm trying to get away you can't make it happen you're my own brother Harry wait a minute I didn't mean I didn't mean to kill her it was an accident I was I just made it come on Jordan talk and talk straight well I knew the girls were going for a swim I had them talking about it so I took my motorcycle and I rode up to the bend in the creek must be fun and I must be want to sing a rap well come and get one I dare you will not don't be silly I'm going to stay right here behind this bush oh come on I dare you what are you afraid of come on here it is Mary give us oh no we're not don't please don't death I wish I hadn't come out come on give me a little kiss Mary oh no come on now don't be stingy Mary please don't come on come on give me the news you have heard the verdict of the jury guilty of man's order in the first degree man's order of the girl your own brother intended to marry hereby sentence you to seven years in the state prison


The Ortur Laser Master 2 is my favorite desktop laser engraver and today I'm going to show you why. My name is Jim and this is the Edge of Tech. So I've been using the Ortur Laser Master 2 since August of 2020 when I got it. And if you've watched any of the videos I've done on lasers, the coasters, the tile, the canvas, the slate, all of them were done using this laser right here. And while I'm talking about this, I'll put the link right here if you want to check out the playlist. Now I have the 20 watt version, which is actually 20 watts in and only about five, right around five laser watts. But after using it for this long with all those projects, I still think this is my favorite desktop laser engraver. I really like it. And today I'm going to show you some of the features of the Laser Master 2 and maybe you'll see why I actually recommend this if you're getting into this hobby. Let's do it. This right here is the laser module. It is connected to an adjustable Z-axis upgrade that I did. And the link will be in the description below. But it normally comes stock mounted straight to this plate and it does not move. Now they do make a new version that's a fixed focus laser, which means you don't adjust the lens underneath. You just adjust it up and down. And that's mostly all the new versions are coming like that. That is really cool because I actually added this upgrade part because mine didn't do that. All the new ones should.  Again, this is the 20 watt version, but you can get it in a 15 and a 7 watt version. So it depends on what you want to do. I really like the 20 watt and I like to stick with that. I've been getting great results. Some people like the 7 watt because you can get a much tighter dot, which gives you much clearer pictures in theory. Like I said, the newer versions come with a little bit different module. Actually, it's adjustable up and down right from the factory. That's awesome. Also in the description, I will put the default focal lengths in the description below just so you have reference to that. That way you know how far from the bottom of your housing here to your material you need to be. This is a great module so far. I haven't had any issues. The first one I got was defective, but this one has been just amazing since I got it. The bottom left of the laser engraver behind this panel is your 32-bit motherboard. You can see a USB input here and your power input right there. So this does need to be connected to your computer to run, but you just connect this via USB and they do give you a cable. Over here you have your power button and your reset button. If you need to reset this for any reason or you want to stop it right away, you just hit that button once and everything comes to a halt. This board here from Ortur actually has several safety features on board, including a G-sensor. So it detects any unauthorized movement and the laser beam will stop. So if your laser were moving and it got stuck on something or something like that, it'll turn off the laser beam. That way it does not cause a fire and keep burning. It detects if the USB cable. If the USB cable gets pulled out on accident either on this end or the computer end, it will stop the laser as well. That way it just does not keep going or maybe sometimes the ones that don't have some of the safety features put in, the laser head will actually stay in one spot and just keep firing that laser right in one spot and that is a big fire hazard. If you were to turn the laser on and you have it plugged in via USB, you have it plugged in power, you turn the laser on with your software and you don't start movement. After so many seconds, it'll actually turn itself off. That way it doesn't overheat or start something on fire underneath it as well. So overall, like I said, behind this panel is your 32-bit board and it's not a bad board at all. I like the 32-bit version and it's silent too. As you can see here, it's made with aluminum extrusion or aluminum profiles. They are V-slot for the wheels just like an ender 3 would be. It does come with cable management which is awesome. You get these looms and everything plugs in very nicely to them. They have zip tie points here where you can actually zip tie everything too which is great and the cable management from the factory is really good. Now a lot of people add drag chains to keep this stuff up off your material and stuff like that. I haven't had issues with that but some people do. It's built very well. It takes maybe 10 to 15 minutes to put it all together. It uses mechanical end stops which you can see here and there's another one here and that stops it going forward here and it also stops it going sideways there so it knows where home is. Overall built very well and it's very lightweight for how big this machine is. That leads us into the size of the engraving space here. It is 400 by 430. That is a really nice big engraving space in the center here. As you can see, that goes all the way back to there and that's a very nice good size engraving space for a desktop laser engraver like this. Something else I want to point out is this bar right here. Now this is a synchronization shaft and it goes all the way across and it links up to the belt on this side and it has a gear here. That keeps both of your Y-axis in line especially when you're moving at full speed. You want to make sure that this is moving at the same on both sides. If you did not have this, this might be able to get off like this when it's moving at full speed. It's nice that they put this in here. It's a very good thought and it's kept everything primarily straight for me so I really like that they added this synchronization bar here. This laser runs on Gerbal or GRBL language and you can use it with a wide variety of different softwares as long as it controls the Gerbal language. Now you can use it with Laser Gerbal which is what they say or Lightburn which is my choice. I really love Lightburn. It is very very robust for lasers and you can check it out for free for 30 days with the link in the description below. It's not an affiliate link or anything like that and everybody gets a free 30-day trial if they want to. Let's talk a little bit about support. Now I really like the Oortour support for the Laser Master 2. It's been super responsive to me. I actually had a module burn out. They went through the testing with me and sent me a new one. No questions asked. They didn't even know who I was so it couldn't have been about YouTube channels or anything like that. I just reached out and said, hey, I got this. It's not burning correctly and they took it from there. Now I would highly suggest checking out the Oortour Facebook group. It's very helpful. There's a ton of project ideas. You just throw a question out there and many people will answer and help you out. I really like the Oortour Facebook group and Gil, the support guy from Oortour or one of them at least, is part of that group and he'll help anybody out. You just have to ask him. So overall, like I said, I really really like this Oortour Laser Master 2. I think it's my favorite desktop laser engraver and I've said that about three or four times now during this video. But if you're looking to get into this hobby, I would highly suggest something like this. It comes with your safety features, your 32-bit board. The new ones have that fixed focus laser module and it makes it very easy to start right away. And the build only takes 15 to 20 minutes to even put this thing together, which is really awesome. Getting this is a little bit of a weird thing. So you can go on Amazon, which many people do and the links are in the description below, but you're going to pay more. You'll get it fast. It's Amazon return policy, all that stuff, which is awesome. But you actually pay a good chunk more for the laser. I'm not sure why they do that and I wish Oortour would fix that because they could probably get a lot more sales if it wasn't more expensive like that on Amazon. The other links in the description below are from some of the other sites. You will get them, but it might take a while. Mine took like six weeks to get here when I ordered it. So I mean, there's the trade-off. Yeah, it was cheaper, but you know, I may not have the best support from the company I bought it from as far as the actual purchasing company goes, but you know, it's cheaper and I can get into the hobby a little bit cheaper that way. So it really depends if you're willing to wait and save some money. Do that. If you want it now and you're willing to spend a little money, I would just grab it right off of Amazon. Something else to point out, this particular one does have some upgrades on it and I'll put that link right here. There was a last video I did on this. It does have the belt tensioners and the Z-access adjust as you see it here. And that does not come with it factory, but you can get these in an awesome package. It's a cheap package and they're super easy to put on like you saw in that video. And I'll put that link in the description below. These parts have been awesome for what I've been doing. Well, I hope you guys learned something a little bit about the Oortour Laser Master 2 desktop laser engraver today. You know what? If you got value out of the video, let me know in the comments below. Maybe hit that thumbs up. I hope that if you're going to get into the laser engraving world, you check out this model. I do have some new ones coming. So stay tuned because you never know if those are going to be better or not. You'll see them on the channel soon. But you guys rock and as always, keep burning. Hey everybody, I hope you liked the video today. Give me that thumbs up if you did. Hit that subscribe button right here if you haven't already and click that bell for notification. Next time we put out a great video like this or when we go live on Hot Makes. You guys rock. Keep burning.


Hey guys, welcome back to my channel or welcome if you're new. Today's video is going to be a fashion video which I'm very excited about. I always share what I'm wearing in my vlogs but I haven't posted an actual dedicated fashion video in a very long time and I don't know, I've just been feeling more inspired lately to just put together cute outfits and I thought it would be fun to do some summer to fall looks because it is not time of year, fall is officially here. So I'm gonna take some of my summer outfits, summer pieces and show you how I would transition them into fall for the cooler weather. So hopefully this video will give you a little bit of fashion in spoe but before we get to the outfits, I do have to give a quick shout out to the sponsor, Dossier, literally at work, I started working in a salon recently and all the girls there are always complimenting how I smell and asking me what I'm wearing and I'm like, oh my God, you have to order from Dossier. If you've never heard of them before, they make inspired fragrances or dupes as I like to call them for designer brand fragrances. By eliminating the super over the top unnecessary overpriced packaging, retailer markups, celebrity marketing, et cetera, they can offer fragrances that are the exact same quality, exact same sense for 70 to 90% less than the name brand. I like to change up my sense with the season a lot of the times. Now that it's fall, I wanted to go with something a little bit warmer. So what I have been wearing lately is the fruity brown sugar, which is inspired by YSL's Mon Peri, which I did used to wear the actual like designer name brand perfume. So I can honestly tell you from personal experience, this smells exactly the same and it lasts the same amount of time. Like it is literally the same fragrance, but for less money. So if you guys wanna check out Dossier, I will have a link and a discount code in my description that you can use to save yourself 10% off. Dossier also now has a rewards program. So make sure that you select catch in the last step at checkout. So you can start racking up the rewards and get yourself some store credit to use in the future. Thank you so much Dossier for sponsoring this video. Now let's get into outfit number one. So here is the first piece. This dress is from H&M and don't mind the little water stain. I literally wore this dress to work today and I just got back a little while ago. So I was washing my hands and I got a little water on the dress. So in the summertime, I would just wear this as is with some sandals. So let me show you how I would change it up for the fall. Same dress, I just threw on a crew neck sweatshirt which this is actually pretty oversized. So this is how the sweatshirt is normally which it just, I don't know, it feel like it's a little bit too big with the long skirt, it looks kind of frumpy. So I will just grab it in the back, make a little ponytail and then tuck that in and then just tuck it in all around. So that way it makes it kind of cropped without having to actually like cut and crop your sweatshirt. And then I threw on some combat boots and there's the fall version of the outfit. Sweatshirt, by the way, is also from H&M and so are the boots. This is a full H&M outfit right here. And by the way, this is not meant to be like a clothing haul or anything like that. I'm really just genuinely styling outfits from pieces that I have in my closet. Some things might be old and not available anymore. Some things might be thrifted. So the point is not for you to go and purchase these exact pieces and completely replicate this outfit.  There is outfit number one. Okay, here is summer outfit number two. This skirt, I actually got recently at Target so it might still be available. In the summertime, I would just wear it basically like this with like a little crop top, some sandals or heels. So let me show you how I would change it up for fall. Here's the fall version. So I just took a band tee. I wanna say this one is maybe from Forever 21 but any kind of graphic t-shirt, this one is pretty oversized so I did my little ponytail trick. You could do it either in the front or the back and just kind of tuck it up like that or you could even take the little ponytail and tuck it under your bra so that way it'll stay in place. You don't have to worry about that poking out throughout the day. And then I threw this leather jacket from H&M on top. Depending on where you live and how cold it gets you could do with or without the leather jacket. And then for shoes, I just did these black heels from H&M. Realistically, I probably would wear something a little bit more open and breathable if I was doing the leather jacket because I live in North Carolina and it doesn't get crazy cold in the fall but you could definitely do sneakers or combat boots like I wore with the last outfit would work with this. I just know personally I would be too hot if I did the jacket and boots. So there is the second outfit.  And here is my fall version of that outfit. This blazer is actually a men's blazer that I thrifted. Highly recommend if you are looking for good jackets check your local thrift stores and check the men's section especially for blazers if you're looking for like something kind of oversized like this. If you live in a colder climate, you could always wear tights if you needed your legs to be covered a little bit more and if the knee-high boots are kind of not really your thing you could do tights with regular ankle boots or something like that. And these boots are Steve Madden. I can't remember the style name off the top of my head but I will link them in the description. That is outfit number three. And then the last outfit is a workout set which this is actually from Amazon. I have a bunch of workout sets from Amazon that are actually really great quality. I am discovering that Amazon is the place to shop for clothes. So yeah, I got this set pretty recently so I'll link it in the description. It comes in a bunch of different colors if you're interested but I just love the top. Super cute but yeah, this is something that I would just wear in the summertime to go on a walk, go work out, et cetera with either sneakers or slides depending on what I'm doing. So let me show you how I would change it up for fall. Here is my fall version. So just swap out the shorts for some leggings. Unfortunately I don't have any that match this color but black goes with everything. So these are just from Adidas. And then I threw this flannel on top from Boohoo and then some high socks. These are just some cheap ones from Haynes that I literally got in a giant pack from like Target or Walmart I think. And then Adidas sneakers. If you don't love the look of the high socks, I totally get it. You know, obviously you can just do regular ankle socks. But personally, I am a fan. Keeps you a little bit warmer and it just, it's like a cute 80s, 90s kind of vibe. And they can make your legs look a little bit shorter. I'm five too so I'm quite short. Don't have super long legs but who cares? If it's flattering or not, if you like it and you think it looks cute, rock it. It literally just all comes down to confidence. That is the final outfit. I tried to keep it pretty simple. I don't really typically like to over accessorize my outfits but I just kind of wanted to give you like the base, the foundation of some simple outfits. Just to, like I said, give you kind of an idea. I will try to link as much stuff as I can in the description but like I said, some of the pieces that I have are old or thrifted so I might not be able to find links for them. But try to just use what you already have. See what pieces in your closet you have that are kind of similar that you can make work but that is gonna be it for this video. I hope that you guys liked it. I tried something a little bit different. Let me know if you wanna see more fashion content from me. I can do more like what I wore this week type videos and just show you the outfits that I wear to work throughout the week and thank you again to Dossier. Don't forget to check the link and discount code in the description and I will see you guys in my next video. Bye.


Hello, I'm gonna talk a little bit about hunting darts from the Yukon, so You're all you're all there right now But what I'm talking about is not Europe at all Talking about sites in the mountains way over there in the Northwestern part of North America and this is an area that has been for for the most of 14,000 years some inhabited by indigenous hunter-gatherers and they were a hunting and gathering culture continuously right up until about a hundred years ago and that and why I Tried to fit this talk into this session is People are always talking about stone tools and and is you know Archeologists are struggles to try to visualize things that are very old and I'm a very often subject to a lot of decomposition So the struggle is real so this is kind of a talk about projectile points But I won't be talking about the stone tool aspect of it all that much So again visualizing stone tools that projectile points, especially the very ancient ones I mean we imagine them as that the pieces at the end of the steer kind of thing and whether they're Sophisticated or not very sophisticated Recreations of them there, you know some of these recreations are based on our research some of them are accurate some of them are not but One phenomenon in archaeology that has been kind of helping us understand how ancient Technologies actually look this ice patch archaeology It's a kind of a global phenomenon that you find all over the world and The objects I'm going to be talking about today come from ice patches and then the southern Yukon And these are very specific task-related sites that we understand as task-related sites They're hunting sites where people were hunting mostly caribou, tinhorn sheep In alpine areas and occasionally bison so everything I'm going to be talking about there It's function was a hunting tool from this type of hunting site And they're preserved because they got lost in these these snow-drifting sites. So What can we see I'm gonna I'm gonna sometimes, you know, we find a lot of very well-preserved things in ice patch Archaeology we've got very lucky last year. I hope this video plays just so you can see What it is that we found? melting Out of the ice you want to see that again just There it is that's a that's a two meter long perfectly preserved hunting dark every bit of the thing was completely intact And it melted out over out of ice over about a three week Period and we were quite fortunate to collect it and it it remained in that in that condition For 6,000 years, so it's a 6,000 year old hunting dark And it is a fine that is kind of 20 years in the making ice patch archaeology and Yukon started about in about 1997 when a hunter turned in this small piece of wood and Yukon territory wood bone all these Organic materials they really don't survive that well. It's a very acidic environment But when we found this it was radio carbon dated to be about 4,000 years old And we realized that we were looking at the part of a hunting tool That was probably related to this this Athlatl type of weapon throwing dart something that we'd only imagined we returned to that site and we We excavated or we let melt the rest of the object out and it was a almost complete 4,000 year old dart So a little bit about what an Athlatl is. It's a a lot of people know it It's we call it a throwing dart It's a spear kind of like what this fellow is holding there spear propelled by a lever. You can see it in these kind of more traditional Aztec drawings And it is a technology that's a regionally extinct in the Yukon from our ice patches We found that hundreds of little fragments of atlattles and and our oldest one is going back now about 9,500 years before present made out of wood and but the technology in this Part of the southern Yukon it disappears abruptly about 1100 years ago and people transition start using the bow and arrow Which is a technology that people in Europe and Siberia and Asia have been using for a very very long time. So our Throwing their collection. It's it's fairly variable and I guess that's the point I'm going to try to drive home to you today Is that there's a lot of variability and a lot of what I'm talking about is mostly from collections that aren't as In fact is that one spirit just showed you from fragments more or less complete pieces Very small fragments of pieces, but there's kind of two things that unified what a throwing dart or an atlattle is Every specimen we have has a dimple of the very proximal end where the hook for that throwing board that I showed you in that Aztec representation goes there's a dimple on every one of them at the end where the where the floor was put in there and Almost every single one of them is tipped with a stone point But between those two parts of the object. There's actually a very surprising Array of variability things that we wouldn't have imagined would be present you know in 1996 so I'll start off with this very Great infographic that someone else made but these are you know after studying these for 20 years We've we've come up with more or less three types of darts So at the top you can see a one-piece dart Most of these are made from Saplings the types of wood that we find in this collection are extremely limited we find willow which is salix birch batula and Spruce wood which is PCA all the one-piece darts are made out of saplings We also have darts with four shafts and what we call segmented darts and a lot of these that other two Categories are made up using different carpentry techniques and different materials. So There's a picture of a one-piece dart that's melted out in various fragments It's this one is willow. It is you see there's sinew lashing Tying things together the point is held in with sinew There's a little bit of fletching at the end all of our throwing darts appear to be flesh But this is a one-piece one piece of woods Someone found a a tree approximately the right size cut it down and made a dart out of it More commonly in our collection we find darts with with four shafts and segments So how I just define the four shafts is a little bit different than we might expect the first way Find four shafts is when there's a piece of the dart that's made Material and in our collections the different materials that we do find to make four shafts are either antler Probably from caribou or bone. So so here's an example of some of the four shafts that we find on Specimens like this one. There'd be a stone point there and that big bar I don't have a stone point in the end of it some of our Ossius four shafts are very Complicated and beautifully designed We also have ones that are much more crudely designed like this one It's just kind of roughly half that of a piece of antler and there would have been a stone point Tied right in there and this end would have been tied to the the within throwing dart Here's an 11 and a half thousand year old example is actually found in Alaska But you can see how these types of four shafts work So this is elk antler and these stone points are just tied right on the end of them Not even in a little u-shaped notch Some of the we've got two projectile points that are Ossius in our collection and aren't designed and some of you will Enjoy this one not for the bi-patially chip stone points, but for microblades. So we've got two of these things This is an 8,100 year old four shaft It's got slots on either side a little piece of art and I have made this This crude Bracket to show how the microblades we think have gone into these things always when we look inside those slots There is little chips of rock and also a lot of screw steps So people were gluing those little pieces into the into the four shaft another way to find four shaft is when The the four shaft of the spear is made from wood, but the wooden part is designed to detach so and a lot of our collections will find This little Chronicle hang at the approximate length of the four shaft There's a projectile point if it's designed to come apart I call that a four shaft and it is I'm not sure if it's a Interesting distinction or not, but we do find that most of our darts are actually segmented darts So this is what I call four shaft but we also find a lot of Elements of these hunting spears that we now call segments and it's because they've got what is they're attached Using this carpentry technique called the scarf and I'll show you a bit what that looks like so Segmented darts could be made of two pieces of wood three pieces of wood four pieces of wood However many pieces of wood are all tied together at these segments sinew and two scarf joints hold the spear together So that's actually surprisingly common variant of the throwing dart and that scarf joint must be pretty From an engineering perspective pretty strong because we even got one dart That's got what my predecessor great hair called an aft shaft So that scarf joint is right at the very back of the dart So imagine the kind of a force going through that Throwing spear when someone whipped it in that little and that piece of wood is about this the thickness of a pencil A lot of our collections some all of our all of our throwing dart collections appear to be flesh so we we identify fleshing either from sinew and little fragments of feather being stuck in the sinew but more commonly when we're looking at the wood you can see the staining of the the sinew and the paint on the on the proximal end of the dart where the fleshing was intact it's very Difficult to identify the types of feathers that we see because they're so rare We don't want to hack them up and do the DNA on them. We see two types of fleshing on our darts More simple one is where someone will take a long feather and they'll they'll just tie the feather on at each end of The of the feather and it creates very simple flesh We're not sure if this is designed to make that the throwing dart spiral in the air a Second type of fleshing style that we find and it's a it's a sample one that we see in the six thousand year old dart but people are Seemingly also making more complex fleshes that make the throwing dart spiral in the air much like an arrow might so What they're doing is there they're clipping and cropping the feathers. These are eagle feathers They're tying the feather on multiple points on the dart as well as wrapping it on the end You can see that they're piercing the the quill of the feather to get those in there. So a very very interesting and complex process for making the fleshings on these darts so and I think I'm gonna Conclude pretty quickly But this is the state that we found this hunting dart in and just to get an idea of you know The type of variability or the complexity of the material use and some of these collections And it would have been present in in in all sorts of ancient ancient country gatherer collections even here in Europe I'll tell you what we know about this spear today So this is a spear that it is made of three segments of birch wood the birch is derived from a tree that was Split into four pieces and then carved down into states Each individual piece tied together with sinew wrapping. We don't know where the sinew is coming from but probably caribou or moose It has got a projectile point tied in All the sinew's on this piece Are treated with a preservative and that preservative that we've been able to identify is castorian Which is a secretion that is coming out of a large you kind of a Lake road of the beaver And it's a very waxy secretion the beaver will rub it all over itself to waterproof its fur People were using that same product to water treat We believe the city is on there. They're hunting that are there is traces of ochre on this material So ground ochre for paint in the half the projectile point people put raw spruce sap in there the form of blue These fletches are made from eagle feather and you can see they're designed by taking each feather Cutting it across cutting the quilt across the end and then they're making these triangular little clips in there each feather is is laid on the The same face of the diameter of the spear and we believe that this type of fleshing is designed to give this spear a counterclockwise Spin in the air. So it's a it's a beautiful piece. Very lucky to have found it. Anyway, that's my thought Thank you. These are my collaborators


Hello, everyone. As mentioned, I'm Zach. You can find me pretty much everywhere at Stiza. And I am one of several people working on the integration between NPM and Sixdoor so that NPM packages contain verifiable links back to their source code and also their build instructions. As we've undertaken this work, there's a couple of issues we've uncovered with OIDC tokens. So I'm here to talk about some of those things to be aware of as you work with OIDC JWTs as well as point out some problems and at least one case suggests some possible solutions. I think that lots of people in this room know this better than I do, but just to kind of zoom into the one specific part that we're talking about in the Sixdoor ecosystem, this is the so-called keyless signing flow. So you're in a cloud CI-CD system. You're building your NPM package. And then in order to get your signing certificate from Fulcio, you call Cosign Signed. You include the OIDC JWT from your CI-CD system. And then Fulcio looks at those attributes, burns it into the sign certificate, which it returns to you, and then you can attest to those build properties. So in particular here, we're talking about the OIDC JWT that comes from the cloud CI-CD builder that you send to Fulcio. So what does that look like? I was actually scooped by others at from Sixdoor. I think he was the first one to put the OIDC JWTs up. This particular example is from GitHub, but it's important to note that our implementation in NPM is going to work with any cloud CI-CD provider that supports OIDC JWTs and has specific properties. There's a link on here to the GitHub docs. I should have posted a link to these slides. If you go to coffeehousecoders.org, I've linked the slides there as well, and I'll put them in Slack after this talk. There's a number of attributes on the left that Fulcio is already looking at that we're going to talk about in more detail. And then I've added some additional attributes on the right. In the different providers, these fields have different names, but we're hoping to work with all cloud CI-CD providers to provide this information in one form or another. So the first security consideration I want to talk about is data privacy. This is a very tricky one. So first of all, just to highlight, there's some things in here that you might consider PII. Of course, if you're part of an open source project, this information is probably already in your public source repository, so it might not be considered that sensitive. But some governments are talking about a right to be forgotten that we'll come back to in a second. So I just wanted to highlight here the name of your branch, the name of your account, the name of your repository, the name of your build workflow, and also the name of the file of the build workflow. And so less so for open source, but maybe if you're using this for an inner source or other enterprise application, you want to be careful about sending this information to public servers. Other people will be able to see it. It's not exactly clear what a right to be forgotten means in this context. Certainly people are voluntarily sending this information to Fulcio, but then in the future, if they don't want this information to be publicly available, it's not exactly clear what that would look like. So I think that's going to be an ongoing conversation in the community, how we might support or handle those types of requests. The second consideration is a custom audience. Sixdoor is doing a great job here, 10 out of 10. When customers or when people are provisioning these OIDC tokens in their cloud provider, we want to ensure that they are doing so with a custom audience. This is so that you can't use a token from one compromise system to another one if someone was able to compromise one of the systems that's receiving these OIDC tokens. The cosine already handles this for you. If you're using the workflow instructions, it will call into the APIs to ensure that that custom audience is there. But if you're operating a cloud CIC provider, be sure to allow people to do this customization. And then if you're building some sort of integration, ensure that you're using some sort of unique string so that people can take a token and forward it on to another service. And then the last issue, I don't have a great solution for. So in addition to having the repository name or the organization name, those resources can actually change. Maybe a company gets acquired. Maybe a personal project becomes a company project. Maybe someone just decides they don't want something to be open sourced anymore and they delete it. So the way this is being handled currently in the GitHub OIDC token is that in addition to including the repository and the repository owner, we also include these fields repository ID and repository owner ID. And if the resource is deleted or renamed or otherwise recreated, we guarantee that this value will change. What exactly we do with these values? It's not clear yet. Full CO isn't looking for this information yet. Arguably, this isn't something that six doors should have to solve. Maybe this is something that package managers should consider as they're accepting these signing certificates. And I would like to discourage us from saying that end user should handle it. That they probably already have enough to worry about. It'd be nice if we could do something that more transparently let people know when an underlying resource that an attestation points at changes. And that's really it. Those are three security considerations for thinking about as you work with OIDC tokens. Thanks, everyone.