I want to set up a new pocket base database on fly.io. I've never done this before. And if you've never done this before, then let's do this together. Let's jump in. First things first. I have three paints open my fly.io account logged in. I have the documentation for pocket base and then a terminal. And I already installed the fly CLI some time ago. So let's go to frequently asked questions. The first one is, do you offer hosting? And they recommend fly.io with this example. It says we need to create a pocket base Docker file. I'm not exactly sure what that means yet. Don't really know much about Docker, to be honest. I've already installed fly and I have an account. So I just need to log in. So it says navigate to the directory where the Docker file was created. So I am going to copy that and just make it wherever. But I don't even know what they're called. So I think we just use Docker file. So touch Docker file. Well, then that pieced in what we had before and write that out. Let's run that fly control launch command and see what happens. So it detected our Docker file, choose an app name, leave blank to generate one. Yep, we're going to be in Los Angeles, California, created the app, broken morning 148. And then that lives at fly.io by that same project name. OK, would you like to set up a postgres database now? No, I think. Would you like to set up an upstash Redis database now? No, I think. OK, so we wrote the config file fly.toml. Would you like to deploy now? I let's say no. So we run fly control to deploy it when we're ready. All right, so we need to run this command here to set up that volume. Do you still want to use the volume? Yes, Los Angeles. OK, now I'm going to open this fly.toml file, grab this and put it in there. OK, it says it should look something like this. I assume that it does. Let's double check. Yeah, no, it doesn't look anything like that, actually. Let's try and go with what we have generated for us and see how it goes. Final step, deploy. So run fly control, deploy. Now this is doing its thing. So I thought I'd note that it's pretty cool that you can run some backup. So it'll hold a five day backup and then we can run these commands to pull those backups. Speaking of backups, let's talk about my reasoning for choosing PocketBase. I have some very small needs for my personal site where I want to have a database where I can post some basically streaks like how well I'm doing, eating or tracking my weight and all that kind of stuff. I like PocketBase because it uses SQLite. SQLite is an embeddable, embeddable database. And so it's basically just a single executable. And then alongside of it, there's a file with all of the data in there. So it's really cool. It's just these two files. The cool thing about PocketBase is that it actually has this full UI layer on top of it. Now I could use something like Firebase or SuperBase or like whatever, but I don't really like being locked into someone else's service. Theoretically, I could just take this PocketBase and the data and just move it anywhere else. So that's why I landed on it for my personal needs. OK, let's see if it's done. OK, so I made a big mistake and I set this up in my user directory, which is the why it was taking so long. It shouldn't have been uploading all of the stuff in my user directory to the cloud. Let's make a new directory in the code directory called chan.dev. Move in our fly.io file. And the same thing for our Docker file, code chan.dev as well. Let's go there and see what happens. OK, now I'm going to run fly control again and see if I can deploy it from this directory. OK, so this makes a lot more sense when it's sending the build context. That's just 413 bytes as opposed to the like gigabyte or so that I had started to send before cancelling it. So as we can watch at this URL, I'll copy that and it finished the deploy. So let's check out that URL first. This is the monitoring URL. I'm saying the name is Floral Sunset, but let's check out the application URL. OK, code 404 message not found overview. Let's jump back to pocket based instructions. So let's go to documentation here, got everything going. So this is going to serve static content of which we have none. So let's try checking out the admin URL. Go to our site that is empty. I'm going to go to our admin URL. Oh, my gosh. And there we go. So I'll create an admin user right now. And here we are. We have our pocket base fully set up in the cloud ready to do whatever we need to with it. So that's it. Apart from my basic, basic mistake, which I hope helped you. This was pretty easy. I was feeling kind of worried about setting this up and, you know, us doing it together made it super simple. So if you have things that you may be afraid of setting up for the first time that you think would be fun to do with me, let me know. And maybe I'll make a video on it until then. I got plenty of other videos right here that you may find interesting. I hope to see you around and see you again soon.


