Hey, hey there doofies, it's Logan M back again for another reaction video and now today me, this guy, right here, because we'll be reacting to Stray Kids. Now I've been thinking for a long time of what to do for a Stray Kids video, I was like should I do another Stray Kids on crack, should I do late Stray Kids speaking English, and I want to do both of them. But then when I searched up Stray Kids and I scrolled down for like maybe 20-30 seconds, I discovered Stray Kids being dirty minded. Stashbodied part one.  Yeah, I wonder what this is going to be like. No, seriously. I wonder what this is going to be like because it's Stray Kids and this is- I think this is just going to be another complete mess, to be honest. That's why we love them. Oh my God. Stray Kids are a mess. So, uh, yeah. Other than that, let's get Stray Into this. I'm freaking excited! I hope you guys are too! So let's do this! Scared? So recently I've been noticing there's trickards are becoming well less reserved. It stresses you out. Nah, heck nah, it's not gonna stress me out. Or maybe it will. Starting with the rain dance. Oh yeah, no, sis, calm up. I'm scared that this might be getting copyright claims, so... Oh, I'm scared! They look like they're going to break my middle toe. Dude, they've already broken my middle toe. Wait... Oh, just stop it! Oh my god, hun. We always appreciate the Woojin or Ujin visuals. Okay, so I have to do a real pause because Chum really throws the kitten straight into the way here. Okay, let's see!  What am I... That is just like... Instant replay! Oh yeah, you better fart. He farted while I was doing that. Nah, they're all doing that because he farted. Whoa! Wait, I do it with this head. Both. You fucking... You meme. Yeah, no, they definitely got them mixed up. You know, whatever. Look at this. Why? Hey, let's go. Let's roll the clip. What's happening? Yeah, I know you're staring at my booty, but come on. Oh my god. Oh my god. Oh my god. Why would you... Wait, I want to see that. So loud? I can't even hear anything. Yeah, no, you're doing a good job of blurring that. Next we have questionable noises.  We go for the mix. Yo. Wait, I'll do a 61 later. Imagine me doing something sexy. Yeah. Since he's... I'd find out wrong if I don't.  It looks like he's ready to kill me. Don't, please, wait. Yes, replay. Let's go. That six machined. There's a thing that nobody would even find themselves in no matter how much they go. Always be straight, kids. They will be. How did he do it? Yeah. Okay, he's kind of like that. No. Okay, we'll do it like that. Damn right. You just whistled at me trying to figure out how to do the... Like... Because, like, I was struggling. I was like, I'm probably going to make it sound like... Yeah. But, yeah, that was a mess. I can't wait for part two. Seriously, I can't wait for part two. I hope you guys enjoyed this video.  Do it and also comment down below what you hate today. And also, subscribe if you guys are new because there will be more Stray Kids content coming to you. So, subscribe for that. And other than that, I hope you guys have a great day. Bye-bye.