So thanks for the introduction. I'm going to talk a little bit about TensorFlow in general and TensorFlow 1.0 in particular and talk about where we've gone since we've open sourced it. So first of all, TensorFlow is machine learning for everyone. So basically, it's an open source platform that allows you to use its tool chest to basically build machine learning applications. So one of the things that was really important was that it would scale from research to production. So research is really important because machine learning is really evolving really fast right now. So there's lots of new research. So it's really important to be able to move that into production as fast as possible. And so internally, we have a huge research organization. And we want to make sure that all the research we do can get into our applications as soon as possible. And that's also good for everybody else who wants to use TensorFlow 2.0. But basically, the core tenets of TensorFlow are that it should be fast, it should be flexible, and it should be production ready. And those three things together should kind of sound a little bit weird because usually these are trade-offs. Usually you can only pick a couple of those things to have them at once. But one of the things about TensorFlow's engineering was that it was able to achieve all three of these at once. So one of the great things about TensorFlow is that it supports many platforms. So in particular, you can run it on different hardware architectures like CPUs, GPUs, which are really important because they're so fast that they enable a lot of deep learning applications to now become tractable. And internally, we also have specialized TensorFlow hardware called TPUs, Tensor Processing Units. And other companies are working on these types of things as well. So specialized hardware for these new types of machine learning applications are going to become really important. And TensorFlow is going to be the place that these companies are trying to target. So once you have a TensorFlow application, you should be able to run it on any type of platform. In addition, you can run it on your computer, your Linux computer, your Windows computer now even. But also, you can run it on Android and iOS. And there's some example applications that you can find on our website. In addition, there's lots of interesting examples of people running on Raspberry Pi, really small system on chip, little Linux computers that can do a lot. And these are so cheap that you can deploy machine learning models that you train anywhere, which are really exciting. So multiple languages. So when we came out, we had C++, which is the core implementation of TensorFlow. But most people were building models with Python. And this is still the case. But one of the things that we've done for 1.0 is we've built an API, a C API, that is a great way for other languages that support a C A B I to plug into them. So now we have Go bindings, we have Java bindings, we have Haskell bindings, and there's even R bindings for you statisticians. In addition to the core toolkit, which you can build machine learning applications, one of the most important things is to be able to visualize models, to understand why your models behave in a certain way. So one of the things that we put out with TensorFlow was TensorBoard. And this is basically a web-based front end that can read TensorFlow checkpoints and can actually show you information. So you can put little breadcrumbs into your TensorFlow models that record histograms, that record prints, that record images, and then you can see them visualized in the central place. So this is a great way to compare your models. This example, however, is like a really advanced visualization, and we're moving towards plug-ins where you can actually extend the visualizations to do whatever your domain needs. So in this case, MNIST, which is basically handwritten digits, and you're trying to classify them, what is their actual symbol? What is their number? And here we're seeing a data set where it's been visualized in 2D using a principal components analysis. And what this does is it allows you to see the clustering, the separation that's incurred by the running the model. And you can zoom in, and you can actually look. If there's an outlier, why is this an outlier? By looking at the image directly. Normally you would have to go and you'd have to figure out, oh, it's example number 30. Now let me visualize example number 30. This is just way more direct and really much more exciting. So this is what TensorFlow basically is, but what has it been used for? So if we look at some of the applications that Google's used TensorFlow for, one of them is to increase the accuracy of neural machine translation. So using TensorFlow model, we were able to reduce the errors in language translation from 55% to 85%, especially between English and Chinese, which is very difficult generally. On the lighter side, you can actually do artistic expressions. So stylization is something that machine learning has been used for, typically, but usually you have to train it on a specific style. So you have one style, and you can make a specific model, and you have to retrain it all from scratch. One of the cool things about this research that was done at Google Brain is that you can blend the styles after the fact. So you can say, I want 50% Van Gogh or 50% Japanese wave. And what will that look like? Well, you can try it in real time, and that makes it a lot more approachable. So people are doing all kinds of interesting thing with TensorFlow, and one of the great things about open source is that once you do that, people have applications and ideas that you never can imagine, and it just builds into a snowball and becomes even more exciting. Another area of interesting active research is how to build more sophisticated TensorFlow models. So one of the most difficult things about machine learning is that you have to build the architect. You have to decide for an image model, how many layers should I have? How should these layers interact? What size should they be? How many skip connections should there be for like a ResNet or things like that? And what some of our researchers did was they trained a reinforcement learning which can actually produce a TensorFlow model. So it's like one step removed. It's a model that was trained in TensorFlow to generate a TensorFlow model, and that can give you a much more direct way. In addition to image models, they can actually train something like a recurrent neural network, a replacement for an LSTM that's actually more efficient than an LSTM using, again, reinforcement learning. In addition, we're doing some research on genetic algorithms where you can start from a very simple TensorFlow model that is very bad at classifying images, and then you do a bunch of evolutions, and eventually you end up with something that's very good. Another really exciting area of research is the combination of multiple models. So suppose you have an image model. You might be able to classify that into some set of fixed classes. But what if we combine it with a language model? If we do that, we might be able to actually generate captions. So here on the left, this image was automatically captioned as a blue and yellow train traveling down train tracks. And on the right, a person on a beach flying a kite. And these are really accurate captions and automatically done using, again, a TensorFlow machine learning model done by our Google Brain researchers. So I told you a little bit what TensorFlow allows and what people have done with it. But how do you actually do it? So I'm just going to give a brief overview. You can learn more about this on the website, which is the basic idea is that TensorFlow runs graphs. Graphs of nodes, and each node represents a computation. And an edge represents a tensor, and the node represents some computation. So you might have two tensors coming into an add node, and that would add the two tensors. So the way in which you construct these is usually with a Python program. So on the left, if you have this Python program, it will turn it into the graph on the right. And the advantage of switching it into this graph formation is that it can be scheduled on the computation resources, be them a single CPU, a single CPU, multiple GPUs, multiple CPUs, or even multiple CPUs and multiple GPUs all intertwined. And you have control as a user to do this. And we're also using reinforcement learning to improve automatic placement. If you have multiple compute resources, what should you actually schedule this? Or where should you actually schedule? So that's basically how TensorFlow is programmed. So let's talk about the progress to date, which is leading up to 1.0. So when we started with TensorFlow internally, we hadn't released it open source. The question was, how fast would it pick up internally in Google? And if you look at the graph, really fast. And in fact, it's in a lot of our applications, including Search, Gmail, Translate, Maps, Android, Photo, Speech, YouTube Play, and many others. And basically, all our researchers, many of them, are actually building new models, and they're building them in TensorFlow. So it's enjoyed a great usage internally. Externally, it's become the number one GitHub repository for machine learning. So in addition to that, we can look at the trend since it was open source. That's that really steep point. At the Dev Summit, which was maybe about a month ago, we had 44,000 stars, which is now increased to over 50,000 stars. So that's pretty, that's a lot of stars. What does that mean in terms of interaction? So let's look at, we have a lot of Google developers working on TensorFlow, but there's also been 475 plus unique non-Google contributors to TensorFlow. In addition, we've had 14,000 commits in the last 14 months. And lastly, we've had just a huge amount of engagement, lots of YouTube videos, tutorials, models, translations, and prodigies. In fact, if you search for TensorFlow in the GitHub repository, you'll find 5,500 GitHub repositories that include the word TensorFlow. In addition, we've had a lot of direct engagement. We take the open sourcing seriously. We're not just dropping the code and forgetting it. We're engaging with users and developers who are using TensorFlow. So in particular, we have an active Stack Overflow community of over 5,000 questions answered. And a lot of them have been answered by actual Google engineers. Similarly, we've had over 5,000 GitHub issues filed and answered. And that includes 160 new issues per week as of late. And these are all looked at at least once by us. And so that level engagement has given us input onto what we should be focused on. And it also, I think, makes the community a lot more happy with where TensorFlow is going to have this type of interaction. In addition, TensorFlow has been used for a lot of courses, including at University of Toronto, Berkeley, and Stanford University. So all of this has really happened in the last year, in less than a year. And as I said, the interaction with the community has been really exciting because it has kind of directed TensorFlow. We focused on a lot of things that were requested by the community, Python 3, HTFS support, new versions of CUDA, better iOS support, using Max with GPUs, et cetera, and higher level APIs. So what can we do in the next year? That's kind of up to you. And we're excited for lots of new contributors. So let me talk about the features in TensorFlow 1.0. How many of you have actually used TensorFlow before? So not nobody, but not everybody. How many of you want to use TensorFlow? OK, so that's a lot. So what's happened in TensorFlow? Well, the good news is that we've made it a lot faster. So we've taken a look at the most commonly used models, and we've actually managed to achieve a 58x speed up on 64 GPUs for Inception V3. So that near linear scaling is really good. In addition, we've worked to make the APIs much more flexible. Specifically, we've added higher level interfaces, which makes it much easier to start using TensorFlow. And lastly, we've worked to make it more production ready. We've stabilized the API and ensured some backward compatibility in the Python API. And in addition, we've introduced a serving API, which basically allows you to do a lot of the tasks that are related to taking a model from where you've designed it in research to actually serving it on an actual application. So let's drill into the speed a little bit. So if you look at the speed, one of the things that we've done is the optimized model, which I've already alluded to before. And we continue doing this. We're going to continue looking at the models that people find most important in making sure they perform well, and in addition, trying to make the performance as good as possible so if you write a new model, that it performs well. In addition, in the long term, and even in the short term, we've developed the XLA compiler. And this is basically a TensorFlow that can target this compiler. And parts of the graph that were run as many individual ops can be fused into one set of one op that is backed by assembly code. So you get specialized compilation on the fly, like a JIT compiler, very similar to, say, how a Java compiler works. So in addition, this is also really useful for pre-compiled models and small devices like foots. OK, I'm going to skip that slide. OK, and that one as well. So in addition, we've made the API much more flexible with higher level interfaces. So when we released TensorFlow, it started as this kind of layer stack. So there's the low level implementation of the kernels that are used to implement the individual nodes and ops. In addition, there's an execution engine. But then there's the Python API and the C++ API, which actual developers interact with. What we found is that as people use TensorFlow more and more, they started doing very similar things. They needed training loops. They needed simplified ways of describing their image models. And these patterns continued. And there was several libraries that emerged that tried to make these things easier. What we've done in 1.0 is we've introduced the layers API, which takes things like convolutions, max pools, average pools, and these kinds of things that are used to build image models and also primitives for RNNs as well. And we've put them into this part of the API. And this is really easy to use. In addition, we've built even higher APIs. So estimators allow you to automate how data comes in, how you do training loops, et cetera. And then Keras, which is kind of a standard spec for how machine learning models are specified, has now become something that we're going to integrate as tf.keras, which is going to make it really easy to build complicated models. If you're really interested in what you can do with very little code, you can actually look at the TensorFlow Dev Summit and look at the Keras talk. And it shows how to combine a language model, like an embedding model, an image model, and a video model all together. So it's really quite sophisticated. And it's really easy to do. And then at the top level is canned estimators. When we came out with TensorFlow, one of the things that was really exciting was the inception model, which is a pre-trained ImageNet model that people have been able to apply. So they've been able to build cell phone apps or Raspberry Pi things that recognize images by taking this pre-trained model. And training inception takes some time, but you can take the inception model and you can actually specialize it for specific things. So there's an example on our website which shows how to specialize it for flowers, for example. So if you have some set of images and you want to make this classifier better at that set of images, you can take this canned estimator. And if it's not good enough as it is, you just give it some different data and retrain a little part of it, and that can give you a much better result. So we're hoping to extend that even more and provide more models. And we've also open sourced several other interesting models like the Syntex Parsing Framework, which is really cool. OK, so let's look at the flexible high-level API what enables. So if you look at our Getting Started, which is the first tutorial on how to use TensorFlow, it shows how to use the low-level Python API, but also shows the equivalent in the high-level Python API. And if you compare the lines of code, don't try to internalize this code. The main point is that with a high-level API, you get more result in less code. But if you need to dive into the low-level API, you can certainly access that. So you can start with a high-level API and then go as low-level as you need to, depending on if you're doing really custom things. So lastly, I want to talk a little bit more about the production readiness of TensorFlow. So specifically, TensorFlow, going to 1.0, we did some changes to the API that were not backward compatible. We wrote an upgrade script that allowed us to take pre-1.0 models and update them to 1.0. So if you have Python code that is for an older version of TensorFlow, you run this thing, it will change most of your API calls to the new thing. Now, once that we have 1.0, we're not going to actually change those APIs in a backward incompatible way throughout the cycle of 1.0. So this means that you don't need to do this for a long while now. In addition, if you have saved models, they will also continue to work. And for details on exactly what the backward compatibility strategy is, you can go to the web page listed in the API compatibility section. One more thing in TensorFlow 1.0 is TensorFlow serving. I mentioned that this makes it easy to deal with multiple models, the validation issues with models, being able to deal with low latency requests and to handle all those issues. So basically, if you need to go from research, this is where you should look. And there's a great blog post that details all the things that can do for you. OK, so I've told you what's in TensorFlow 1.0. I just want to go through a couple more case studies that are really interesting applications of machine learning and, in general, in TensorFlow in particular. So TensorFlow at Google. So one of the coolest apps, I think, is this one, which you can translate signs. And this is a good blending of image recognition techniques, language modeling, and also computer graphics, because it's able to recognize the original sign, find the text in it, put it through the language model, do the translation, and then re-render the new text over the old text. In addition, if you use things like inbox smart reply, that's also done in TensorFlow. And the common thing with all these image icons is that they're all Google apps, and they all have some part of TensorFlow and deep learning in them. So TensorFlow is for everyone, though. And now that it's open source, there's lots of interesting things that are coming up open source. So in terms of helping people, the case study of medicine. So one of the things that researchers at Google have been looking at is, in diabetes, there is a tendency to have these hemorrhages in the retina. And if too many of these happen, they can actually cause blindness. And it turns out that if you detect this early enough, you can, there's some inexpensive drugs that can combat this. But the key is detection, and it involves sort of an expert ophthalmologist being able to detect this. So we had a project where we detected this automatically and at a similar air rate as a human doctor. So that's really exciting because it means that more of these cases will be easier to detect and prevent people from going blind. In addition, not everything is so serious. There's things like art, which are being done with TensorFlow. So if you look at music and you have a sequence of notes, what is the next note is the question. So a trained musician or somebody who knows music theory could do this well, but I might not be able to. But the question is, can we train a model that does? So this is the goal of the Project Magenta. It's basically to take about 10,000 works of music and throw them into a model, a sequential model that can predict the next sequence of music. And they had a, like I think you can find it on YouTube, which is a demo where you play a little bit of music and then it tries to imitate you. And one of the neat things that they did in their paper is they did a study. So I'm gonna hopefully be able to play this music. Maybe, yeah. So the idea was to generate Bach-like music. And this is generated with their system. And what they did is they did a user study. They asked people, does this model or does real Bach or some other models sound most like Bach? And interestingly enough, their model was chosen as the most Bach-like. So this asks a question. So why would that be? How can that be? Because Bach is Bach. Well, there's some speculation on that. But one of the things that you could think about is that Bach is an actual composer that goes through different phases and periods. So as they evolve, they change their style. So if you look at early Picasso versus late Picasso, the imagery is very different. And that's similar for composers as well. So in a sense, once you think of Bach, you think of the average Bach rather than all its works. But the computer's view of it is much more precise. So there are some interesting applications, hopefully. And what's new in 1.0? I hope you've enjoyed this talk. And if you're interested in getting involved in TensorFlow, there's lots of things that you can do. So specifically, you can do tutorials and code. It's all available on TensorFlow.org. There's lots of resources there. If you're totally new to ML, you can do the bottom link, which basically is a bunch of YouTube videos that we've prepared, which give you a very gentle introduction to machine learning. There's also a Udacity class that uses TensorFlow behind the scenes, but also teaches you the basics of machine learning. If you want a little bit deeper, a deeper study, you can look at Stanford's CS231 class. And Udacity also has a more advanced machine learning class as well. So with this, there should be enough resources to keep you busy for a while. And of course, you can find many, many other resources on the web. So with that, I'm open for questions. I have a question. Would you talk a little bit more about the status of Paris API in master? Yeah, so it wasn't quite ready in time for 1.0. I think there's basically a change being prepared for that. And it's probably the next month or so, I think. But don't quote me on that. Are these free for the Udacity Nano degree? The Udacity Nano degree, the course is free. If you want a certificate, I think you pay for the certificate. But the learning resources itself is free. But I think there are numerous resources today if you want to get started on machine learning. Yeah. Someone developing for the C++ API, right now it's a huge difference between what it's accessible and why it's not. Yeah, so the question was, basically, is there any plan to make the C++ API more complete so you can do more stuff in C++? And the plans together, I was alluding to the C API and basically becoming more featureful. Once that's more featureful, all languages will be able to be more featureful. The idea is to put as much there as possible. So there were, I think, one of the main things that's missing from the C++ API right now is gradients. And that's an important feature for building new models. So that is planned, and that's under work. And yes, we definitely want to make the C++ API better. Does that answer your question? What do you think are more specific? I think your question is, what do you think are more specific use cases or applications of TensorFlow? Yeah. So I gave some examples. Do you have anything in mind that you, I think the sky is really the limit in terms of what you might be able to do. But a lot of the applications that are most popular right now are sort of image-based applications like Vision, where you have convolutional networks. And that enables a lot of classification. But I think the combination of language and image models is really exciting, and we'll allow more applications. I don't know if that. The other way to also look at it is if you look at that chart where he showed, OK, so many Google products use it. And literally, they're all in multiple use cases.  So it's really universally applicable, and that goes with the tagline of machine learning for everyone. So just like mobile phones and apps can be used in literally every domain, machine learning is nearly at that stage now. Whatever business you might be in, whatever use cases or domain you are in, there is a scope for machine learning to be applied there.  So in a sense, it can do anything. What machine learning applications tend to be good at are things where there is uncertainty or data will help you. Things where you have a mathematical governing equation, so if you have an ordinary differential equation, that's usually done really well with traditional methods or if you have traditional arithmetic, where you can logically lay out exactly what it should do. So anything that you can think of like that would be a good application for machine learning and thus, in terms of TensorFlow. Yeah? Yeah. Can you have a link to your slides? Do we have a link to your slides? I think that I don't have them up online. That's like a separate, we'll have to look into if I can release them. But they will be part of the video, which will be part of it. All this is being recorded anyway. Yeah. All right, so thank you so much, Andrew, for sharing about TensorFlow. Given that we want to set up.