Okay, the first thing that I want to mention is that this is not going to be a more serious talk. Usually I have more specific topics that I want to talk on. This one is kind of like a little bit of an overview. It's not going to introduce you to functional programming, but it is going to introduce some concepts that might be interesting enough for you to actually start learning functional programming. So, usually before I start, I first go through a couple of disclaimers. The first disclaimer is my favorite quote from Dilavala. You should make your quote readable because the people who are going to work on your project might not be able to live, and they're probably psychopaths. And since you're in KD community, it's not most likely they are psychopaths because we all are. We used to be all are. The second disclaimer is that I tend to omit some stuff from the slides because it makes the slides too big to actually write the SDD column, column, news, contracts, etc. So, this is not production. It's very cold. Most people are really just for representation purposes to demonstrate the way. So, there are a lot of things that we can learn from functional programming and apply it in Sikos Plus, obviously. And usually when you ask somebody what is a functional programming, they tend to give you their own definitions. The problem is that if you ask two functional developers what is functional programming, you're going to get three different answers. And from my point of view, my answer is just the first part. How are other functions? So, functions that can accept other functions' arguments or functions that return not values, but another function. Apart from that, you have purity. I guess we all know what purity is. Any beautiful state. Okay, so purity if you've never changed anything. So, you don't try to database it on blah, blah, blah. But, those are all mathematical terms that I don't really enjoy teaching. And since I have a long half an hour, I'm definitely going to skip it. The reason why I got into functional programming is an evil I would. A long, long time ago I had to write software for clients for Windows and obviously I did with Linux. And I was a kid. I didn't know that C++ can be just compiled. Maybe it wasn't possible for them, but I had no clue. So, I had to use a really strange language that I'm not even going to mention in the name. And at some point, that strange and evil language got a huge new version called 5.0. And a huge, it was a really huge release. So, you understand your things like for loops that do read, but range for does. Then you get triad resource because obviously they don't know about these structures and other stuff. And the problem that they had with that new release was that most of these things didn't really mean to be the compiler itself. So, they needed to create a new version of the language, a new version of the standard to implement a compiler for something that in functional programming in languages could be done just in the library level. In C++, we had higher order functions in some sense. We didn't have Linux, but we had it since C++ was initially standardised. Since C++ 98, we had the algorithms. All the algorithms, most of the algorithms, accept functions, predicates or something. And some of them even return new functions like SDD bind. Or as it was called before, C++ 11 bind press, bind seconds, or TR1 code bind bits and similar things. And instead of the range for, we could have used just for each or boost for each. And it just implemented the same thing as the evil language did. But on the library level. So we got a single chance with a compiler. And that's why I started investigating functional programming. Because things like these, I love to extend the language that I'm working on. And obviously we had functional objects. We all know that functional object is a class with a call operator. It can be called as if it was a function. So if it crops like a duck and works like a duck, it's a duck. If you can plot something like a fun in the same way that you call a function, it's a function. So the first level in the evolution of a functional programmer is view views. So just use the tools that you're given in a completely unlawful and evil way. So the first thing that I started playing around with is the lazy evaluation. So C++ by default doesn't have lazy evaluation. The idea is, for example, just imagine you have a value that is really expensive to calculate. Like the answer to the meaning of life and everything. And you don't always need the answer. In some branches you will need it, in some branches you don't. And you can create a chain of if-else statements. You can create a function or something else. It would look ugly. Instead, you can just extend the language to support a new keyword called lazy. Open brackets, close brackets, and you just define how the value should be calculated if it's needed to be calculated. And this is completely valid in C++. This compiles and works, but how? So the first step is to create obviously a function object. It's called lazyVal. As an implementation it is going to get the function object as the template parameter and it is going to store that function object as a member. And then, okay, we don't care about new taxes. We just need to define a cast operator to the result type of the function that we got. So if you define the lazyVal and pass it a function, if you extract the return type of that function, and it will create a casting operator to this type. As soon as you want to get that value, that value will be calculated cash inside the lazyVal object. And since, okay, before C++ 17, every time we had the template class, we needed to create a main blah, blah, blah class function because the template argument reduction didn't work for classes. Fortunately, this is fixed in C++ 17, but we could have created a lazyVal function and we could call it like this. But this is still quite valid. The first slide that I showed was a keyword called lazy. And when we want to define new keywords in the language, what do we use? Just like Qt does. Everything in Qt is a macro. So here we can define a really, really simple macro. So a structure called makeLazyValAlper that will just define the operator minds. Does anybody have problems with this code? This is really evil. So in the previous slide we had makeLazyVal and we had too many brackets, and we hate brackets. How can we remove a single parenthesis from a function call by replacing that function with an operator? Because when you call an operator, you don't actually need to open bracket to close bracket, right? So we're going to replace a function with operator minus. Why minus? Because, for some reason, operator minus is his favorite. The operator is small. I decided to call it sir. So what is the idea? We have the lazy object and we have the operator minus. So whatever we pass to the operator minus will be the function of the lazy calculation, right? And we just need to create a macro that expands the minus and to a lambda f. And after that we can normally just write lazy. What we need to do is to create the helper instance. Then it will write minus. Create lambda head and everything that goes out where the system also goes out. And this is the abuse part. And I guess it's quite obvious why it gives use. You're using the language for something that is obviously not initially meant to be useful. But fortunately we have the evil macros and we have the operator overlooking to abuse it as much as we want. And apart from the fact that this is really an evil thing to implement in this way, it's really useful. Just like for each input was really useful. Again, a library feature. So the next step was, okay, so I can't improve my normal imperative code, but it's still not functional programming. Okay, I have lazy, but that's just one single part of Haskell. And most of functional programming I mean these aren't even lazy, so it's not really functional programming. The main benefit from functional programming is that people who love FB claim that you can write much shorter code than normal imperative developers do. So in 86, this is one of my favorite examples, a doubt mode was asked to write a program that lists the frequencies of words and writes out the most frequent words in some text. And the guy wrote Haskell solution 10 pages long. It was extremely well-documented, beautiful code with no data structures that he created just for that reason. And after that, the ACM journal used to ask somebody from the audience, again some really famous computer scientist to give a critique of Donald Trump's code. And obviously, when you get to critique Donald Trump's code you need to really, really have this try to do it. And Doug McCleary just sent a response with six lines of Unix-Schelzburg. So, 10 pages of beautifully documented Haskell code versus six lines of Unix-Schelzburg. Obviously, this wasn't as efficient as Donald Trump's code, but just look at it. It fits in one slide and it's almost readable if you know Unix-Schelzburg. And at the point of functional programming, Unix-Schelzburg and the pipes are really, really a functional concept. You have input, then you define a series of transformations which you want to apply to that input and you get the result. So, apply a function, apply a function, apply a function, apply a function, you get the result. Not taking about four loops, where should I store the variables or anything else. In C++, this is obviously not going to be as short as this example. But one of the things that is becoming more popular is the concept of ranges, who has heard of ranges. So, the idea is there is a huge problem with standard algorithms. And the problem is that all of the algorithms receive iterator pairs, return one iterator, which is not really composable. Or, to be honest, they're composable in a little bit different way than what we would want. So, for example, if you wanted to filter out the collection and then sort the remaining items, you really need to create a temporary vector to put the filtered items. Then you're going to need to sort it, then you're going to need to return it. And that's not how functional programming works. You should never be forced to create a temporary variable if you don't need it. You don't need to force the compiler and explain, okay, I need a chunk of memory. So, the ranges should solve the problem with algorithms by just essentially joining two iterators into a single entity called the range. This is a little bit of a lie, but trust me. So, the idea is that if you have a range, you can pass it through a transformation filter. It will return the range. Then you can pass it to something else. Then you can pass it to something else. You don't need always to keep the pairs of iterators. And how would you deal with the problem that don't have? You have a text. It's a range of characters. So, it's some data. What can you do with it? You can replace all the special characters, commas, spaces, and everything else with better chance to denote the end of the word. And you can do it. We all know the standard algorithm will transform. The algorithm on a radius does essentially the same, but a little bit lazily and just provides a view. It doesn't actually transform anything. It's just a view over the original data. When you traverse through the view, it will calculate each item we need. The next step, because we want to count words, we don't want to be dealing with uppercase, lowercase. So, let's transform everything to lowercase. Again, this doesn't do anything. It's just creating a new view over the old view over the data, something that I really like. Anybody who wants to have a hicker and likes stacks of transformations will like it. The task maker is worse. The next step, we cleaned out the data, so now we need to answer the words. We can just split the original collection over the better chance. And we get a range of words. Again, still no transformation happens. This is, again, just a view. You still have the original data structure, the original collection, and a couple of view defines all of it. After that, we want to sort it, group all the same words. After sorting, grouping, just transform, keep the word and it's count. Keep the word and it's count. Then again, sort so that we sort by frequencies. Reverse because sort will sort from 1 to maximum instead of maximum 1. And then take as many results as we want. Most of these transformations are just views. So, if you don't actually evaluate anything from them, they will never execute any code. The only different transformation in sorting, because if you want to have a sorting collection, you actually have to access all the elements in the check, which is the minimum and then the linear sorting. So, if the main library wasn't a little bit misdesigned, this code would compile. And this would be the equivalent of 10 pages in Pascal. So, to recap, we have the data. We clean out the data. We separate all the words. Sort the words. Then group by. Group all the same words into a range of ranges. And then count each of the words how many times it appears. Now, this is less efficient than it can be. We could use a hash map for group by and count, but this is much more real. And this is the solution that you will see if you're really showing in Pascal. With quite similar syntax. And how much time? I'm really fast. So, the next step, obviously when you start shortening out your code, then you'll hear about this thing called purity or immutability. And then you try to think of, okay, if I cannot change a single value in my program, how can I write anything useful? And it's something that is really hard to record head around the first time that you see it. And I'm probably not going to help you, but maybe it will be interesting enough for you to investigate together. So, if you... Yeah, I'm going to talk about financial transparency. What's the problem with problem state? There is a real nice quote by John Carmichael, he said that it's really difficult for us to think of all the states that our program can be in. And it's especially difficult when we have threading. So, the fact that we have a mutable state, which can be invalid in some cases, which we need to control but unlocks, it's a little bit of a problem. If we don't want to care about letting immutaxes, we have to have immutable data. If we cannot change data, we don't care if 10 different people are accessing it at the same time. So, just a simple function like this one has a lot of side effects. So, when the user clicks on something, what happens visible, become visible? After that, the data needs to be loaded then we are connecting to the database to be able to show it in the form. And then when the user clicks something or changes something in the form, it needs to connect back to the database. And this has become a little bit over complex with the arrows for a really, really, really simple example. So, the idea of functional programming is that you should never access data from somewhere. That you should actually, if you want something done, you should ask the person who has the data to do it for you. And the first part is that this is not only a functional thing. This is written in one of the most famous object-oriented books called Objecting by Unholy. So, even object-oriented components think that we shouldn't mutate data but pass it on to somebody who actually does the work. And, sorry, I lied. This is from somewhere, but I don't talk from there. This is the thing that is from the book. So, David Vest calls all of us who write follow-ups and the usual programs to be procedurally able to create procedural developers. The fact that we are using classes and everything, we are mostly using classes as a data container with some validation. We still are not thinking in the same way that object-oriented world should process the thing. For example, if we wanted to create a class for the dog, we would first create yet what is the height of a dog. We would create a setter, what is the height of the dog. Then we would create what is the color, set what is the color and similar stuff. If you have a real dog, can you tell it, okay, your height is now 12 centimeters. Your height is now zero. Your height is now, I don't know, two meters. No, you can't change something that is incorporated into the dog. You can feed it. You can feed it. Okay, it will grow out, but you can't tell it, okay, and now your color is right. Essentially, the objects, if you want object-thinking, you shouldn't design them as simple data containers. And that's something that really goes well with functional programming, and all these words are actually from object-oriented people, not from FB. So, besides that, object-thinking will lead to object-invitability. So, even object-invitability development will lead at some point to invitability, but the problem is how? This is the way we usually think about the world. If you want to change something, we change the world that we are in. The alternative where, if you want to declare the world immutable, you cannot change this instance of the world. And this is something that has been covered in SF and in ancient Greek philosophy. Every action that we take doesn't change the current world, but creates a new parallel. So, the idea, okay, flash.  In that way, if somebody still has, if somebody still is in the old world, it can continue living in the old world. Nothing can just get changed. No mutex is, no data, mutual data sharing, not nothing. If you create a new mutable variant, it will again never be changed after that. Everybody who uses that one will always see the persistent data. Okay? So, you can imagine something like a git. All the previous regions in git are read only, let's say. And the new revision that you create is the new world. If somebody still uses the old master, nothing changes. Okay? The problem is that creating new worlds is expensive. If you're always copying the data, copying the whole world just to change one little thing, it is going to be really inefficient if you are using the normal data structures. The first thing that you can do is just to disallow copying and force the compiler to force you just to use moves. It will be legal, because when you move from an object, if you're using it after that, it's undefined behavior. So again, there will be no data sharing for the mutable state. But again, this is just a syntax. How can you forbid somebody from copying the object and always having to write, move when you want to change something? But again, this is not the point. This is something that would force your compiler to essentially force you to think about changing the role, but it's not what is usually done in FB. In FB, instead of using normal data collections, you want to use persistent data collections. So collections that are really extremely cheap to copy extremely cheap to copy with a notification. And one of the, I guess, most famous programs that does it is Photoshop. Vice Photoshop in my head is that at some point the old about said that he doesn't see any point in functional programming because how can I do anything if I can't change a single value in my program? And he's working on Twitter, the direction back to Photoshop. And that's the reason why I like to mention Photoshop as the example because a similar program just done in a completely different way. So how do persistent data structures work? First we will start with the list which is the worst data structure that you can imagine, but it's the simplest one to explain. If you have a list and you promise never to change this instance of a list, what is a list when you prepare the item to it? You get the old list. You get a pointer to just a new element which points to the old list. So the copy is extremely cheap. The program still has the old value. The program still has the new value. Sure, a lot of you have done this thing, but not a few have done it. Yes, we have come to Appendix. If you want to remove an element, again, you don't need to do anything you're creating only to just point into the second element in the original one. Again, the data is being shared really, really efficient. Appendix is the problem. You cannot just append a single item because it will change all the previous lists and you promise never to change any of them. So instead, if you want to append to a list, we will need to actually copy all the data. And this is one of the reasons my lists are really, really bad. Obviously, the first is the cache localization. Lists are all over the memory, so you're going to get cache validation just by traversing through them. And the problem is that most of the useful functions for a list are just totally inefficient. Just repending and removing from the stack are efficient. Everything else is around all of them. So a lot of functional programming languages are based on lists and obviously, they are a little bit slower because of it. Some of them have started investigating novel data structures. And one of the data structures that I'm going to talk about here is something called bitmap vector free. The idea is that we want to create a collection that has the same optimizations, same complexity for all the stuff like STD vector. And it's not enough. We also want it to be really, really cache friendly. So what can we do? Obviously, cache is not infinite. Let's say cache can collect 32 items of some type. So the idea is if we have a few items in our vector, we are just going to have a bucket with all those items. It's cache friendly, right? It's a bucket in one place in memory. We can iterate through it. We can add an element to it. We can remove an element from it. The problem obviously comes when you fill a bucket and you want to create another one. You will create a new bucket again. When you access the first element, the whole bucket will go into the cache. So it's still cache friendly, even if you have two buckets. But now if you have two buckets, we need to be able to actually keep track of it. So we are going to create another level on top of it which points to the buckets. Again, the level above will also be a bucketed collection. So it's not an infinite collection in the top level as well. Again, it will have its own cache friendlyness because it's a single application in memory. Then if you just keep adding more, you're just going to get higher levels and higher levels of destruction. Now in this slide, all buckets here are the size of four which is definitely not the size that you would use in production. Usually you have the size of 32 which makes the tallest tree will be around six or seven levels. And a lot of scientists consider this to be not only effectively O of something, because it's a constant. You never go above seven. Seven times O of something is just O of something. So what is the expense of appending an item to this collection? So the number of layers and O of O of 1 which is in total O of 1. Appending to this collection is the same as appending to the vector. Now the question is we want to have efficient indexing as well because vectors have efficient indexing. How can we index all the items in the collection? Because the buckets have the size that is power of two. We can use the bitmap representation of the index as the key, which item in which level we should be. So for example, if we have the number for D which is 001110 and we have three layers of our structure. We can chunk the bitmap representation. If we have 00, it will be the index in the first in the top level. Then we have 11, which is the index in the element that we found by going to the first layer. The third element then going to the last one, the index is 10 and we have the access to the element with index 414. Again, what is the complexity? The complexity is the number of levels which is never larger than 7 times O of 1, which is again O of 1. The next step is so far we have considered only mutating the original structure. We didn't talk about how to make them persistent, so all the previous versions should stay alive and we are still using them. If you look at this picture and we have Appended P, what are the nodes that have changed in the original tree compared to the second one? Two blocks have changed. Two blocks, just the path to the item that we Appended. In the last one as well, even if we created a new root, the only items that have changed are the nodes on the path or the item that we have inserted. Which means that all the other items can be shaped.  Again, what is the complexity of that? O of 1 because the path is bound by a constant. And it's similar for appending, prepending, and... Well, prepending is not. What is the complexity of prepending? It's not shown in the picture. It's the same, isn't it? It doesn't matter if it's appending or prepending. Unfortunately, it does matter because if you want to prepend something, you're going to prepend a whole body and then you'll screw up all the indexes for 32 or more. There are optimizations which do fix that. But in the initial state, if you want to insert an element to the front, you'll have the same complexity like that as the director. So it will be all of that. You need to create a new one with all the data moved. Couldn't you... The modules on the front? Yeah, there are different approaches to creating efficient insertions in the middle to the top for concatenations and everything else, which I'm not going to cover, but essentially the structure is strong, is completely wound by one as complexity is conserved as the director. If you want to have efficient concatenation, you can either add the offset for the first element or something that is called a relaxed bitmap vector tree, which is an evil structure that's really cool. Instead of having a bucket containing just the elements, the first element can be a special one that does something special. But that's the more that I'm going to say at this time. Essentially the first item should point to indexes, starting indexes of all the bucket child elements. And that's something that currently, so scull and closure use this thing with the start offset. The scull should probably move to the relaxed version in a couple of part here. I'm going to skip through all of this. So if you compare this to a vector, the indexes of unjust vector appending is often just like the vector in normal case. Updating values since we have the direct line to any index we can efficiently update. So it's also often even in the immutable version. Pre-pending concatenation and inserting in the middle is obviously often if we don't add the optimization. Obviously for more information about functional data structure, one of the best. It's a really tolerable but it's still deep work. For this is written by Kiyosaka Saki. It was his PhD thesis at some point and he expanded to a proper. So let's just return to this for a bit. Most of the data is localized. So it's test friendly. It's a vector-like structure that does the same thing as a vector but has a really efficient copying. Coping with mutation. So it's even better than the original vector. This was a little bit polite but essentially the problem with it is that even if it's all of one, it's seven times of one. So you're going to get a slower access but a constantly slower access. One library that implements this in C++ I think even the relaxed version is called Emer. It's written in C++, it's recently published I think a couple of months ago. And the last time that I did a benchmark against the GCC's PhD vector for the same amount of data, a thousand or something elements, the bugs were really, really, really close. So it wasn't... It's implemented in a really nice way and here's a couple of optimizations that I didn't manage to copy. And that's it. The last slide is obviously shameless self-promotion and thanks to all the KVD for blue systems and a few other professors.