basketball season has officially begun for the BSU women. The beavers are one and oh on their young season but after a 7 and 20 campaign last year they're looking to make a big step forward this season. Beginning her second season as head coach of the beavers, Chelsea Deville says she's pleased with the progress her nine returning players have made from a year ago. Bringing in seven new kids they knew that there wasn't second chances gonna be coming around every game it was get better or you are going to potentially lose minutes or lose a spot and they took that very seriously I'm proud of how they came back. I think everybody's bought in a little more this year than we have the last couple everybody kind of knows the ropes and even the freshman are learning faster than what everybody last year it's not everybody learning it's just a select few. Deville and the beavers added seven new players this offseason but even with four seniors on the roster she still considers this a young team with some growing up to do. We are still a young team trying to mature yet and now bringing in this many new faces that can slow it down a little bit too but I have a lot of trust in you know each kids role when they do it right we just got to put it all together listen to details that she tells us to do work hard put 40 minutes together because we have a lot of talent and we just got to put it all together. However with four returners who shot at least 34% from deep and five six footers on the roster the team believes they can be a force to be reckoned with. This year we don't have a non-thread out there where they can just double down or you know take something away they're gonna have to pick and choose and it's our choice and it's our focus and decision to be disciplined and make the right read out of that. But only if they can consistently play strong on the defensive end of the court. When we do that I feel very confident in how we can potentially make some upsets or you know being more games this year but I'm not gonna give us enough credit until we start proving it day in day out defensively in practice. If you've enjoyed this segment of Lakeland news please consider making a tax deductible contribution to Lakeland Public Television.


Gareth, mae e'n mynd i'r gwleidio atynau. Efallai, Richard yma yn eitom ddweud, yna yn y blynedd? Gall fod ddwy'n meddwl ei wneud yn y brygro. Dw i'n meddwl, roedd y bydd y gallai rhoi hwn i'a strugio ar y prysyn, maen nhw'n eich cyfle gwirionedd, ac mae'n ei gwirionedd wedi bod nhw'n eich gwirionedd. Felly we'n datblyg y dweud i gwmdeithasol gyda Feir attackedr pan 일단 iddo wedi ganddach i gweithegu eich hun dysgu. Efallai maen nhw yw'n chi'n grifos mewn te breathing cyfryfyrhau os i chi weithio, Nee booki a'r hyn yn br treson cynda dim, Dyn ni ddedig yne nightmares bydd sydd gyda'r cyntaf dw i chi? Beth ydych chi wedi dw i chi eich rai peth ein pws krwyson o hyn Mary presenting neu Dyna, mae'n cael gai, mae'n bobl ar yr argyffraeg i'n meddwl, mae'n ddod, mae'n argyffraeg. Fe'n meddwl, mae gennym. Ni chi'n meddwl i'ch modd yn glas.  Rwy'n gobeithio'n ddweithio cwy, a rwy'n gweithio'n arddangos eu schud ar-acad yn i. B態 oeddnd cael amser oes fel mewn cyffredig oherwydd iddyn nhw'n cymryd i'n gweithio. Nid yw ydych chi'n gweithio sy'n hyffredig y byddwch chi. So mae gan iawn mwyaf yn sirgrif iawn? Na fyddwn ni'n i'r sefydau Dick Kenny am h Corporation have been so kind to us and accommodating with him. Which is a frustration at the end of the game is obvious. How did he do it? It seemed quite innocuous. They had a break but that was offside or as a foul for Stanley Rich just ran out to get the ball and all that kicked past him just to delay time to waste time and she just took his leg out yna when to block that ball, that's when it went.  It's a new one for him but, like you say, we're disappointed but we've had to move on quickly. A lot of work has gone into it. The phone has been mental the last two days Llew stoked it. dynamic in 106, but it was interesting. We were fortunate that we got Luke over the line. Yeah. What would Luke bring? Well he's got experience, he's had a fantastic upbringing in first and foremost at Tottenham. Then he went and had a great year at Peterborough in league one so he's got league one experience. John Ford o ag ohon o'r cywledd. Rwy'n meddwl eich cyfrwg y George mae'n ymlaen. Yn petfyn, rwy'n gwneud hynny ym amser Sam Hornby o'r meddwl. Efallai yn gweithio oherwydd y gall ad hyd o garles byddechreu ar y sur y galle, felly rhaid oedd fy ngwrs yn dweud sy'n ei gwrs o'i amgelio gwmp еслиnol yn gweithlo'n gweithio'n ei wneud. Fi ddim wrth ei wneud i'r gwneud i'r maen i'r gweithio. Rwy'n gweld gan George yn ei gofyn o'r wneud i'r gweithio, felly, mae'n gynnar ei feddwl a chyinid o bryd a'r tawd, ond rydyn ni'n ddysgad i'r tawd, ond yw'n mynd o'r gwaith yng Nghaerrodd. Is that the toughest position to find cover for an experienced goalkeeper? Yeah, I think so, I think it's... It's probably easier to put a 19-year-old midfielder in or a 19-year-old striker a winger, a yn gwybwysgwyd wedi le'r gwyfn opinion, yn gyrwch, erbyn yn gwneud i ddim yn yr yddydd am gyfas y bydd y gyrwch. Ni'n ddweud bod ei wneud o greu'r gwybwysgwyd wedi dod yn gwybwysgwyd, a'r prosiectyll Genedd George ei ffondi, neid i chi'r gwneud i wneud, a phobl yn ffusifol, ei wneud o gwisio yn gallu'r hanfodol yn ysgolodol, ac yn y ddechrau, bod ni'n gweithio i amser i'r profi cofnod, y statw'r Sam out, a'n le'n go a'n build gains, ond bydd y budget dictates with the size of your squad and what you can do with the goalkeepers, but George is going the right way, and we think of a lot of them. Have you spoken to George about it? No, I spoke to all of them yesterday when I knew that it was finally happening that Luke was on his way, giving them all the ring and just explaining to them so that they found out first hand off myself, not going across Sky Sports and tick a tape, or whispers like that. I was honest with them and just said, look, you've got to embrace the competition and learn from Luke as well. I'm sure he'll learn from his experience here and working with the goalkeepers and vice versa. And when Richard is back in the available position, is it really strong for you? Yes, definitely. Like you say, it's a very strong position that we have got covered now. Andrew Wysan elsewhere, how are you, who's back and available? Let me see. Harry Pritchard's trained today, so that's good news. And he's touch-worthy, so no problems with that. Clayton Donaldson's joined in today for the first time.  And he follows the programme to the tee. And he will be important for us, for us to run in for sure. And so, like you say, for us to be where we are and what we've done with him missing with the likes of Shane McCartan, missing with Jamie Devitt, who's had another good week's training. And we'll certainly come into contention for Saturday. You mentioned getting minutes into Jamie, did you manage to do that? No, well, we had planned minutes, but unfortunately the weather at the beginning of the week put pay to that. But what we did is we did something different to physically testing me even further. So he's come through that. And like I say, he goes back into the squad on Saturday. Who else have we got? Callan Cook's back now. He had the same thing that I had last week. So he came back in and trained on Tuesday, so he's fine. I think there's only Tyler French now who's just got a problem with his knee. And Zell, he's still with his calf. Post-match on Saturday, obviously, your voice, it was difficult to get to a true assessment of your thoughts. You said it wasn't good enough, what was behind that, do you think? Our performance was behind it. I think the first half in particular, we were to sideways and backwards. We didn't really go and hurt the opposition enough. Second half, I thought we played forward more. We got the ball into the front a little bit better and we got the ball out wide a little bit better. But then our final cross, our final pass, we either dribbled it out of play or we kept it in the front man with the first cross. And we didn't do enough to really hurt the opposition. We bought them in again on Monday, went through it with them individually, collectively, and they're a brilliant group to work with because they're very honest and I didn't have to really say a great deal, which at the time was good because I was still recovering with my voice, but I was able to write stuff. So, they know, they put their hands up and listen, at the end of the day, they're only human, you know. I'm sure in your line of work you make a mistake every now and again or don't have a great day at work and that's exactly what it was last week. We just weren't good enough, we've accepted that, moved on and their mindset and their attitude towards it this weekend has been really impressive this week. We look forward to the challenge that's come forth going to bring. Was that the big thing you were looking for when you came in on Monday choosing that determination to put it right? Well, I knew that that would be the reaction anyway from them because, like I say, they're great to work with when we've had a blip this season. You know, they've openly and admittedly put their hands up, they don't shirk the responsibility, they're a confident group and they still believe in what they're here to do and what they're trying to do. That's important. Owen Doyle's return was obviously the big headline, I guess it's difficult to judge how he would fit in given the performance that you got on Saturday from everybody. Well, he's fitted in, like we expected him to fit in in terms of how he's been about the place, especially today. He's looked better again. The situation is a unique situation, isn't it? It's not one that happened very often and the more time that obviously he's back amongst us, it just gets easier for him and so today, like I say, he's looked better again in training. That's going to say you've seen the positive side of the partnership. Yeah, definitely, yeah, definitely. Scumfog, then, what are you expecting from him this weekend? Well, it's interesting because I've played with her, see it? Rotherham, and obviously then followed his managerial career. What a fantastic job he did at Grimsby, bringing them back into the league and then moving on to Shrewsbury and what a wonderful job he did at Shrewsbury and then gets a championship job, in my opinion, was harshly treated to and invested like he did and the number of players that he brought into then gel and that were starting to get there and he lost his job. I thought that was harsh on him because he's shown that what a quality manager he is, he's obviously took over at Scumfog in the summer similar to ourselves, had to do a massive rebuilding job and so far, when you're tasked with that, you've got obviously players there that probably don't fit in with your plans but they're tied to contracts and you have to manage that. So he will be looking at this window because it's obviously, like myself, it's the second window that you've had and you try and just tweak your squad and affect your squad the best that you can and they've got some good players and it's going to be a good challenge for us, like I say, and at the start they didn't start off great but I said at the time I think when we played him that they'll be fine because of what such a good manager he is. And in terms of the January window, obviously Luke's coming through in the test and say are you keen to add or do you think with who's coming back you've got enough? I think any manager up and down the country would say that they're always looking, they're always looking for that one and there was one yesterday, yesterday that popped out that you thought, wow, never thought that was going to happen. But at this moment in time, I don't think at this moment we will be bringing anybody in. Nobody's rang up or inquired about any of ours, like say the lads that are out on loan are doing ever so well. If something materializes with them, Jackson did ever so well last week for Torquay. Amari's been doing well at Wrexham and Sam there and if they stay out and that creates a little bit of funds then that might be something that we might be able to then bring somebody in. You mentioned the injury to Richard, but obviously with the pitches the way they are and the number of games you've got coming up that you've just had, that's something I suppose you have to look at with all the players. Exactly, facilities in the league and obviously training with the weather that we've had. We've lost one pitch this year because of the weather and just cannot get on with it with the flooding. So the other pitch takes a bit of the hammering and so you just have to adjust slightly and monitor modes, but it sounds like you've been involved in our meeting today because that's exactly what I was saying to them. That we've got five more games coming up now in the space for what, two weeks, and it's going to need everybody and just setting one or two people's expectations that they're not going to feature in all five because if they did or get close to featuring all five, we're putting them at risk and I don't think I'd ever do that unless it was a final. When talking the pitches after the last time game, you said the pitch wasn't great, you said you had a chance to have a look at it having said it needed that rest. It needed that rest, I've had a look and it looks a little bit better to be perfectly honest on the third place to the staff down there. So we are now saying our prayers over the next 48 hours, there's no more rain.  Yeah, it was, certainly. When I was aware that he was available, for any player to be able to step into that environment and handle it is very important, but I think even more so, like you say, for a goalkeeper and the fact that he's done it at Portsmouth, I think he played over 35 games last year for him. So that was paramount in me thinking a little bit as well. And you're slightly surprised at the keeper with quite a bit of experience, more sort of a third choice, so he's almost, presumably when you're looking around a lot of them who might be available, are probably younger lads or? Well, that was the situation that we found ourselves in, is that people were offering you goalkeepers that hadn't been out on loan yet and it was their first loan and they were 19 years of age. And like I say, we think a lot of George, so we think we've got one of that.  Yeah, I think you were 100%, you know? But he understood when I spoke to him and like I say, he'll learn off Luke. So, you know, then like when he was available and like say, the experience, that was the main thing as well for us. Obviously, if that comes in, as you say, into a run-off, I think it's three weeks and four, there's Tuesday night games. Yeah. It's a case of, you know, you've got to hit the ground running a little. Yeah, yeah. If you really get to know the defence. Yeah. Well, I know the goalkeeping coach down in Portsmouth, John Keely, who works with Blackburn. So I know exactly what will have been going on. With all the gold, he's down there. And but obviously you'll have two that feature on matchday. But there was no way in the world that Luke would be sort of like, you know, just turning up and being cannon fodder. He'd have got worked by John. And when I spoke to him about Luke as well, he says, look, he's ready. He's no problem. He's ready. And, you know, sometimes it works in the third choices of favour a little bit because when the manager then wants to do his shape and his work, he pulls the two goalies over, which then leaves the goalkeeper to work with a goalkeeper coach one-on-one. And I think that's a lot what's happened this year. And so he's benefited from that. And like you say, that the John Fawns worked with him this morning. And he was fine. He was no problem at all. And he's a good size and he's loud and confident. And he's worked with the back four or five defenders today and just gone through stuff with them.