In this case study, we're going to be looking at a particular type of object and that is a cylinder seal. And these were used very widely throughout an area of the world called the fertile crescent. And the fertile crescent is located roughly here. This is where, as you might recall, if you've taken history courses, we also discussed this a little bit back in our second module. This is where we have the development of the world's first cities and civilizations in sort of the western tradition. And we have a growth of early civilization from this fertile crescent area into a much larger sort of crescent shaped area that includes Egypt and parts of Anatolia as well. One of the major sites for these new cities was Mesopotamia, the area that I'm showing you here in my blue frame. Mesopotamia means land between the rivers, the Tigris and the Euphrates. And we also have one of the last of the civilizations of the ancient Near East, the Persians. Ancient Persia is located right here. So this map is just meant to give you some orientation. Now we've focused in a little bit more on the area that we know as Mesopotamia. And here it is framed by my box. The Persian Gulf is this great body of water here. And Mesopotamia, as you may recall, means the land between the two rivers. It's derived from the Greek. Those two rivers are the Tigris and the Euphrates rivers. And as you might notice, this is a very wet, very fertile flood plain. It's not one that has a whole lot of mineral wealth. For rocks and minerals, really people had to go to the mountains that you see to the east in this view. And so that's one of the growing concerns with rock crystal is that it was a precious commodity that had to be brought from outside this area. Early writing developed in Mesopotamia in this time of the first cities. And this writing was a type called Cuneiform, which consisted of wedge shaped characters impressed into clay blocks. And these blocks would be dried. Sometimes if they were fired, they were extremely permanent. And what my arrow is pointing to on the right is actually a portion of an envelope for one of these Cuneiform documents, also made of clay. But you'll notice that it has a whole series of images on it. And these were made by a cylinder seal. The concept of a cylinder seal is pretty simple. It's basically sort of a signature type of thing that's used to seal an official document. And it consisted of a cylinder carved so that when it was rolled over the damp clay, an image would appear in relief. And that's what you're seeing here in this diagram. Two seals you see here are from one of the very earliest civilizations, the Sumerians. The one on the top is from the Sumerian city of Uruk. The lower one is from the Sumerian city of Ur. And you might recognize that the lower one is Lapis lazuli. And the reason I brought these in is that I want to show you some of the facets here of the overall design and the way that it can be used to repeat. So you can see the impressions that were made in modern museums on both of these images. And here, there are the impressions. We have a line here on this particular cylinder seal up above. And this is a crack that kind of goes through and affects the overall design. So take a look at the effect of that crack on the impression of the cylinder seal. And that's a good way of telling what's also carved on the cylinder seal. The earliest cylinder seals tended to be made of fairly soft stone. And as cutting technology, cutting and engraving technology improved, they started to use harder and harder stones. And with the harder stones and the additional amount of work that was required to work with them, we also have higher prestige for these harder stones. And that's where rock crystal comes in, because it's about a seven on the Mohs hardness scale. What you see here is a drawing taken from an Egyptian tomb showing a man doing engraving on a stone. And then on the right, you have up above a cylinder seal, a very early primitive one, and its impression down below. And you can see that the engraving simply consists of lines gouged into this stone that make an impression when it's rolled. This would have been done possibly with a chip of a harder stone like quartz that would be embedded in some sort of wooden or metal tool. It's possible that they could have used a flint stone and simply gouge the marks with it. And some metals can also make marks in the softer stones. And like I said, most of the early versions of these cylinder seals tended to be fairly soft stones. I'm bringing in rock crystal here just to remind you of the sparkle and the clarity and the hardness of this wonderful material that we're dealing with in this particular module. And again, remind you that it was a bit of a high status material for the manufacture of cylinder seals. We don't have many of them made out of rock crystal, but the ones we have tend to be quite large, very elaborately decorated, and as you'll see, some of them actually have some extra decoration. These would have also required different tools for working, and we'll talk about that next. Here we're looking at a painting from an Egyptian tomb showing bead making from stones. And the man on the right has a bow drill and is using it to hollow out beads. On the left you see the other man stringing beads together to form an elaborate necklace.  And when you move the bow back and forth, you can cause the drill and its bit to spin back and forth. And we know from just studying the marks inside of the cylinder seals, because they were always hollowed out so that they could be worn around the neck on like a leather thong, just from studying those marks, we know that they were hollowed out using bow drills. And we also know that for rock crystal, that same technique was used to actually make marks in the stone. It's also possible to hollow one out using flint if you have a softer stone, and that's what they did earlier on before the use of the bow drill. Here we're looking at two views of a rock crystal cylinder seal in the Detroit Institute of Arts, and the impression that is made when it is rolled on a damp piece of clay. And as you can see, we have an incredible amount of detail in this image, even though it's quite small, you're probably talking about a work of art that is about the length of an adult thumb from bottom to top, maximum. And look at all of the detail and the garments of these figures with their arms up. You can make out features of their faces. And also the Kenea form inscription is very, very clear. All of this is thanks to the fact that the artist is using a bow drill with some sort of a disc grinding wheel that has a harder grit like corundum or flint or something that is on that wheel to make these cuts in the rock crystal. And since rock crystal was so difficult to work and required this level of technology, we know that these were extremely high status objects. Here's another rock crystal cylinder seal, and this one is particularly special. You're actually looking at two different rock crystal seals here. One that is mounted within copper fittings and another one that is simply on its own with no mountings. But if you look closely, you might notice that both of them on the inside where it was drilled have little red markings. And this was very carefully painted on the inside with these red marks. And this is a way of emphasizing the fact that we have this clear crystal being used as the material for these. It's something that enhances the qualities of the crystal because we're seeing color through it. And it sort of celebrates and really calls attention to this material. In addition to being a high status material, there was also the belief that rock crystal could bring wealth to someone who had a rock crystal cylinder seal. And if you had a hematite cylinder seal, on the other hand, that tended to lose you a lot of money. So we actually have some sources that talk about the value of these materials. I want to finish by taking another look at those two cylinder seals from the previous slide and looking at the imagery on them. If you look at this impression here, we have probably the name of the owner in the inscription on the right, if you look at the impression. And then we have two views of hero-like figures fighting animals. The figure on the left side fighting the lion is sort of a human hybrid creature. He has bull horns and a tail. And bull horns were often associated with royal power and also with protection from the gods. And it's very common to see rulers in Mesopotamian art from all periods, not just Sumerian art, but Akkadian, Assyrian, and so on, see rulers associated with scenes of animal combat and also adopting some of the imagery of power from animals, particularly horns and tails. Just like in the previous slide, the cylinder seal that we're looking at here also features animal combat or human figures overpowering animals and controlling them. And you can see here two bearded figures with very elaborate hairstyles. These are also signifiers of earthly power and they are clearly overpowering these lions. They have them by the tails on the left. It appears as if the figure is actually riding the lion. And then we also have a small deer in the center. Perhaps they are saving the deer from these more powerful creatures. It's hard to say. This is just a small glimpse of a huge amount of material that's out there. And if you get interested in cylinder seals, most major museums have at least a few. And if you go someplace with a good collection of ancient Near Eastern art, you might see them in the thousands.