Today, I have the pleasure of speaking with Alex Klundmann from As in Court Energy. How are you today? I'm great Tracy. How are you? Fantastic. I was just enjoying Dean Bristow's piece on As in Court Energy. He certainly is an enthusiast. What do we have here? We've got Lithium, we've got Uranium and we have a company that's basically doing M&A work in the critical material sector. And if I'm correct, we also have a technology element. Is that correct? Yes, that is correct. We're ticking a lot of boxes. So how about you start by telling the investor and tell audience, because we're new to As in Court Energy, who you are and where you're going. Thank you, Tracy. Yeah, we've done really well here. We've managed to earn the majority interest in this Preston project over the last four years, which has been a tail end of the bear market for Uranium and Sector. But we've done, we've stuck to our guns. We've done what we said we were doing, going to do and we're ready to roll. We're cashed up and we're heading into a big drill program. Yes, I want to get to the cash up part, but you've had some very interesting news. How about we start with, I think, because we're discussing the Uranium, you recently announced completing your survey and you updated your plans with your drilling program. Can you talk to us about that? And of course you are cashed up, as you just mentioned. This Preston project is 25,000 hectares. We're next to Rarano and next Gen. So those are both billion dollar market gaps. So we have a great address. We've got over 25 kilometers perspective trends that need to be drilled. And we're heading into that. Our biggest drill program today, as I mentioned, so we'll be doing that prepping in December and drilling January, February, March. So we're looking forward to what will be the largest program today. I'm going to just have you step back on that question with this news release because I thought it was interesting. You used a radiometric survey. Can you just mention what some of the highlights were from this survey? The radiometric survey that we just completed really opened up the southern section of a project ground. It's all about targeting. So we're looking for different types of geological attributes that lend themselves to uranium deposition and we were able to use that survey to gain more insight and add more targets to our inventory, which is already quite robust. You also had in the last couple, well, in the last month and a half, you've had at least three news releases surrounding financings. Do you want to hit on the highlights from those financings? Yeah, no, it's amazing. What a world we live in. So we are got about 12 million in the bank and for a pre-discovery exploration company, that's rare. So what it does is I guess it speaks to the validity of the project. It speaks to the validity and the excitement in the sector. And we're obviously a good pick for some rather large funds. I mean, the entire financing just announced was taken down by about 17 different institutional funds. So we're very well supported by institutionally. Well, I have to ask you, were some of those funds targeting you because of the uranium, the technology, the critical materials, or were they doing it because of the ESG angle? Yeah, it was a combination of all of that, I think, but really primarily it's the prospectivity of discovery at East Preston and it's the sector. This is a generational opportunity in uranium and the funds recognize that. Okay, recently you also just put out news about a partnership with FOBE. And that seemed very interesting to me. We've got everything here, including artificial intelligence, technology, analytics. How does this partnership work? Well, Rob Anson, CEO of FOBE is a solid guy and in love with what they're doing with the company. And we had a discussion about applying AI and data mining to uranium sector. It's being used elsewhere, a little bit in the gold space. There's a company out of Silicon Valley called Pullball Metals, K-O-B-O-L-D Metals, it's a private company, biggest shareholders are Jeff Bezos and Bill Gates. And they're using nothing but an artificial intelligence exploration plan to find battery metals, energy metals. So I like that. I've been intrigued by that. And for us to be able to maybe be a first mover and take that step I thought was really interesting. It's just going to help us get really efficient and be able to go through a lot of data points very fast and maybe detect patterns that otherwise would take a long time to get to by just the human element. So everything's moving that way, AI and algorithms. And there's no reason why exploration shouldn't welcome it. And we're happy to be maybe a first mover in that regard. Well, you seem to be moving in the right direction. So what should we as new shareholders be looking forward to in the next quarter other than obviously some drilling results? Yeah, no, the exciting part is when you pick an exploration company and it's pre-discovery and they make discovery, specifically impactful discovery, it's very exciting. You can expect the market cap to raise significantly on such a result. And we're getting really, really close. We're now able to drill in a meaningful way in large drill programs. For example, we've done 17 holes in four years. We're going to do 30 to 35 holes just this winter alone. So the timing is great. Spot is creeping up. We could be in a mass bull market and we could deliver potentially a discovery into that bull market. So that's exactly what we would like to do. And and looks like at least we're giving ourselves the opportunity. Well, tell you, Alex, thank you so much for joining us today. We hope you will visit us often. I will. And thank you, Tracy. Much appreciated.


Hey guys, this is Hydrofemex trades and in this video we're gonna go over options liquidity and What it is and how it can affect your options trading? So first let's go over what option liquidity is so options liquidity is basically how easy it is to buy Options contracts buy and sell them without actually having a big impact on the prices itself so for example Let's take a look at Apple Apple is a big cap stock right and Apple trades Millions of shares every single day, so I could buy a million of a million shares of Apple buy and sell them instantly and I would be able to do that very easily right, but if I'm buying a penny stock I'm not gonna be able to buy a million shares because there's not gonna be that much flow and like volume available, right? so a Small cap stock or a penny or penny stock won't be as liquid because it'll be hard to get in and sell Those shares immediately, but with the big cap tech stocks that are very liquid like Apple You can buy and sell very quickly and not impact the price of Apple If I was buying a million shares of penny stock, then that would impact the price a lot, right? That would probably spike the price a lot. So Yeah, being able to get in and out very quickly is basically what liquidity is and You have stocks that trade a lot of volume very liquid and stocks that don't trade a lot of volume or illiquid All right, so now that we know what liquidity is. Let's talk about options liquidity And how to tell if an option is liquid or not So there's three main things The bid ask spread the open interest and the volume so the volume is the total number of contracts traded and Open interest is total outstanding contracts. So for both open interest and volume higher open interest and a higher volume means more liquid and Now let's talk about the bid ask spread. So the bid ask spread is the difference between the bid and the ask price of the Option contract. So the tighter or narrower the spread is the more liquid that contract is and Vice versa as well. So now let's take a look at an example. So IOT is a stock That's relatively illiquid or at least for options So the bid ask spread here is 15 cents apart and the volume here is 41 and the open interest here is 4 Now, let's take a look at SPY and compare that to IOT So SPY the volume is 49,000 open interest is 10,000 right? For IOT was like 40 and 4 so that's a really big difference and the spread here is only 2 cents for IOT was 15 cents So SPY is definitely a more liquid stock just because it has so much more volume so much more open interest And the spread is also a lot tighter, right? So that's a very clear way that you can tell the difference between liquid stock and illiquid stock for options and also The options themselves can also have different like for example This one's the most liquid one right has the most volume for SPY and typically if you're playing in the money They typically tend to be a little bit less liquid and also out of the money They also tend to be a little bit less liquid. So for example SPY here SPY in the money call has only 791 volume compared to this one which has like 50,000 right? So there's a big difference between the liquidity of this one and this one and another way You can tell it's also open interest open interest here is also a little bit less And then the big easiest way you can tell is like the spread here the spread here is 14 cents the spread here is only 2 cents, right? so Again the spread is the difference between the ask minus bid so 251 minus 249 2 cents here 14 cents, right? So those are the three ways you can tell Or you can easily assess how the good an option is for a stock and The factors that affect liquidity are tight spreads. So we just talked about this Small bid ask difference means more liquidity and the underlying stock itself, right? So SPY trade to millions and millions this year so every single day IOT does not do the same. So therefore SPY Is very likely to have more liquidity for options compared to IOT, right? So the stock itself has to be liquid as well And volatility impact so if a stock is very volatile Then there's a very good chance that it's gonna attract traders and make those option contracts also more liquid. So for example Coinbase had a really strong move up recently and that attracted a lot of traders and its options have been Yeah, it's option that the liquidity has increased a lot compared to how it was before when I was just chopping around and was very Or had lower volatility And some other things you have to consider are expiration dates. So near-term options. So weekly contracts tend to have less liquidity compared to Options or expiration date dates that are at least like a month out or two weeks out. Yeah, so Typically you want to be buying you don't want to be buying weeklies unless you're day trading That's completely fine, but Typically if you're trying to find the best liquid options, then you want to go out a couple weeks or a month and liquidity risk So you have to make sure that you aren't buying Options that are illiquid because if you want to get in and out quickly, then that's going to be a problem for example, if I buy SPY In SPY contract, I'll be able to sell that immediately for like the same price So I won't lose much if I wanted to buy and sell at the same time They're right after right But if I do this for a liquid stock like high OT then it would be a bit harder So if I bought for 250 and I wanted to sell immediately even the even though the price didn't change I probably won't be able to sell for 250 just because it's an illiquid stock And I won't have anyone else buying for 250. So I'd probably have to buy or sell it for a small Walls for like 235 But yeah, that's basically the liquidity risk that you have to take into account when you're buying illiquid stocks and Now we're gonna talk about why Not all stocks have options so there's certain criteria that are set by option exchanges and If those stocks meet those criterias, then they'll have options. Otherwise, they won't have options So the main reasons why a stock might not have options is because lack of liquidity So if it's just doesn't trade that many shares every single day Then likely we'll have the options feature and if it's a low share price or penny stocks and If it's a small cap small cap stock, then also likely it doesn't trade that many shares So Also probably won't have options then and volatility. So if a stock is very it has very low volatility Then it's also likely that it won't have options But there is one important thing to know that stocks that didn't have options in the past Mike and options if they start becoming more highly traded or they meet the criteria set by the option exchanges Yeah, that's pretty much all you need to know about options liquidity. I hope this video helps and Yeah, thank you guys for tuning in There's a reason why x-trades is currently the fastest growing application on the market for sharing financial ideas With over 2.5 million dollars paid in the last two years to contributors Users are flocking to see what trades the top traders on the leaderboard are sharing in real time If you're looking to grow your reputation as a trader on the internet or discuss your trading ideas with other reputable investors Click the link below and get connected with the trading mentor today completely free of charge