In May of 2014, NASA's Dryden Flight Research Center was renamed in honor of Neil Armstrong. So who was Hugh Dryden? Hugh Latimer Dryden was born in 1898, five years before the first airplanes took flight. Hugh was 12 before he saw an airplane himself, and it was a 50-horsepower Antoinette monoplane that could only go 40 miles per hour. Even though it was the first plane he ever saw, Dryden was somewhat unimpressed. He thought that an airship had a much better capacity for cargo and passenger transfer than an airplane. It was an unpopular opinion for a preteen to have, but one that foreshadowed great insight into aeronautics. Two years later, at just 14 years old, Dryden enrolled at Johns Hopkins University. He graduated in 1919 at age 20 with a PhD in physics and mathematics. It was during his tenure at Johns Hopkins that Dryden was introduced to the world of aeronautics, and he grew a job with the National Bureau of Standards. In 1920, he was named Chief of the Bureau's Aerodynamic Section, a post that put him in a good position to direct the Bureau's activities towards his own interests. At the time, Dryden's interests centered around high-speed aerodynamics and compressibility, the phenomenon of air molecules compressing when an object, like an airplane, moves through them at speeds approaching the speed of sound. It was worth pointing out that Dryden was interested in transonic and supersonic flight at a time when the fastest airplanes in the world were barely going 100 miles an hour. This was also at a time when wind tunnels couldn't generate winds fast enough to replicate transonic or supersonic flight. The data Dryden gathered from his experiments with the Bureau was among the first on aerodynamic drag and compressibility at transonic speeds, data that proved invaluable in airplane manufacture and the eventual construction of supersonic wind tunnels. These advances also led to a number of promotions. In the 1930s, Dryden was elected to the Philosophical Society of Washington, was made a Fellow of the American Association for the Advancement of Science, became the first American scientist to deliver the Wilbur Wright Lecture, and became the Bureau's Chief Physicist. With the outbreak of the Second World War, Dryden's work shifted from research to defense. He became head of the guided missile division of the Office of Scientific Research and Development in 1940, leading the team that developed the Bat Missile. A second wartime assignment saw Dryden travel to Europe in 1945 with the Army Air Force's Science Advisory Group under Theodore von Karman. Dryden's background in supersonic flight and missiles made him the perfect scientist to interview captured German engineers about their technology, including Wernher von Braun, the lead engineer behind the V-2 ballistic missile. Dryden's career took a turn in 1947 when he was named Director of Aeronautical Research with the National Advisory Committee for Aeronautics, the precursor organization to NASA that at the time was the leading aeronautical research group in the United States. Like he had done at the National Bureau of Standards, Dryden guided the NACA's research towards his own interests in supersonic and hypersonic flight, and this time his interests lined up exactly with the technology that was available at the time. Dryden began his new job in September of 1947, and a month later, on October 14th, Chuck Yeager became the first pilot to fly faster than the speed of sound in level flight in the Bell X-1 aircraft. Two years later, in 1949, Dryden became the NACA's first-ever director. In this role, he implemented the Unitary Wind Tunnel Plan that allocated joint funding for wind tunnels between the NACA and military and also chaired an Air Force Navy NACA Research Airplane Committee designed to select research programs that could explore problems of piloted flight at high speeds and high altitudes. It was this group that conceived of and stood behind the X-15 aircraft. While the X-15 was still under development in the mid-1950s, Dryden began the shift from aeronautics into space. He became the home secretary of the National Academy of Science, a post that had him reviewing satellite program proposals as part of the United States' International Geophysical Year activities. This made him an ideal member of President Eisenhower's Scientific Advisory Committee on which he consulted regarding the Soviet satellite Sputnik and the question of who ought to lead America's space efforts. Dryden testified before Congress that the United States needed a dedicated space flight agency to respond to the Soviet satellite. He even outlined exactly what this new agency should do, anticipating the NACA's transition into the new National Aeronautics and Space Administration. In spite of his leading role in the country's aeronautics research programs for decades, President Eisenhower passed over Hugh Dryden when he named NASA's first administrator. He selected instead T. Keith Glennon, former president of the Case Institute of Technology. Glennon accepted the post with NASA on one condition, that Dryden serve as his deputy. Though he wasn't the agency's figurehead, Dryden was instrumental in helping NASA gain a steady footing in its early years. He negotiated launch support from the Department of Defense, arranged for NASA to take control of the Army's F-1 engine development program, the engine that eventually powered the Saturn V rocket, and oversaw transfer of Caltech's Jet Propulsion Laboratory and the Army's Ballistic Missile Agency into the new space agency. When President Kennedy was sworn in in 1961, he brought with him a new NASA administrator, James Webb, and Webb agreed to the appointment only if Dryden stayed on as his deputy. Dryden accepted the position and threw all his energies behind the Apollo lunar landing program, though he never saw it come to fruition. Hugh Dryden lost a four-year battle with cancer in 1965.


Thanks, Ryan. And with the trade deadline quickly and fast approaching, we got to bring in our own Michael Scott with Hoopsight National News going on right now. And I first have to ask you about Kyrie Irving. As we learn about the future of Kyrie Irving, what was your reaction to hearing about a potential trade? You know, I think making the first thing that stuck out to me was it was underwhelming the duo between him and Kevin Durant. Ultimately, they won one playoff series, so did Darren Williams beforehand. A lot more was expected of this duo from not only themselves, but from the public and management here as well. Ultimately, I remember talking with a source close to James Harden when he got traded. And at the time when Harden wanted out, the source told me that you couldn't trust Kyrie. And that became evident over the years with Kyrie. He had missed games. He missed half the games pretty much that he could have played in. And looking at a trade request now after this team was on such a hot run, it seemed like a little coordinated because when the Los Angeles Lakers got Rui Hachimora, it took away some of their cap space looking ahead towards the summer. So that kind of put it at a needle-moving point for Kyrie because that would have been leveraged against the Nets in free agency down the line. So either he was going to get his money from the Nets in an extension or you go to a team and you can use his bird rights in a trade to go over the cap and get him. So once the Nets and Kyrie had extension talks for about a week, a little plus, and it didn't materialize, it was time to go. And now as we're still learning some more information about that and we'll get that in the coming days and coming hours. But when you look at the Nets roster right now, what stands out about the future of this team, especially when they finish out the regular season? Yeah, there's still work to be done, Megan. I think certainly for the Nets looking into the front court, if they can, I think more towards the buyout market we've seen in the past when they've gotten the Marcus Goldridge and Blake Griffin. Unless they go big game hunting with a guy like Pascal Siakam, who they have expressed interest in, you know, Toronto previously looked at Nicholas Claxton last year for a first round pick for him. He's a guy certainly they would want in talks and a boatload of draft picks. We've seen Rudy Gay, excuse me, Rudy Gobert set the market and an exorbitant wanted that for draft capital for star players. Pascal would be a great fit here, but they've also had other talks, Fred Van Vliet as well. Ogy and Anubis been a guy that they've liked. It's interesting though because they did get Dorian Finney smithing the deal. One of the most versatile two way defenders, three and D kind of guys in the league and he's got good size, which they've been lacking a little bit here. So I think for the Nets a little bit more front court you can look at as we move close to the trade deadline and especially the buyout market. If they don't land the front court guy via trade, what other team are you closely looking at that could be making some moves? Well, Meg, I think first off, if you're looking at the trade deadline game of poker, I think the Toronto Raptors are certainly the dealer right now. Pascal Siakam, Ogy Anubis, Fred Van Vliet and Gary Trent as well, who's another guy that's going to command over $20 million annually in free agency with him expected to opt out of his player option. Ogy Anubis had no shortage of suitors, the Phoenix Suns, the New York Knicks. Though I don't think Ma'Sai's necessarily looking to deal with the Knicks given his relationship with them. The Memphis Grizzlies, you're an old stomping ground as well. Dave certainly got a boatload of draft picks, a Canadian swingman at that in Dillon Brooks that they can dangle and Danny Green's expiring contract for the Suns. Certainly plenty of draft capital and I know that Chris Paul got dangled a little bit in the Kyrie Irving talks. I don't know if he would go in a deal for Ogy, but they've got pieces as well. And with Matt Ishpia coming in, the new owner for the Phoenix Suns, I've heard from people he is looking to make a splash. No better time to do it than come on in and right at the trade deadline when the Phoenix Suns are a team that's looking to be a title contender. And lastly, sticking out in the Western Conference, I look at the Utah Jazz. I look at the Utah Jazz because they've got Mike Conley, who's drawn interest from the Los Angeles Clippers. They're certainly looking to upgrade. Looked at Fred Van Vliet as well. Distantly, Kyle Lowry a little bit too, due to his relationship with Kawai Leonard. And the duo of Malik Beasley, one of the top shooters in the league, the top three-point shooter off the bench. And Jared Vanderbilt, a wonderful power forward who can rebound and hustle with the best of them. Those two have been linked together in a bunch of talks, certainly with the Atlanta Hawks for John Collins, with the New York Knicks for OB Toppin, Evan Fournier in draft capital. There's a lot of moving and shaking out there. And Utah is kind of in that middle right now where being 500, they've defied expectations from the outside. And privately, I think they would say their own as well. So they've got to decide if they want to go into the Victor Wembenyama sweepstakes and really get as many assets as they can down the line or punt and look towards next year or the off season to make those moves. But those two teams, Meg, I think there's no question that they're the dealers right now. No question. A lot to follow. Could this be the wildest trade deadline week that we've seen in a while? I think so. You know, it's funny, Meg. Leading up to it, it was, oh, it was a lot of quiet. There's not a lot going on. And that's when it's going down because normally when it is that quiet, GMs are trying to get things done and hammer out deals. A lot of times you'll see things leaked, whether it's from an agent or an executive, and that's leading up to it to kind of move things along and up offers elsewhere. I think right now we're seeing more everybody going into their offices, shutting it down and trying to hammer out deals. And certainly Sean Marks is going to be one of them. He's got a lot riding on this trade deadline. You've got the happiness of Kevin Durant, who, you know, debated leaving here, came back, has been everything that they wanted on the court. He's been fully committed. That's one thing you can never question about Kevin Durant, his love for basketball and his affection for his teammates and trying to win. So I think you have to, in a way, do right by him. Certainly, from the outside looking in, you talk to other executives around the league, the loss of Kyrie Irving on paper hurts them, hurts the next chances, even though they added their depth. So I do think there could be a swing for the fences move here. At least they will try, Brooklyn. You know, like I mentioned with Pascal Siakam, I think that would be certainly a blockbuster move. So time will tell, but definitely looking forward to it for sure in the coming days. And the phone's going to light up like Times Square on New Year's Eve, Meg. Michael, it's going to be a busy week for you. And now, as you see, Ryan, this is why we had to talk to him and break all this down. Let's send it back out to the studio.