Mae Porol Cobra dwi'n gwybod o'r ffordd a Ffogolwchester, ma wedi os bwrdd yn gwybod, ond mae'n mynd yn fwy o ddiwethaf yn diwethaf, Cobra yn gwybod, ond o'r gwybod, o'r ffordd, o'r ffordd, o'r ffordd, o'r ffordd, o'r ffordd. Mae'n ddiwethaf yn gwybod i'r gwybod a'r gweithio o'r gweithio'r gwahodraeth yn fwy o gwybod a'r gwybod, ac yn y byddio ddiwethaf. Roeddwn ni'n siarad yn y cyd-dydd, I'm going to review it. I'm going to give you an opinion of an average golfer. We'll start off by saying this one grabs the attention in terms of looks. And that's where we'll start it. Get your opinions down below. How do you think this one looks? Yes, start with the looks. You've seen plenty of pictures thrown up there for you. And your own opinion is the only one that really matters. But for me, I'll give you mine. It's kind of... I'm not a massive lover of the yellow and red of Cobra. That's just a personal thing. I think it's quite striking. I think it's an attention grabber on the shelf. Is it really my cup of tea? No, it's probably not. I think there's a white and black version. I'd probably prefer the look of that. Underneath, we've got a weight system that can be swapped round again, depending on what it is you're looking to achieve in terms of that club head forgiveness or lower spinning, those kind of compromises that it might look to make. It does something quite different with this face as well. It's kind of almost wrapped around the crown and also round the sole. I'm going to see how it looks at a dress, like I said. But from what I'm looking at right now from the crown, it's a little bit different. It's something that, again, I would have to get my head round a little bit. But the actual crown element itself, there's sort of, again, gloss finish, muted carbon look underneath, which, again, so many drivers seems to have gone to. I actually seem to like this a lot better than the last year's model, but very much a personal opinion. That's all we need to know. You've heard tech spec from plenty of other people because, like I said, and late on the scene with this one, switch cameras, hit some golf balls, collect some data, give you my opinion. See how this performs? Yet it's priced well, but does it perform well? We'll find out. Right, okay, so four purposes of the test and so you understand the way I've got this set up. I've got the heavier weight of the two at the back end, lower weight being at the front. And again, set up in terms of a bit of forgiveness, a bit of help, get that CG low back and get that ball up and out there. That's the plan. Ten and a half degree head, set at standard. And again, I've got a 10-side blue shaft. Now, the 10-side blue shaft is something, if you've, again, depending on which order these videos come out, I've just tested the ST200 from Mizuno in so. And it's, again, it's a shaft that I'm very comfortable with, one that I've used for many other tests as well. Talk about, first of all, our address. I have got an issue with that sort of the rolled over crown, the way the face rolls over the crown, because you've got a high gloss finish and then you've got very much a matte finish, a matte graphite grey as opposed to a gloss black. I don't say that it's, I don't say that I don't like it, but it's very different. So it's something I address very, very noticeable and like I said, for me, I don't know. I'm not overly keen, that sort of thing, but I think it's just a case of getting your head round and getting your head round the change. In terms of the shape of the crown itself, fairly traditional, looks a little bit stretched in the way that you've got these sort of two cut out either side grooves, if you like, that just sort of raise that back end of the crown and again, it looks okay, but not fantastic. I've got to say that, but let's get it in some golf balls.  It's a bit of a struggle to collect these things. Straight down the middle. It's not a huge carry, but it wasn't the best of swings. I think we'll just ignore that one before I pass too much opinion because that wasn't the best, but it was straight. Maybe when a bit easier on that. That's better. That's all right face when I'm watching these shots go down there. I mean, to be honest with you, one of the interesting things is, and I've just tested it with the Mizuno, is that for me, Cobra always had an issue in terms of the field, which came from sound because it was always a bit of a gunshot and it was something that I never liked from drivers of old and I suppose sometimes things stick and again, very poor from my part, those things stick in your head and you associate that with the driver. For me, this is a bit different. It's a lot, lot softer straight away. We're using range balls and like I said, I'll confirm it with the proper balls, but it's a lot softer sound, something they've done a real good job of in my opinion in this model and last years, but superb in terms of how it felt. First ball was okay. Second ball very good. One more on screen. That's the ball. That's a long carry. That went, that one was certainly out in the middle. That's a huge carry in terms of distance. We'll carry on like I said it in some golf balls, click the data and we'll do overall assessments. The thing is like I said, it's alright pricing a product at the cheaper end of the market, but it's got to perform well. Let's see if that does that in the hands of the average golfer. First of all, I've got to say I enjoyed it in that because I think one of the massive ticks I will give it before we go into the detail of this is the sound and feel. I mentioned it briefly, but it was superb. Again, with a proper golf ball, even better, and that's a massive change for me. But let's just get straight into this data. That's all we're interested in. What was interesting for me was average clubhead speed very, very consistent across the board there. One dropped off, but around that 94 mile an hour market. It's been a bit slower today, maybe a bit colder than stiff in here. That's what you've got to bear in mind if you ever look back and compare other numbers and I might do that briefly in a minute anyway. Ball speed again, look at that. This is the bit I'm liking about. Certainly to be fair drivers at the moment in general, but 143.8, but look across the board barely a mile or two in terms of ball speed separating them. I always say the same thing. How many of them balls am I getting out the centre of that clubface? It's probably not many to be fair. I will be spreading it around a bit. You've seen my swing, there's variables in it. So for it to be achieving that ball speed consistently to me again ticks the forgiveness box and that's the only way I can look at it. Good spin number 2436233 overall carry. I'll just have a look at the launch. 12.7 was one in there that flew a bit higher, but it was a good, for me, a ball flight that I kind of liked. But I want to show you the dispersion because I sometimes forget to throw this screen up, but it was absolutely bang on. I felt like I started hitting these golf balls going to a position where I was warmed up and comfortable to start recording data. And I felt like I could basically stick it down the middle virtually every time at the sort of pile on in the distance which is our aim from in here. So I think that was a massive tick in the box. I just couldn't seem to miss, but like I said, once you get a little bit of confidence going and your swing's in a bit of a groove then I accept that could be the case. But overall assessment is one that I'll say just beforehand as well. Check out again, I'm not doing the same video because I'm just doing the Missouna one, but if you look at the sin numbers a week or so ago, then you'll see there is very little to split these at all in terms of ball speeds. And what you'll see is when club head speed is the same, ball speed is pretty much the same. And like I said, pretty much across the board. So the overall assessment is this. Yet again, another product, we're always got the downer on the brands that are pricing these very, very high, accepted. But there's hit this. We've got the Missouna product, that are all pitching in at some much more realistic prices. And I think for me, wouldn't tick every box in terms of looks, but in terms of performance, hard to argue, couple that with the price tag. And yet again, Cobra have got an undoubted winner on their hands from 2020. And I think it's just hard to off to Cobra. They've been doing a fantastic job last year on this and continue to do so. So let's hope that carries on. Let's hope we keep seeing another bulk product on the shelf that also performs very well, because that's the all-important bit. Anyway, as ever, thanks for watching. I'm Darren at Fogolf Chester. It's been another great day. I'm going to carry on and I'll see you all very soon.