Okay, so it's time to say thanks everybody for coming. I'm Andy Farmer and today I'm going to be talking to you about a way we can make it easier for our therapists to interact with the application by the application giving a helping hand to the best. When we're working with our tests, quite often we'll find that certain things have to change fairly regularly, so it might be that UI changes or it might be that something we have to do changes to the actual method, the task that we have to perform and change. And what that can lead to is a change happening in the application and all the tests. That's one of the most common complaints about testing information is that the tests are brittle. But it's not really that the tests are brittle, it's more that there's not enough communication between the people who are doing the testing and the people who are writing the application. How many of you here are working as testers? And how many of you here are working as developers? And how many of you are in a separate test team? So that's pretty good, not as many of you in a separate test team. Are the rest of you in an agile team or a team where you have the developers and testers working together? Is that the case? Yeah? Okay. So when you're working together in this team, do you all work together in the three amigos? So you have an analyst and developer and a test worker together? All of you? Excellent. Okay. And when you're doing that, are you helping to write the application code and are the developers helping to write the test code? No? Okay. So then where it's called the three amigos, are you all sharing the same thing or do you have different things? Because the framework has happened. You have to stand a little bit farther away from the speaker so that you won't get a feedback.


A leader of the all-progressive Congress, APC Delta State Barrister Wesley Tusson looks confident that the APC and the governorship candidate, UVA Omar Gege, will pledge power from the ruling PDP in the state in an interview with our correspondent, Friday Apple Magero in Asaba, the state capitol, Tusson noted that Omar Gege has a sound character and was selected through the view of the people and not money bags. Maybe a system or a charade that has brought somebody into power or as a flag bearer, you can see what is happening. No money here spreading around. This is the will of the people to bring, to vote for somebody who would believe in their hearts that would deliver Delta State from this present charade that would present their spirits. Delta State should please watch out. They should lose faith because what everybody is saying in the social media now is the way money was being paraded from the other side. This is what we have here, it is not a bazaar like I call it, it is a process that has been adigarized. Please do subscribe to our YouTube channel and don't forget to hit the notification button so you get notified about fresh news updates.