So I'm Ruben, and I have a fantastic job. I spend just about every day helping people become more fluent in Python. What could be better? I do this in a few different ways. I have a free weekly newsletter called Better Developers, read by about 12,000 people per week. I do corporate Python training. So every day I'm in a different city, country, company teaching people Python. It's good we're in the Shanghai room, because next month I'll be in Shanghai. I also do a family of courses called Weekly Python Exercise. You will be shocked to hear that involves a weekly Python exercise to help people improve the fluency in Python. I also have a bunch of online video courses. About a month or two ago, my new book for Manning was released. This is this called the Python Workout. It's 50 short exercises in Python to improve your fluency. This is the first time Manning has released a book with the author's picture on the cover. About two, three weeks ago, I started a new thing on YouTube. I'm doing the Python standard library video explainer series, where I'm walking slowly through the Python standard library, trying to explain it. And by the time I'm done, I will have great, great grandchildren. So this is a bit of an advanced talk. So if you don't understand some of it, that's OK. I promise within 20 years or so, you will. So let's decorate a function. What does it mean to decorate a function? Well, it's going to look sort of like this. At my deco, def add a and b, return a plus b. Not so exciting, certainly a bit of a boring function. But what's important is to understand what's going on here when we decorate this function. It's important to understand the whole process that's happening in Python behind the scenes. So what's going on? Well, first of all, our function is getting defined. There we go. And it's important to remember what happens in Python when you define a function. When you say def add of a and b, return a plus b, two things are happening. First of all, we're creating a new function object. Secondly, we are assigning that object to the variable, to the identifier add. Both things are happening. So when we decorate this function, what's actually happening, another step. After we define our function, this is happening. We are calling my deco with an argument of add. And the result of that is being assigned back to add. So this means that we've got a few different functions running around here. And functions or classes, for that matter, are known in the Python world as callables. Now, here we have add, our original function that we're defining. Here we have add the same name, but we're doing a little switcheroo. We're changing what add is referring to. It's no longer after that third line they're going to be referring to the original function. Rather, it's going to be referring to the result from calling my deco on add. We have three callables here. First callable, our original function. Second callable, my deco. Third callable, the mystery quiet. Hidden callable, and that's what we get back from calling our decorator. So if we're going to implement a decorator, we're going to need to keep track of these three callables. And we're going to have to write a callable that takes a callable as an argument and returns a callable as output. Well, that sounds exciting and not head-splitting at all. So how am I going to do this? Well, I'm going to write a function inside of a function. Now, functions in Python are objects, just like everything else. When I define a function, as I just said, when I define a function, I'm creating new object and I'm assigning it to a variable. When I define my deco here, what am I doing? I'm defining a function, assigning it to the variable, the global variable my deco. Why global? We're in the global scope there. But when I define wrapper, wrapper is being assigned to a local variable inside of my deco.  Well, I want to be able to decorate lots of different functions with any sort of function signature. And so the arguments, well, they can be quite varied. So I'm going to write my function so that it takes splat args, double splat kw args, any positional argument, any keyword argument, any combination of them. Okay, so it's great that we can get these different inputs. But when I want to actually run the function, how am I going to do that? Well, I'm just going to use funk. Funk is the function that was originally decorated, what was passed to my deco. But wait a second, how does our inner function have access to this? L-E-G-B, local enclosing global built-ins. That's the search path that Python uses for variables. So inside of wrapper, it says, I want funk. Is funk a local variable? No, it is not. Is funk an enclosing variable? Is it a local variable in our closing function? The answer is yes, we grab it from there and we're going to execute it. But wait, before we can execute it, we need to get its arguments. What are its arguments going to be? We're going to take args and kw args and sort of unroll them. We're going to take that tuple args and turn it just into a bunch of positional arguments. And we're going to take kw args and turn it into a bunch of keyword arguments. And so we're able to, in this case, do nothing basically. That's okay, there are lots of people who do nothing also. In this case, we're going to have our function basically do nothing, take the arguments, call the function and then return whatever it gave to us. This is how decorators can be created. This is how they work. We have our decorated function, we have our decorator, and we have the returned callable as well, which is returned and that's what's replacing our original function. We have another perspective we can use on this. I can say that that outer function is executing once and only once when we decorate our function. This is our opportunity to sort of hijack the definition of our original function. But I also have the inner function, which is executed once per time we want to execute our inner function. So decorators are pretty cool, yeah. But you know, sometimes you see something and you're like, wow, that is super cool, but where would I use it? Is it sort of a solution looking for a problem? And no, actually decorators turn out to be useful because whenever you have code that might repeat itself inside of functions or inside of classes, you can extract it, you can refactor it, turn it into a decorator, and then have something that's sort of generalizable and usable all over the place. So what I want to show you in the rest of this talk is five different examples of where we can use them and get you thinking in sort of the mode of decorators. And I hope you'll understand not only how they work, but why you should use them and how you can use them. So first example, timing. This is like a classic example of where to use decorators. Well, you have classic, it's not like people have been doing decorators for 100 years, but let's call it that. So how long does it take a function to run? So I wanna know, let's assume I have a large code base and I know that I have a few functions that might be sometimes taking a little while to run. It would be nice to find out how long they're actually taking, but for me to actually go into each of those functions and modify it so it's gonna write out the timing, that's super painful. Plus my QA people might not be so happy with me monkeying with my functions like just to check timing. So what am I gonna do? I am going to write a decorator. My inner function wrapper will run the original function. That's not gonna change, but I'm gonna keep track of the time before and afterwards and then I'll write it to a log file. So how's this gonna look? Well, I'm gonna have log time, that's my decorator, the outer function here. And I'm gonna have then wrapper, the inner function. What's wrapper gonna do? Well, it's gonna check the time with time dot time.  And then we're gonna write to a file. By the way, if you have a function that's really like sort of time sensitive, writing to a file might just happen to slow it down a little bit, but let's ignore reality for a moment, all right? So basically we're gonna open the file with A, A for a pen because we don't want to obliterate our log file every time we write to it, that like, not so useful. And we're gonna write to it the name of the function, how long the function took to run and the timing for it. Fantastic. And let's apply it then. So I'm gonna have at log time on my slow add A and B, adds things, timesleep2, return A plus B and something similar for multiplication. And I'm putting in the timesleep because modern computers actually add things pretty quickly and it's not so useful to do this with them otherwise. And this is the sort of log file I'll get back. We have on the left column there, the timestamp of when I ran the function. In the middle column I have the name of the function. Notice each function is decorated separately but because we define the log file to be common, they're all gonna write to the same place. We don't have to, of course we can. And then the right side is how long each of them took to run, fantastic. And so if we now look at our function definition, our decorate definition, we have our decorated function coming in as func. We have the decorator here, log time, and we have the result of invoking it, or we have basically the result of invoking log time on our function, we get back a wrapper which is replacing our original function. Terrific. Wait a second though. Have you ever done this, help on a function? I hope so, right? And you can get it also into different IDs and so forth coming up as help. What if I now do help on slow add? It's super helpful, it tells me it's called wrapper and takes splat args, double splat kw args. Well we all want a little mystery in our lives, right? And here I gain the same thing for slow mo. Okay, this is a little too much mystery even for me. So like this is Hitchcock industry here. So basically what do we wanna do? We wanna somehow swap things out in it. Now we can do this, we can do this manually but why should we work hard? Can we solve this? Of course we can solve this how? With a decorator, come on. So that's right, if we want to we can go to func tools and import wraps. And then we run at wraps on our function where just above our definition of wrapper. And what that's gonna do then is it's gonna say but wait, let's do help on slow add. Aha, we have our doc string and our original function signature. And if I do that to mo, same thing. So it turns out that func tools wraps helps us with this sort of integration with other systems that allows our decorator function to pretend that it wasn't decorated after all. Okay, second example, let's do some rate limiting. I was just talking to someone a day or two ago, I can't remember who it was, was saying that they had used a decorator to do rate limiting on Django requests. This is exactly the same thing minus the Django part.  So what we wanna do now is run a function but we wanna limit how often it could be run to once every 60 seconds. And if it's run more than once every 60 seconds we're gonna get an exception. How are we gonna do this? Well, I'm gonna have my once per minute decorator. It's gonna take func as an argument. So here is my decorated function as an argument. Here is my decorator and here's what we return. Fantastic, just one little thing. What in the world are we putting in the middle there? Well, I wanna make sure it's not run more than once every 60 seconds. But if I use a local variable inside of wrapper that's going to get zeroed out or erased each and every time. So we can't do it there. I could use a global variable but then I won't be able to look at myself in the mirror every morning when I get up. Therapy, you know, the whole thing. So how can I do it instead? I'm gonna stick it as a local variable in the external function, in the enclosing function once per minute. I can do that because we have non-local. And non-local basically says if I assign to a variable I'm not making a local variable. It's non-local, right? I'm not making global variable. I'm affecting this variable that's otherwise unreachable in the outer scope. So I'm gonna set here last invoked. Last invoked is gonna be a number. It's gonna be a timestamp. And that is gonna stick around across my various invocations. Then I say non-local last invoked. And that non-local statement means whenever I say last invoked equals I'm affecting that variable in the outer scope. And then I can just assign to it. Last invoked equals time dot time and then it'll check. And if we now run it, well we're gonna run our decorator once on the outside but many times on the inside. This is the division of labor that we have. And so when I actually run it, let's say I run on add of two and two and add of three and three. So the first time it's four, big surprise I know. Second time add of three and three and we get this error called too often error. Called, yeah. All right, so we see that this actually does work. But let's try to make this a little more generalizable. I wanna say once per end. I wanna make it so that I can decorate a function and say this one can run every 10 seconds but this one can run every 100 seconds. Well, how do we do this? Let's remember now how our decorators work. When I see at once per minute over a function, def add. What's really happening? We are defining the function and then we're doing that little switcheroo at the bottom. Add equals once per minute of add, fantastic. What do we do now though? I wanna say at once per end of five. So it's gonna have to look like this. I'm gonna have my function definition and then at the bottom it's gonna do this sort of switcheroo. I'm gonna invoke once per end on five. The result of that is a callable that's gonna be invoked on add. And the result of that is going to be return back to add and assign there. That's right. We have four callables here. Sorry, I don't have any headache medicine. So basically I've got decorated function up there. I've got the decorator here once per end which we're applying to five. We've got the result from that which we're invoking on add and then the result from that which is assigned back to add. Now if for three callables I needed two functions for four callables I'll need three functions. I have a function in a function in a function here. The outer function, and by the way it doesn't go deeper than that, right, okay. Just like to say you know, I'm not heading like to infinite functions. That might also be a longer talk. So basically if I say once per end that's now the outermost function and that's what's gonna get our argument. That outermost function is gonna then return a callable. What callable? Our middle function. That middle function now is gonna get our function, our original decorated function as an argument. And it's then gonna return wrapper which is then gonna be invoked each time. So what we have here is last invoked is still there but now it's in the middle function rather than the external one. We're still saying it's non-local because non-local works at all these different levels and we're still assigning to it. The difference is that the decorated function is now an argument here to middle. Our original decorator, the outermost thing is the decorator that we recognize. We are returning this when we invoke once per end and we're returning this from middle of fun. This is executed once when we get the argument. This is executed once when we decorate the function and this is executed lots of times each time we invoke the function we wanna check has it been run too often? Well, does it work? It sure hopes so because I've prepared these slides. Basically if I say here slow out of two and two, yeah we get four and we do slow out of three and three. There we go, you know it's working great. So we can actually do this and pull it off. Okay, example four, memoization. So memoization, it's not memorization. Memoization is a very old caching technique from more than 50 years ago and the idea is that if you have a function that forgiven arguments will always return the same value. So there's no state, there's no disk, there's no network, none of that stuff. Then what we can do is we can call it once, cache the solution and then the next time we call it check in the cache. Now doing this for adding and multiplying is kind of stupid, right? But doing it for harder to calculate things, really complex things even so like SHA-1 or MD5 that might be worth it. So how does that look? Well, I'm gonna define my outer function and my inner function. My outer function here is gonna cache things. How do we cache things in Python? We use a dictionary of course. All right, and it works perfectly for that. So what am I gonna do? My wrapper is gonna take once again splat args and double splat kw args and I'm gonna use args, my position arguments which are all in a tuple and a tuple is of course hashable so I can use it as a dictionary key. I'm gonna say, hey, have I ever seen this before? Is args not in the cache? Oh, we've never seen this before. So what I'll do is I'll run the function and stick its result into the cache and then I can just return what's in the cache because I know by the time I get to that line, yeah, I've got it, it works great. By the way, why don't I need non-local here? I'm using a variable in the external scope. Aha, but I'm not assigned to it. I'm not saying cache equals. I'm saying cache square brackets equals and that's a world of difference. I can do that because I'm retrieving cache as an LEGB but then I'm assigned to it using square brackets so totally, totally different thing even though it might not seem that obvious. So I have my decorated function out there. I have my decorator there. I have my return thing there. Terrific. I also have this part which executes once so I'm setting up my cache once only but I'm gonna be using and applying the cache and retrieving from it again and again and again. Does it work? Well, let's find out. I'm gonna do here add of three seven, the mall three seven, each of those twice. So when I say add of three seven, what does it say? Oh, look, I've never seen this before. I should really run that. Running add, we get 10. I run mall, same thing. Notice, different functions are gonna be decorated separately. They're each gonna have their own little private cache. And then we say add of three and seven again. It says, oh wait, I've seen this before. So I'll just give you back the result right away. No reason to waste your precious time adding integers. And here I'm gonna do the same thing for multiplying. I'm gonna pull it out of the cache. So this actually works really well. Wait a second though. What if args has a non-hatchable value? And what about kw args? Yeah, okay. So pickle, pickle to the rescue. What I can do is take args and kw args and pickle them. Pickle is Python serialization system. It works on just about everything. And I get back a string or nowadays a byte string. Byte strings are of course hashable. So what I can do is I can take args and kw args, pickle each of them into a byte string, and then use a tuple of byte strings as my key. And indeed, that's what I'm gonna do here. I'm gonna take args and kw args, run pickle.dump s on each of them, get back a byte string for each of them. I use that tuple and then I check, have I seen this before? Oh, I haven't seen this before, let's run the function. I have seen it before, just return it. Now, it's true that Python already comes with a version of this. It's called LRU cache. LRU is a super intuitive term for last recently used. And basically what it means is, let's keep the most recently used stuff around and it's actually smart enough to sort of get rid of the older stuff. But so far as I know, it doesn't handle unhatchable arguments. I don't think it looks at kw args at all. Okay, another example here, attributes. Wouldn't it be nice to give a whole bunch of different objects the same attributes? Or the same methods. There's a certain method that I want a whole lot of different objects to have. You could say, oh, that's for inheritance, right? Yes, but inheritance is fine when I have a whole hierarchy of objects of classes that are similar to one another. What if I wanna provide the same functionality of many objects that are not similar to one another, not related to one another? To which you might say, oh, we could use multiple inheritance. Well, you might not know this, but there is a deep division in the computer world on multiple inheritance.  No matter your perspective, and you can see I'm very pluralistic on this issue here, we might not wanna use multiple inheritance. We might wanna consider a slightly different thing. So what am I gonna do? I wanna have a bunch of attributes consistently set across classes, not use multiple inheritance. So what am I gonna do? Here's my example, I'm gonna improve wrapper. Rapper anyway, I mean, let's be serious. It's really not that useful as it is. So we are gonna improve it. We're gonna have fancy wrapper. Fancy, gotta be good, right? And it's gonna say what the object is, what type it is, and what its vars are. So I wanna apply this to across a whole bunch of different classes. How are we gonna do that? Well, I can say here, death better wrapper of C. C is now gonna be my class. I'm gonna say C.dunderrepper equals fancy wrapper. And you can do that. I'm gonna assign a method to a class in exactly this way, and it takes care of all the magic it needs. And then I'll define wrapper, because we need a wrapper there, right? And it takes args and kwargs, and we'll say C equals, we're gonna create our new object, and then we'll return the object, and then we return wrapper. And then we'll have the decorated class, and then we'll have our decorator, and we return the callable. Or we can just do it like this. Because basically what we wanna do is have, what we wanna do is get C, our class, as the argument. We wanna get our decorator, and we wanna return a callable, but a callable can be a class also. You don't have to return wrapper just to sort of be this pass-through kind of entity. Okay, does this work? Yeah, I can define foo here, where foo gets x and y, and we're gonna say, f equals foo of 10 and 10, 20, 30. And then if I print f, what's it gonna do? It's gonna print my fancy wrapper, and I can then apply this with my add better wrapper to whatever class I want. Okay, so we set a class attribute. Can we also change object attributes? Of course we can, it's Python, come on. So what do I wanna do here? I wanna give every object its own birthday. I mean, come on, they work so hard for us. They deserve a little bit of a celebration, right? So basically I'm gonna create this add object birthday decorator, and when I apply it to a class, every object would automatically get this underscore created at attribute of when it was created. How are we gonna do that? Well, once again I'm gonna need to create a function. The function's gonna get a class. The function is then going to need to use wrapper. Rapper is going to invoke C. It's gonna invoke the class with args and kw args to get back a new object. And then, sort of after init runs, but before we return that object, we're gonna stick that new attribute on there. O dot created at equals time dot time. And then we're gonna return the object. So now we have our decorator class and our decorator and the return wrapper as usual. And this works really well. So now when I print the object, print f, I get the old wrapper. We'll talk about that in a moment. And when I check what is created at, it works just fine. So I can indeed add things to the different instances. Let's do both. So I'm going to, at the outer function level, set this attribute done to wrapper on the class. But on the inner function, I'm gonna work on each and every instance. So here I add the method and here I add the instance and it works just great.   We say, oh, I'll never need to modify or maintain this code. What are the chances? I'll just copy and paste it. I will tell you what the chances are, 100%.  Like my past self was so stupid, it should have asked my future self. So basically what you can do is sort of cut that off and say, wait, I see that I have similar code in multiple callables. Let's extract that into a decorator and then call the decorator and then I can test that separately and test my function separately. Now, all of this depends on the fact that in Python, everything is an object. Functions are objects, classes are objects. Objects are objects, right? That's sort of a tautology there. And so basically, the fact that everything's an object means that we can mess with them in this way. We can look into them, we can change their attributes, we can pass them around. And this gives us tremendous, tremendous power. Okay, if you have any questions, I think we might have a little bit of time for them. And if not, okay, we've break in five minutes. I'm happy to take questions here or afterwards. If you want, I have a few weekly Python exercise t-shirts and stickers. So programmers need nor t-shirts always. Or so I tell my wife. And basically I'd be happy to hear from any of you. If you wanna download the code and the slides from the talk, go to practicaldecorators.com and you can get it from there or search the, scan this QR code and I'm very happy to be here and answer any questions. Thanks very much, everyone. Okay, thanks very much, Ruben. Are there any questions in the room? Yes, there is one. Can you please get up? Thank you for the presentation. Yes, it's on. It's on. Thank you for the presentation. Thank you for the presentation. I have a question. Often when I need to write a complicated decorator, I use not a function, but a class and a call method. What do you think about such approach? So for a long, long time actually when I would teach decorators in my courses, I would start off doing it with classes because I find it to actually be easier to understand in many ways. Nested functions tend to give people like, I don't know, seasickness. But basically in a class you can divide it up between in it, like dunder in it and dunder call and the separation is much clearer. The problem is that you can't easily use a class-based decorator to decorate certain methods, for example. I think it might have been cleaned up recently. I might be wrong on that, but I'm not sure about that. So I basically over the last two years or so have switched to just sort of starting off talking about functions. If it works for you, first of all, stick with it, right? Second of all, again, I think it's a clearer separation of powers there, but I think that it's like, I've seen more people are writing them as nested functions and you can't so far as I know then do the whole like take an argument thing. I could be wrong there, but I don't think it's at least not as easy. Okay. Can you try that? Hello, amazing talk. I have a question about where, if you have this type of decorator, where are you like putting the memory that you are using in between? Because if you call a decorator a hundred times, you are allocating memory, where does it lay and how can you free that? Oh. Wait, we have to worry about memory? We're in a high level language, it's all magic. Look, yes, it does take memory because what's happening is that the stack frame from the outer function is still around. Now, it's not gonna be like that big, but it does take something. Now, when does it get released? Basically, so long as your decorator exists, so long as your decorated function still exists, and let me put this way, so long as the result of decorating the function still exists, it's then pointing to that stack frame. So as soon as the function goes away, then that should be released because that's the only thing holding onto it, but that might never be. If you're defining a global function, then global stick around basically until the end of your Python session. That said, that said, I would say, I mean, you're right that you do have to think about it, but how many functions are you having decorated there, right, compared with all the other, I mean, if you're doing thousands of decorated objects, then maybe you have to think about it more, but I think I'm guessing here, and this is just a guess, the overhead of all the other objects in Python is so much greater relative to that that I wouldn't worry about it too much. Okay, we have time for one more question if there's one, and if not, let's use the time for another round of applause for Ruben. Thank you very much. Thanks very much.