Today I want to show something that I have discovered maybe three or four weeks ago, which is basically GraphQL. I knew that it exists for many months already.  And after learning about it two weeks ago, we are already having some components on our production website running in production. So you know, I work for this online art gallery called the Artling and this luxury marketplace called Laksblot and basically just two weeks ago, I learned about GraphQL and I'm like, okay, let's build, make an offer model here and build this thing in React.js and use GraphQL for the endpoint and Apollo on the front end. And this worked so well that we basically decided to migrate our entire API for Laksblot away from Django REST framework, so it's a classic REST API and towards GraphQL, let's see if I can. So this is basically our current API and this is only half of it. I was pretty bad at making sure that all my endpoints are actually documented. So you would have to click into it. Sometimes these even crash if you're not logged in or they load very long because they are loading 10,000 products and it crashes the browser and then, you know, this is how you could see what kind of fields you can post and how the result looks like. So my current workflow is essentially, I want to write some front end components and I'm asking myself, hmm, which endpoint do we have that gives me that data, right? And then I go on this to this website here and I try to find that endpoint. Sometimes it's not on here, so I have to open up in Django my URL.py file and try to find the route in my URL file and then go to the API view and then see what the view actually does. So it's a really painful process, which is partly my own fault because I'm not documenting my API correctly. But it also kind of shows that even though Django REST framework is a fantastic framework, it's not easy enough, right? You as a developer, you can still fail and GraphQL kind of, I think, solves that problem. So I will show two parts today and I will show a lot of code. So if you want to try this at home, you can essentially go to this repository on my GitHub account and simply follow the same, like basically these are my slides here. You just follow this thing and you copy and paste all the code and hopefully it works. I mean, I will show that it works right now. So anyone should be encouraged to try this as well. Or you know, you can just clone the repo. The repo already has the final state. So when you clone this and you run the install for Python and Yarn install for the front end part, you should have the final version up and running. And you can just start playing around with it and manipulate it, okay? All right, so for those who have not used GraphQL before, I get a very quick intro. So it's a query language for your API. So what does that mean? It means that we are writing queries like this. We are not calling API endpoints anymore. There's only one API endpoint and that is your GraphQL API endpoint. Like with normal REST APIs, we have dozens, it's not hundreds of API endpoints, right? With GraphQL, there's only one. And we send a post request to that endpoint. And the data of the request is simple text queries like this, right? And the data that we get back looks exactly like the query that we have sent. So I mean, if you don't need to know anything about relational databases, about SQL or this kind of stuff, it's pretty easy to understand for pretty much anyone how to access the data, right? On the back end, you might have different data sources. You might have a MongoDB, you might have a PostgresDB. You might pull some data from the Twitter and Facebook API. And you all wrap it in your GraphQL schema. So your user, the developers that built the front end, they don't care where the data comes from. They just say, like, give me the user profile and the name, the first name, last name, email, and avatar picture. That's all I care about. Where it comes from, I don't care, right? Another good thing is that if you use something like Relay or Apollo, it groups all your queries. You might have dozens of components and they all have their own queries. It groups them all together into one request and sends only one request to the server. The server does all the database fetching and sends one response back to the client. So you save a lot of bandwidth, okay? So the main task when working with GraphQL is you have to describe how your database schema looks like, okay? So you will have, so this is the GraphQL schema. And by defining this schema, by saying in my application, there is something called character. There's something called planet and so on. When you define this schema, there's this editor here, Graphical, that has auto completion. So because the schema is pretty fine, the editor can patch the entire schema and know about it. And while you're typing, it auto completes. It knows which endpoints exist. It knows what is the return value of each endpoint. It knows what fields are available for the user profile object, for example. Maybe they show this here. You can even click here at docs. It shows all the endpoints that exist. If you click into an endpoint, it shows what is the return value and what fields are available on the return value. So API documentation, 100% on, always up to date. You cannot fail as a developer for getting to update your own documentation. And then you stop using it.  Okay, so that's basically the idea of GraphQL. All right, so let's start totally from scratch, right? You want to build a GraphQL server on the back end using Django. And you want ReactJF application on the front end using ReactJF and Apollo. So that's our goal for today. And I already prepared this because I don't want to download things. I don't know how fast the internet is here. So if you started a new Django project, you would create some folder on your machine. You would start a new virtual environment. Then you would run tipp install Django, high test Django, high test coverage and mixer. So I like to do stuff in a test-driven manner. Lots of people who already saw the other two talks that I gave about this asked me how do you test it. So I'm trying to show this today as well. And when you have Django installed, you can run on your terminal Django admin start project. And you give it a name. And I like to name it back end in this case. So when you run Django admin start project back end, it would then create this back end folder here and put a few piles inside. So it looks like this. And when you created a new Django project, you first want to migrate the database so that all the tables that are built into Django will be created.  You call it admin. And then you can run the development server. And if that worked, you should be able to go to localhost 8000 and you see this before Django page that every empty Django project shows. Okay? All right. So since we do stuff in a test-driven manner, I have a few patterns that I always use in all my projects. So we will need a test settings file. Basically, we are overriding some things from the Django settings. And we are saying we don't use whatever database your Django installation is using. We want to use an in-memory SQLite database because it's much faster. Then the test will be like 10 times faster than versus using your Postgres, your real Postgres database, right? Same here for the password hashes. In your tests, you will usually create lots and lots of users. And usually in the beginning of each test, you have to create a user so that you can attach it to your request and then call your views. And with the SHA password hashing, which is the one that you should use for your real installation, it's a bit slower than just using the md5 password hasher. And same here. If you have any models that have files, data like images or files, file fields, you can use in-memory storage so that these don't really get written to the disk. So you say IO operations, tests get faster, right? So this is a simple test setup that's useful for pretty much any Django project. So I like to use the built-in Django test runner. I like to use PyTest. And for this, we will need PyTest.ini files. We basically just tell PyTest where our test settings can be found, the file that I just created. And then I like to have 100% test coverage on all my projects. So we also create a coverage RC file. Actually, this file only is a list of files and folders that I don't care about, where I don't care about the coverage. You know, the managed py file, the wsgi.py file, they are pre-generated by Django. I don't put any code in those files, so I don't want them to reduce my coverage because I'm not going to test these files. The coverage in those files will always be 0%, and it reduces my overall coverage. And I want to have 100% coverage, so I add these exceptions here in the coverage RC file. This point, okay, so that's like, you just created a new Django project, you set up your testing framework, now you are ready to, you know, get some new work done. So the first thing that I use in Django, those people with this folder here, back-end, this is my entire Django. It's also called back-end. It's kind of my project folder. This folder usually only has project-wide settings. We have the test settings in there, and we have the main url file in there, so there's this file here, url file, which shows all the urls that are available in there. And all the real logic that deals with products, one application that deals with user-admin, start app, so let's say for today we built a little Twitter-like application where people can type messages on the home view you have the long list of messages, right? And you can click into the app. So we will need a table called message. So in Django, you basically, these are the fields, the columns of our database tables, okay? So each message belongs to a user, each message can have some text and a creation data, right? So pretty simple database with three columns. Database table with three columns. Usually I wouldn't do it this way. I would first write the test, but I think it's easy to understand what we are trying to test for. The test could look so forth, each file, for each file, like I have a model.py file here, I will also have a corresponding test underscore and then the file name. So later we will have a schema file and we will have test underscore schema. In most of my projects, I will have a utils file and I have test underscore utils. Every file that I make, I have a test file, right? And for every class and every function in all of my files, I'll write a test. So we have a message class here, so we will write a message test. So this stuff is basically boilerplate stuff that we need so that we can write into our database because PyTest by default does not allow you to write into the database. But when you import PyTest and then you make it, you call this PyTest.mark.jangoDB, then you can write into your database. Mixer is a very, very useful tool in the Django ecosystem that allows you to create test fixtures because usually when you write tests, you need to make sure that your database has certain objects. There needs to be something in your database and then you can run your test and see. For example, when you want to test if a view deletes an object, you need to create the object first and then you can test if the deletion works and then after what you check if the object is still in database or not. So I always use Mixer to create objects in my database and Mixer basically has a very simple API. You call Mixer.blend and then the name of the app and the name of the model that you want to create and Mixer will basically fill random values into all fields and this is the cool thing about Mixer. So it even understands if it's an email field it will put random emails into that field and if it's a name field like first name, last name it will actually put out of a dictionary of names random names into that field and a good thing is sometimes it even puts unicode characters like Chinese words into text fields which you never test and often you have unicode decode errors in your application and you will only realize after running your test suite for a few times you will realize that there are some bugs in your code because Mixer was putting unicode characters into your text field. So it's a really cool project. So I just try to instantiate a message object and I check if it has a primary key greater than zero that means it's in my database. If the object is not safe for the database the primary key would be none. So this could be a possible simple test called to just test a Django model. I mean there's nothing much to test anyway the model doesn't have any functions it's not doing much I just write this test essentially to get 100% code coverage. So we have our model and we also want to be able to use the Django admin to fill in some messages into our database so I register this model with the Django admin and now at this point I can create an initial migration so basically I have created a new database table right Django has this feature here make migrations that will create the insert table statements so when I deploy this application I also update my database automatically so at this point server is still running I should be able to lock into my admin and I can see my messages table and I can fill in new messages or we have two objects in our database So far this is like the super quick introduction into Django for those who have never used Django and those who have used Django before now comes the exciting part let's try to use Graphene Django so Graphene is a pretty cool Python app that allows you to write a GraphQL schema in Python by writing Python classes and Graphene Django uses Graphene to have some even more integrated stuff so that you can use it super easy with Django and it basically understands your models and creates the Graphene schema very similar for those who have used Django REST framework very similar to writing serializers for each model you usually write a serializer so that all the fields on your model can be returned to your product as a json so you would have to do pip install Graphene Django and every time we want to use a new app in our Django project we need to add that to our installs app setting and Graphene needs one more setting should have closed that file it needs to know where is your main schema file that's pretty similar to the urls.py file there is one main urls file that imports all the other ones from your applications and the same thing is true for Graphene we will have one main schema file which is in backend slash backend let me just create a file already another file looks a little bit like this so we say this is our main schema we have to read it from bottom to top this is our main schema variable this is the variable that this setting is referring to in backend dot schema so backend is the folder schema is the file and schema is the variable and the schema has this queries class right now we don't really have any real endpoint so you have to put something you cannot do this you cannot just have tasks and do nothing in this class so I put a dummy endpoint there essentially we have now one api endpoint that's called dummy and that always returns an empty string it doesn't do much so later we will not need this anymore for now I need this so that I can go on to the next file oh yeah we will have to replace we will have to add two more endpoints to our URLs so graphical is the editor that we will use during development probably in the real world if you deploy this you would only hook up this endpoint when debug is true for example you might not want that anyone can go to yourdomain.com slash graphical and then start exploring your api and gql is actually the same view but this is going to be used by our front end using a column yeah so this comes with jango graphene these two endpoints so at this point everything worked server is still running I should be able to go to this graphical endpoint yep and thanks to the code completion it already tells me that there is an endpoint called dummy so let's say I want a query dummy and it always returns null because we haven't really implemented we said the type of dummy is a string but we haven't really written a resolver function so it's not really returning any string it's currently just returning nothing so don't worry about this dummy endpoint we will have more meaningful endpoint later okay so I said that writing these schemas is very similar to writing serializers and jango rest framework and so basically what we have to do is in our simple app we will also have a schema file so and we have to support each model that we have so we have a message model we will create a message type so for each model we have to create a jango object type class and the syntax is always the same like we have class bit of the derived from jango object type then class meta and then you say which model is it and it's always interface graphene.node and then my app so this is in my simple app folder my app has its own sub query and here we say we want to have an endpoint that's called all messages and that returns a list of message type objects and then usually when you write these endpoints they always come in two pairs one is the name and the type and then there's a resolver function that has the same name like all messages but resolve underscore prepended to the name of the endpoint and essentially arcs is post parameter if your client wants to post some data to the endpoint this will be hidden here in arcs so in normal jango views this will be a request not post the data inside the post data context is in this case in graphene is the jango request I could actually call this request and then everybody who knows jango knows how to use this you have request.user is authenticated and all these things request.session and so on because the graphene docs don't assume that you are using jango and in their examples it's called context so I just kept using the same okay so now we created a new endpoint but this endpoint will at this point not be visible yet because in our main schema file we need to import it so we do import simple app so we use multi inheritance here simple app query now we don't need the dummy anymore because now we have an actual endpoint you know so we have our sub query here which is abstract type so this query alone cannot be used but when we combine it with graphene object type using multi class inheritance now we have a query that can be used for our graphene schema alright so basically in this file every time we add a new app to our project we will just keep importing the apps here and then we will keep adding those query classes to our main query class okay so at this point we should be able to see the endpoint all messages and it also knows that it returns lots of messages and messages have I feel called ID and they have the actual text called message I can run this query and I'm getting the two entries that are already in the database okay and by the way the docs are always up to date it tells me what queries are available or messages, it tells me the return type message and it tells me these three fields are available on my return type okay so the facility we tried the query okay let's create one more endpoint one endpoint that returns a single message and not all messages at the same time now I'm saying the message endpoint really all messages they don't have the dango primary key which is just one key they have this weird stuff here this is like some hash value if you unhash it you get a tuple with message type the name of our type and the primary key so it's like somehow encrypted but the information is still there and when you're back into a dango primary key or message type and primary key into one of these I know that the ID that I'm getting here will look like this so first I will use the from-world ID function to turn that I know how do we like list use now we want to know from bottom to top again similar to how we have lots of queries we will have lots of mutations so this mutation is going to be called createMessage and it's of type createMessageMutation so here's different we won't have to resolve our functions because mutations are a bit more complex than simple functions we will have mutation classes so how does the mutation class look like it has to derive from graphene mutation and it has to have this subclass input so obviously we want to create a message so the user has to type in the message so we need to get message as part of the post data and mutation can also have outputs so and this is tricky to wrap your mind around when you are used to REST APIs you know like if I call this endpoint and I do a post request this means the endpoint is supposed to write data to my database if my form data is wrong the endpoint will return 400 status codes and say this was a bad request there are some bad form values with GraphQL you don't have that anymore every request as a post request every response is a 200 response and either GraphQL was able to give you the data that you asked for or it wasn't able to give you the data that you asked for so it's up to you how in your front end how you figure out if there were form errors if the data that was requested if you are even allowed to see it so I came up with this for now when I have mutations I will always return a status which is like the usual HTTP status codes I will have form errors which is supposed to be adjacent string of my fields and the corresponding errors in the same way like the Django REST framework if you call your serializer and the serializer is not valid you can return the form errors of your serializer and on your front end you will have a dictionary with the field and a list of errors for that field so I will just make sure that I design my form errors in the same way and if the mutation was successful I'm going to return the newly created message so this is a graphene field of type message in this mutation you have the mutate function and here you can do things like checking if the user is even allowed to do it I told you ARCs is the post data Contacts is the HTTP request so we can check if Contacts.User is authenticated if the user is not authenticated and this is the funny thing we don't return HTTP values like in Django or in Django REST framework we return an instance of this mutation class where the corresponding return fields are set to some values so in this case when the user is not authenticated we will return the created message mutation and we will set the status to 403 which means forbidden so that means there will be no form errors, there will be no message returned and we won't have created anything in our database, we just return 403 on the front end it's up to you how to deal with that you will probably redirect to the login view or if the user is already logged in you will say that you are not allowed to do this action then we will probably do some kind of form validation we will check if the message is empty and if the message is empty we return an instance of the mutation and we will set status to 400 which means bad request and we will return a JSON dictionary where we say the message field had an error and the error is please enter a message if everything is fine we will use Django to create our message and then we return once again like always we return an instance of this mutation and the status will be 200, there will be no form errors and the message will be set to the newly created object so basically if you are used to just writing normal Django views this is your Django view this is what you used to do in your Django views in the post part or the resolver function is what you used to do in the dispatch function or in the get function of your Django view or if you are used to a Django REST framework this is what you used to do in your API views and your view sets and so on so this is where all your logic is and it's just normal Django code like you always use to write Django code nothing special alright so now we have this mutation let's have a look at test because it might not be super obvious how to test this oh yeah I need to create a new file speed up so just quickly people ask me how do I test this and it couldn't be any easier oh wait I forgot some imports so our mutation does three things are you logged in you provide a message and then it creates the message these are the three situations that can happen so you would want to write test for that so the first test would be you have correct data the message is there you create a request using Django's request factory you attach an anonymous user you can import anonymous user from from Django to that request and then you simply create an instance I mean it's just a class the message mutation is just a class you can create an instance of that class whatever you want so we have an instance here and the mutate function is just a function so you can just call that function on your instance and we know that the first thing is supposed to be a root I don't even know what root is so in my test I simply pass in none and it still works then the second parameter is supposed to be the post data the data that we've constructed here the third parameter is the context so we put in our request here and then we just check if the result that we get the result that we get is a dictionary which has these three fields and if the user is not logged in the field status is set to 403 so you can simply check for that in your test to check if result status is 403 so the next test will be now we don't have anonymous user we have a real user attached to our request but we don't provide any data anymore now the status should be 400 and we should see if message is in the form error suggestion string and finally we will have the same logged in user and we will call the mutate function passing in an actual message and now the status code should be 200 if everything is correct and we check if we got a message as a return value a message instance with a primary key so it means it has been saved to the database so this is how you could write a test for a mutate simply instantiate the class and call the function and the same is true for queries you can instantiate this query and you can call the result function and simply test what you want to test so testing couldn't be any easier the mutation in place now we need to hook it up in our main schema file just like we hooked up our queries at this point thank god it works now the editor knows that there is a mutation and it's called create message and you have to provide a message okay let's try an empty message and we get status 400 form errors, please enter a message if we provide an actual message we know that, we expect that we will get back the message object and the editor can go deeper and deeper it knows that message is of type message type which has ID and message so I might just want to query that from my return value and I'm getting status 200 no form errors and a new ID and a new message to our database when you look back at Django admin there should be three messages now okay so final thing and then I think we can have a short break authentication everybody asked me, cool, that's so cool but how do I do authentication so there is something coming up Django GraphOps I haven't had the time to really look into the code of this repository and it seems to be a little bit stale I haven't done any work recently and they say it's based on Django REST auth so I'm like, why don't I just use Django REST auth then so I kind of decided against this there's also Python JWT which is like the Python implementation for doing JSON web token you could probably write your own mutation that accepts username and password and then looks it up in your database if it's correct, then generates a token like that and returns the token but you know, I'm not really a cryptography expert and so on I would probably write something that can be exploited so I didn't have the balls to do that there is Django REST framework JWT which I know has a lot of watchers and stars recent development five days ago Django REST framework has a huge community most of the people are probably using Django REST framework JWT as well in their project so I felt more secure using this this is not using GraphQL but I thought, okay then I have an API that has the GraphQL endpoint and three more endpoints for token management who cares four endpoints in total it's still super easy to understand API versus my current API with 300 endpoints so I thought it's a good trade off using something that's very well tested but isn't using GraphQL but it works so you would run pit install in REST framework Django REST framework JWT and then add these to and then Django REST framework needs a bunch of settings and we will just add for local development we need to make sure that because our backend and off-run it has different IPs so it's like different origins and usually the Google Chrome browser would prevent you from sending requests between the two and then we need to add the course headers middleware to our middleware classes but and thanks to Django REST framework JWT we have a few new URLs that we can hook up in our main URLs file which is essentially these three and these are classic REST endpoints that most people will have in their classic REST APIs so these three APIs will help us to authenticate and get a token okay, when we did this we should be able to use Curl our user is called adminpassword test1234 the endpoint is called ap-token-off so hopefully if this worked we should be able to send a post request with our username and password and we will get back a json web token that is now valid for five minutes alright so this is the first part should we have a short break there's still a lot of food there we get some drinks and we do a 5-10 minute break you can ask me some questions over there and then we just return here and get to the more difficult part okay, so thanks so far


In this video, we provide the solution to question number 15 for the practice final exam for math 1050. We are given a 2 by 2 system of linear equations. We have 3x minus y equals 12 and 7x plus 2y equals 30. So suppose we want to solve this system of equations using the substitution method. What would be the best approach here? Well, substitution, we have to solve for one of the variables. We have to either solve for x or solve for y in one of the equations there. And when I say the best method here, what's going to be the easiest for us to do this by hand? Now, if you try to solve for x in the first equation, I mean, you could do that. You could divide by 3. 3 does go on to 12 four times. That would be okay. When it comes to y, you can just move the y to the other side and move the 12 over here. There's no division whatsoever, so I like that one. That's my contender so far. If you try to solve for x, you divide by 7, you're going to get like some fractions 30 over 7, 2 over 7. That's going to be a nightmare. And then the last one here, if you could solve for y, you'd have to divide by 2. But again, you get some fractions in that situation there.  We divide by it. So honestly, the only one that doesn't lead to fractions would be solving for y right here. So really, the best one that would lead to the easiest calculations, the fastest one, would be to solve for y inside of the first equation.


Ranger Bill, warrior of the woodland, struggling against extreme odds, traveling dangerous trails, fighting the many enemies of nature. This is the job of the guardian of the forest, Ranger Bill, pouring rain, freezing cold, blistering heat, snow, floods, bears, rattlesnakes, mountain lions. Yes, all this in exchange for the satisfaction and pride of a job well done. Notty Pine, as you know, is in the heart of some pretty rugged country. Because of the difficult terrain, there are two transport companies who have battled back and forth for years. The railroad, during winter months, gets the freight because it can keep a better schedule than the Canyon City truck lines can. But the railroad can't give door-to-door service like the trucks. So in the good weather months, Leonard Grant keeps his trucks rolling day and night. Spence Nehoff and Leonard Grant don't know it yet, but they're soon going to have to get their heads together in teamwork, which neither man will do. Let's find out how Bill and the fellas handle two stubborn men in the story, Piggy Bag. Hey, Gordon, there's a signal from the caboose. It's Spence. Is it old ball of fire one now? Huh, he wants more speed.  I've got 50 freight cars on tow, and it does like a district superintendent. What should I signal back? Tell them to get out behind the caboose and push. You and your humor. Signal full high ball, and that's the best we can do until we get up this grade. Okay, I'll say, hey, there's a truck in the crossing ahead. The trucks and cows on the track, they're all the same. That's probably some broken down old crate, and the driver can't get it going. That's no crate. That's a Canyon City truck. Our old enemy, huh? Maybe I'll get a medal if I split it in two. Hey, you're joking. Yeah, yeah. The ball of fire is going to be real happy about this. Yeah, looks like the truck's front wheels are jammed in the crossing. And here comes Spence, look at he cut.  Look at him come. Just like one of them big jackrabbits.  What's the matter with your truck? The motor fall out? Don't get wise, superintendent. If your crummy railroad would fix the grade crossing, this would never happen. For your information, truck driver, my crummy railroad ain't interested in fixing crossing grades for blind men. How'd you get your chauffeur's license if you can't see a hole in the road? Listen, wise guy, one more crack like that and you'll have to see your dentist, pronto. Wait till my boss hears about this.  Now get that thing out of the way or we'll make hamburger out of it. Ah, don't make me laugh. I'm not moving until the record gets here. I've radioed for help and the boys will be here in about an hour. You don't think you're gonna hold us up for an hour, do you? I'll sue your company if you do. I got perishables and fast freight on this load. Hey, we've got some heavy jacks in the caboose, super. I think we can get this truck out of the hole without any trouble. Well, okay. I'm going back to the caboose. I can't stand blind truck drivers.   Yeah, take it easy, son. He's their boss. We have trouble now liking him.  Yeah, yeah, see what you mean. I'll get the crew to help me bring those jacks up. We'll have you out in no time. So, yeah, that'll be fine. I don't want to hold you fellas any longer than necessary. I'm sure glad that all railroad men aren't like that superintendent. Yes, son. You know how it is. A little ball of fire probably forgot to take his high blood pressure medicine this morning.  Let's follow Ned and Gordon as they roll along. Whoops, I should say they were rolling along. Right now, the freight is switching cars on the sidings of Naughty Pine. But in the process of cutting out half a dozen cars, the freight train has blocked the North Highway for almost half an hour. Three big transport trucks owned by Canyon City Truck Company are waiting for the freight to move so they can be on their way. Big Jim Mandel leans on his air horn as he grows impatient. When are you guys going to break that train and let us through? Ah, keep your shirt on. We'll be through in about 20 minutes. 20 minutes. Break that trainer. I'm going to call my boss.  Tin Horn. I'll give you Tin Horn, Breakman. Don't say I didn't warn you. Big Jim the dispatcher. Big Jim the dispatcher. Come in. Over. We're being held up by a switching freight on the North Highway. I've asked the crew to break the train so we can get through, but they refused. We've been here half an hour already and they say it'll be 20 minutes more. I should call the police and have them send a squad to make them break open the train. Okay, you're the doctor. Hey, they're breaking open the train now. They must have seen me talking into the mic. See you later, dispatch. The Canyon City Truck Company is owned by Leonard Grant. Len is a hard-working executive who's well-experienced in the trucking business. But there's one thorn in his side that keeps him more or less in a state of perpetual displeasure. This is the railroad. Len's made up his mind that Spence Nehoff isn't going to get the freight business this winter. Let's drop into Len's office as he and the dispatcher talk things over. Spence isn't going to get my business no matter what he pulls. So we really got off to a bad start today, Chief, huh? Yeah, but with the new equipment that we've got on the trucks, we'll give him and his tunerville chuchu a real run for its money. I don't know about that. Roads get real bad once it starts to ice and snow. Ah, what do you mean? We've got sanding equipment on all the trucks and having them travel in threes gives them enough manpower to change tires. The new tractors have the special low-low gear for inch and over bad ice. We can keep in constant touch with our drivers by radio. I don't think we'll have to give up this winter, Lee. Yeah, hope not. Were the boys able to fix Pete's truck after he hit the bad crossing grid? Yeah, fixed it on the spot. Fine. Who's rolling where today? Here's the dispatcher's schedule. Group 1, rolling east. Group 2, southwest. Good. Group 3 will take off at noon. Pete's on a short haul and will be back to join Group 4. Let's see, they take off at supper time, man. They should be well on their way by midnight. How's the weather? Not very good. Group 1 will run into ice at Breezy Ridge. Group 2 will hit snow at Middletown. That's all right. The boys are equipped for any kind of weather or roads they come up against. I don't know about this road, Will. Yeah, it's pretty bad. Want me to take the wheel for a spell? Driving this slow can hypnotize you. Oh, I'll be all right. Thanks for the offer. You better call dispatch and tell them we're slowing down. Right. I'm going to do it for a time check anyhow. This keeps up. We won't be going far. That's for sure. Group 1 to dispatcher. Group 1 to dispatcher. Over. Before reducing speed, roads get nicer by the mile. We're going down the east slope from Breezy Ridge. Time to keep on the schedule, he says. I think we're driving the cable car. Yeah, he's getting just like Len. He thinks that we can drive like crazy, man, just because they pay us a bonus. The boss can keep his bonus when the roads are like this. I don't hang her to Jack Ida Paul for this road. You may, too. It's a long way to the bottom and we haven't got parachutes. Not quite yet, Nick. I'll drive another 10 miles or so and then you can take the wheel. Okay. I'll be glad to take over any time. What's Big Damon's group doing?  Boy, you're not kidding. That is a big one. How many drifts have we hit so far? I stopped counting a while back. It's out of time. Slow to die. We won't get through if we hit any bigger than that. How are the boys behind making out? Oh, they're doing okay. Boss isn't going to like this. Let me talk to Big Jim. I'll show him who's boss in this outfit. Jim, can you hear me? Now you listen to me and listen hard. Either you drive those trucks or I'll know the reason why.  Not to sit around and bay at the moon. You tell that to the rest of the men with you. Understand? Listen, you hugged the mountain coming down to you here. Hug that mountain. I'll get Sam to you by helicopter as soon as it's daylight enough to fly. Joe, we're doing this, Len. You're asking the impossible from some mighty good man. Who's running this company? You or me? I'm not losing my contract to the railroad if I have to drive trucks myself. I agree with Leigh the dispatcher. Leonard Grant's overdoing it. And unknown to Leonard, there's somebody else who feels the same way. Bill Stumpy and Henry have taken in the whole conversation by means of the radio and the snowmobile. Rangers are cruising about five miles away from Big Snake Drive in the snowmobile. They're on a routine inspection trip and when they're out in the wilderness country they often ride with the radio on just to pick up any calls for help. Hey, Len Grant must be out of his mind. He can't make his men risk their lives like that. He can't, but he is. Bill, can't you do something to stop those trucks? Yes, I can, pal. I can keep them from moving on a technical charge. Huh? What technical charge? Well, they're out of sand and they're also a hazard to traffic on the road because they have no means to control the big transports but they get away from them. Besides, Big Snake Drive goes right through the center of a national park. Hey, yeah, that's right. We're going to stop those trucks soon. Right now. It'll take us a while to get on the highway from here. Oh, that's too long. Hold on to your hats, fellas. I'm opening up to full speed. You fellas work the spotlights. Well, fellas, this is as far as I'm going for the night. Is that all right for the rest of you? Yeah, that's all right. I'm not risking my life on this glass for the boss or anybody else. Look down the road. The headlights show up nothing but a sheen as far as you can see. Hey, wait a minute. What kind of a motor is that? Sounds like a small plane flying low. Well, it is a small plane. The pilot must be crazy. Why, he's flying down the highway. I know what it is. That's a Ranger snow car. Oh, boy am I a dummy. I wonder what they want. I'm just doing it out here this time. Here we go. Howdy, fellas. Oh, what's up, Ranger? How come you're on the highway with your snow car? I'm here to take away your road rights. You can't travel this highway. We can't drive. What are you talking about? No, just keep your temperatures really belong. Nothing you've done is what your boss is trying to make you do. You've heard about it already? Thing while it was going on, sonny. You know, I look like an old grizzly, but we use newfangled contraptions. We got one of them things you call radio. Yeah, we cruise around with our radio on when we're out in the wilderness. We picked up the whole conversation. Bill, here's the boss Ranger of these parts. He's not going to let you fellas risk your lives. Oh, we're already parked for the night, Ranger. No use going any farther until daylight. You're not going any farther, period. Until the ice gets off this road. You think it's bad here? A way to get 10 miles from here. Oh, sounds like you fellas have been over there. Oh, not yet. We know the pattern. I'll lock your trucks, set your brakes. We'll take you back to Canyon City in our snowmobile. Leonard Grant, there, dispatcher. This is Ranger Bill Jefferson. Put your earplugs in, sonny. I don't think he's going to be very happy when you tell him what you've done. Bill Jefferson, this is Leonard Grant. What's happened to my trucks on Big Snake Drive? Nothing. I've got all your drivers here in the snowmobile with me, and I'm bringing them back to Canyon City right now. What? I'll explain that to you when I get back. I just want you to know what's going on so you won't fear the worst, and then you don't answer your radio call. Tell me now, Ranger, take my drivers back to the trucks. I'm running this outfit, not you. Take them back right now. Do you hear? All I hear is you yelling your lungs out. You're not careful. I'll stop and secure a warrant for your arrest. Canyon City truck company, Leonard Grant speaking. Why are you talking on a phone, Nick? How come you're not using your truck radio? You're not stole, too. Where are the trucks? Yes, I can hear you, Nick.  Goodbye. Lee, Nick and his outfit are having troubles just the same as Big Jim. Send out for coffee and sandwiches. I'm staying here until that Ranger gets in with the boys. Bill Jefferson, I want to know on what grounds you did this. You're buttoning into private business. Are you thankful that I did? The state trooper's got you doing this. You'd be in real hot water, my friend. Doing what? I'm not breaking the law. What? You're an old hand at trucking in these mountains. You know the law. If my men want to take chances, that's their business, not yours. Perhaps.  Is that breaking the law? They could have quit their jobs. When you amaze me. Come on off it, man. You know very well that you'd be charged with manslaughter if anything happened to your men or to the occupants of another vehicle. You created a hazard to public safety on a highway. The hazard has the potential of killing one or more people. What's the matter with you? Have you lost your mind? Excuse me. Yes. Yes, this is Leonard Grant. Yes, Mr. Todd. How are you, sir? Yes, I know. The trucks haven't arrived. No, sir, I can't make any promises. We're doing the best we can to get your shipment to you. It may be a few days, but... The railroad? Oh, I don't think you should change, sir. I'll get your shipment to you if I have to bring it out by helicopter. That's right, sir. No, sir, there shouldn't be any more delay. Thank you, Mr. Todd. Goodbye. Boy, you sure fixed me fine. I can sue you for this. Hello? Oh, yes, Mr. Peabody. No, sir, the shipment won't arrive today. But, sir... Mr. Peabody, let me explain. No, sir, you can't get better service from the railroad. Good day, Mr. Peabody. My fault again? No, it isn't. I'm sorry I'm acting the way I am, but I can't seem to control myself when I see good contracts going out the window. If my trucks are five minutes late, my accounts start talking about the railroad. I'd like to help you. I can see now that you and Spence Niehoff are at it again. Glad to listen, if you'd like to talk. Here, have some coffee and a sandwich. The man thinks better when he's not famished.  I know that. Yes, I've got a lot on my mind to unload, and I've got some serious problems. But why should I bother you with them? Why should you be interested in helping me? I have a job to help people. My duty is a ranger and as a Christian. You really mean that, don't you? Yes, I do. All right, here goes. I've got to talk to somebody. I can't think of anybody better qualified to help me than you. So, now you've heard the whole gruesome story. Have you tried to come to some agreement with Spence? Yes, several times, but you know him. He hates truckers. He won't lift a finger to help. Probably feels the same way about truckers helping the railroad. Yes, I will honestly admit that I haven't much use for the railroad. What's the answer? This cutthroat business is gradually putting me out of business. Last year I lost three good accounts to Spence. But he isn't making a red cent on them, actually. He can't give Shipper to receiver door service. Yet in the winter months he can get the stuff into a nearby sighting. That's more than I can say. Well, you heard what happened on the phone. I think you know the answer to your problem as well as I do, man. You mean work out a deal with Spence? Right. I know he wouldn't do it, but what do you have in mind? Have you ever heard of trailer on a flat car service? You mean piggyback? Yeah. It's been tried in the east. It's worked out very well. But the railroad's got its own trucks on that deal. If they bring piggyback service out here, I'm a dead duck. Sure you are. You wait for it to happen. Bill, I get what you're driving at. I've got the trucks, so why not start the ball rolling before anybody else does? Well, now you're talking like a progressive businessman. You spare a few minutes? Well, as I live and breathe. Close the door and sit down. What brings a trucker into my office? I hope it's not the usual fall and spring battle we have because I'm not listening. I have an idea how we can end the battle permanently and to our mutual advantage. Oh, you don't say. What stroke of genius is this? Piggyback service. You supply the flat cars to haul my trailers and my tractors will give the door-to-door service.  The moon will be made of green cheese when the time comes for me to work a deal like that with any trucker.  I knew I was wasting my time to come here. You haven't got a brain cell working or you'd see the advantages to both of us. I've got enough cells working to know better than to help a trucker.  But that's life, I guess. It's too bad you can't compete with me, but business success is survival of the fittest. You won't even hear me out? I'm a busy man. I've got lots of freight contracts to work on. You'll be out of business soon, so why should I bother with you? The spenders don't fight for your new idea. But Bill, trailer on a flat car service involves the railroad. If I can't get spensed even listen to me, then I'm licked for good. I might as well go out of business right now. You'd go to the big cogs. Bill, you're right again. I'll write a letter to the president of the railroad right away. I'll approach him on the advantages he'd have by using my idea, since I have special equipment already for this part of the country. I don't follow you. Sure there is, Bill. I get it. I'll work through my customers. They can bring pressure on him to make him see the light of day. Well now this is pretty new to me. I'll have to think it over. But I'm not really sure that I want to take some time. Well thank you, but I... Brings you here. Have a seat. What's bringing me here? What do you mean? All those phone calls from your customers. And then I have a letter here from the president of the railroad. Well now I know what you're talking about. I wrote to him, but he hasn't answered me. I'm bringing his answer. Oh, what is his answer? Well, I'm to work out the details of piggyback service with you at once, if not sooner. And where to use your truck and equipment and get the operation running within one week. That is five business days. Wonderful, Spence, for both of us. Yes, that isn't all he has to say. Yes? I got the worst ballin' out of my railroadin' career for being so bullheaded. He says I should have worked this out sooner. I should have waited until you came to him. I didn't tell him I had approached you on the subject. I know you didn't. That man can read between the lines. He wouldn't be president if he couldn't. Len, what do you say we bury the hatchet? Why, I'd be glad to. Fact is, I was hoping you'd suggest it. Piggyback's done more for me than solve freight hauling problems. It's shown me that a bullhead like myself ain't gonna last long until I've learned how to cooperate and get along with people, sometimes even with my competitors. We'll see you next week for more adventure with...


All right, Sabra Traders. Good afternoon and welcome on back. Still a little hoarse perhaps, but I feel a lot better. Great to see Andrea and all of our students live inside our live trading room. And great to have all this back on social media, Facebook Live, LinkedIn, Twitter, YouTube, et cetera. I got the hot tag from Fausto to conduct the phase three stock course class. Lined up, pardon me, later on today. There we go, beard all systems there. Later on today at three o'clock Eastern time conducting the phase three stock course should be a volatile one folks. A lot of sarcasm there. So it has been a very slow afternoon up until right now. Pardon me again, MDAI trying to make a nice little pop heading into the afternoon right now though. So for right now I'll put this on our watch list to begin. Like how could we not, you know, it's up big, it's at the highs. The thing that I don't like about this trade is that it has a really thin book for the price. Three dollar stock, it's on like, you know, a few cents spread here and there. The tier size is very light. Gotta be careful. But for right now MDAI, I'll put on our list here. I would assume this is an AI stock. It says it in the name. There we go. You know, you figure all of them do, but not necessarily all of them. So MDAI is spectral AI. I don't know if it's a specific sector play or what does not seem to be with AI here and not really budging, BB AI, SOUN, like all these others. Nothing really happened in there. So it's just that one stock in particular MDAI. You know what? I got my news up right in front of me just before we just zip through the percent gainers and losers list here. A lot better on the throat now. So a special MD awarded Barnab Project BioShield Contract valued at $149 million. Okay. Well, for a small cap company like that, I'm sure that's actually pretty significant. So, I mean, hey, nice news from the morning. Let me jump back to that ticker. Not this, but MDAI. I know hopefully this builds another higher low, breaking the actual high of the day and running higher into the afternoon. So if it doesn't do that, obviously we're not gonna be as invested to trade it. We're gonna probably follow a few more stocks on top of this at least here. And with that, let's just go right from top to bottom now. Gotta probably go through this with the fine-tooth comb, bunch of stocks that are like below a dollar. VVOS, I know one of our students, Mike, it was on one of these stocks, maybe it was the NVOS. VVOS though, had a nice little pot from the morning session here, 25, 26 cents up to nearly 45 cents there. So pretty strong gain, but these stocks we normally don't tend to trade, unless if they're knocking their head right on a dollar on the door right there, we're not gonna be as keen to follow it. NUVL, what the hell happened here? A nice pop from like 42 to 62. I did not see this at the time. I got a little time on my hands right now on this check news. NUVL, phase one, dose escalation data, blah, blah, blah, blah.  So yeah, NUVL just way too expensive normally for us here. Two cheap stocks here. This one's a little too expensive. And not only that, but obviously the books so. This is the one that I think my student Mike ended up doing really well on. My student Mike got like 25 or 20 cents on these trade phenomenal push. And it was a three day swing. He wrote that earlier in the chat board, Mike C. So, you know, you got out just before but still pushing up MVOS. You know, I just said it before though, unless if it's like knocking its head on the door of a dollar, we're not gonna be as jumpy to trade it here as a group here in the side group room, but nice pop. GRTS from the morning session as well. Nice little pop there. I'll tell you what, COVID and strep throat combination, not really a fun combo there. I peaked at 103.6 a couple of days ago, temperature wise. I'm 98 and a half right now, a lot better today, but still got a little ways to go. So let's see what else we could add here on our watch list though in the meantime. Ooh, I was an ETF, crude oil, crude oil SEO. All right, so I bet your book map is gonna look really bad for this year, this one as well. So some of the ETFs maybe you could trade, but this one I've built in the past, it's been really bad on book map. So all right, I looked at this one already, BTAI. Here's SAVA, familiar name. Spread's not horrible. I just would rather trade at this point, like TSLL, the Tesla ETF, right? I mean, you saw a Tesla push up nicely before, that's at the highs. You know, it's up nearly 5% as is, right? Well, TSLL, this is an ETF that tracks Tesla and if you are not buying calls on Tesla itself, then you would be more likely to follow this and just trade this as like an equity basically. So Tesla and TSLL, we'll add to our watch list. Another EV company, Rivian, pretty strong, making a nice bounce back up today. It's tradable, it's very tradable, it's up over 5%. I don't mind actually adding this to our list as well. We don't have a big list just yet, so I'll add Rivian. You don't want a big list, just you gotta have more than like a couple. What else we got though, otherwise? I got Pixie on the gainers list again, popped from the morning, but then died off pretty early as you could see. All right, so let me know if there's anything looking good on the way up, folks. I'm gonna just check on the loser side here from Sam and John. I appreciate their recommendations. John's saying Tea, Honey and Vodka. I'm gonna pass on the Vodka, John. But Tea and Honey we had been on and Sam saying Penicillin, Paxilovid. I've had Cephaloxin as my antibiotic for streps up and good there and a lot better today than yesterday. I'm sure tomorrow will be even better. So on the mend. Let's see what we can get on the loser side though. Evix, nice short from earlier today actually, E-B-I-X just kind of in tier size there. Already bounced back up a decent chunk.  Got to filter through that a little bit, but otherwise just checking to see if there's any other like name brands, anything that we looked at from earlier, which honestly, I could just tell you right now. Nothing here looking too tempting from the loser side right now. So if there's anything else looking good across the board, let me know up down left, right more than 5% or any other sideless stocks that you see. You look good. Mike from before, I thought he had commented AOI. I was just catching the chat right now. Yeah, actually, where is this on the losers list here? Oh, it's hard to borrow. That's why I was like skimming through. Like I bet you if this said, if this didn't say hard to borrow, I would have been more keen to spot it there. But yeah, it's at the lows. If you could short it, then, you know, it definitely seems like a good tradable stock. It's one that we are familiar with in the past. And it's just that like the dip point you're back from like September. So, you know, it smashes that. It looks like it's going to keep going. So, not a bad short, not a bad call off from Mike there. I could add that to our main list even though it's hard to borrow. Just double check, you know, and you're with your broker. Check to see if you can get the shares. Use the intraday short low-kit app if you got it. Then check on YouTube, Facebook, Live, and of course just Benzinga scans before we wrap up. See if there's anything looking good across the board. Maybe AMC. There we go. What's the news? What's the news AMC? I don't have any news from today. There's news from yesterday just, you know, firm doing a price target, lowering price target. Nothing really significant happening so far. So maybe there was news that just came out. We'll figure it out coming up in a moment.  You know, it's crazy. It's like in like four years basically since that's happened, time has freaking flew. All right, so for anyone here that is not familiar with the AMC short squeeze back a few years ago, three, four years ago at that, oh yeah, obviously back in 2021, big pump and dump. This was based off social media platform Reddit. And this was really based off of GameStop, right? GME and alongside that, a few other freaking mortars out there. AMC was one of them, Express, if I'm not mistaken was one of them at the time. Not listed any longer, but Blackberry. I'm kidding. There's a little inside joke. That's Bed Bath Beyond, BPPY. But yeah, Bed Bath Beyond, they closed shop didn't they? So no longer around to show that. So, you know, hey, AMC good trade to work with right now. Let me go back to that GameStop move at least. GameStop trying to perk up right now actually. You can see that there. AMC up a lot more percentage wise. So that'll be the kind of the lead horse right now. And I don't mind adding GameStop just in speculation, right? You know, if this is moving up as nicely. I'll give GameStop a little shot, tagging on the back end of the watch list for right now. All right, so folks, I'm not gonna go here, but I think all frogs are cleared for right now. Should be good to go for class later on today at 3.05 Eastern. So for over Gold Platinum Diamond students, I look forward to seeing you there. Got the hot tag from Fausto, so I will be conducting that class myself. Hopefully a volatile market, a little sarcasm earlier with saying that, but hey, even if the markets don't break, heading into the afternoon. Now this AMC trade is a really good start. So you bet y'all be focused on this AMC trade by the time class begins. I look forward to seeing most of our students there. And for those of us not joining me in class here, best of luck trading here, heading into the market close. Rich will be on the mic at three o'clock. Take care.


PICK! God, say out! What is up with these guys? The first two games were tough, man. I lost on blocked field goals. Got my field goal blocked for the win. Blocked. Tough. Iced field goal blocked. And they were against, like, real easy. I don't want to say easy opponents, but it should win every time. My setup, yeah, yeah, yeah. There's also a video on YouTube. You can go exclamation point setup.  And you want to go check it out while we load in this game? I'm playing my man Rage. Rage is a good player. It's going to be a good game.  I'm just glad I saw that. I don't know what happened. I don't know what, you know. I'm just so glad I saw that. And I probably only saw it because I was looking at the wheel route. Ramsay, come on, bro. Wow, you can do so much better than that, dude. Come on, man! That's a hard flat, bro. Come on, dawg. There's no way a draw just pops in here, dude. There's no way a draw pops in here. Whoa! Sherman, man! God! Man, this dude Tony has 74 route running. We can't stop that. Man! Bro, the mobile quarterback is just a nightmare, dawg. Like, the mobile quarterback is absolutely a pain in the...dude. Bro, we just cannot block, dawg. Block, dawg. Oh, my God. It's miserable, dude. Michi! I almost called time out to take him out of the game. I can't lie. I almost called time out to take Michi out of the game, bro. Oh, my God. I wish I knew he would have got that block, dude. I wish he wouldn't have got that block right there. Come on. Come on, bro. Like, there's no way of all that running. God, say out! You're gone.   Dog, dog. Motherfucking, my life is...   It's just an awful player, dude. Snap, snap, snap, snap, drag, drag! Literally, coulda do it.  We have three pick sixes. It's just the mobile quarterback is just absolute nades, dude. It really is.   He's sweet. Oh, my God, that dude matched. Oh, my God.  Luck, man. Good play.  Face mask? Who put...   Dog, I'm getting pissed, dude. I'm getting pissed right now. If our rat catch right there, we might score. Oh, my God, man. Just hold that a little bit longer, dude.   I'm lucky. I high balled and he caught it. A little bit of luck, a little bit of luck. Or how about I wasn't unlucky that he dropped it, you know. But it's like, it's so much traffic there. I want to put the ball where up here, right, boys? There's so much traffic. I don't want to... I don't want to ask somebody. I just want the ball to go... You know what I'm saying? That's all at high point, dude. It wasn't like... The eggs were broken for like two months last year, right? The eggs were broken for two months, but it wasn't about the ball being high. It was the DBs didn't do... That's what made it broken. The throwing the ball high is a good feature. There's no way draw is hurting me with this many people in the... Yo, somebody shed one time, dude.  Draw?  Dude, how is the run doing?  There we go. Swat team! Oh, my God, dude. We're right back where we were, huh? Ah, no, the... It's to the middle. That's my fault, bro. I lobbed it to the outside because I thought that's the release he was going to get. He gave me a cut zero coverage. I've been throwing that all weekend. Nice. What's that? GG, GG, GG. Like, I'm telling you, bro, inside the 10, just spy got to be the first... Spy got to be the first adjustment. I swear to God, spy got to be the first adjustment, bro. Bro, I had that lob. I really had that lob. I got to throw it inside instead. I let it outside. I got to go inside. That's my bad. That was bad execution. Great call, bad execution. That's all.


$60 million in federal grant funding is available nationwide to non-profit groups that are 501-C3 eligible. Non-profit groups that are considered to be at high risk of terrorist attack due to their ideology, beliefs, or mission are eligible. This funding is intended to support the purchase of physical security enhancement equipment and security-related training for the non-profit organization's facility. The turnaround time to apply for this grant will be very short. The federal announcement is anticipated to be the third week of May with applications due to the state in June. We are encouraging potential applicants to get a vulnerability assessment now of their facility. Information and a vulnerability assessment worksheet webinar are available now on our Cal OAS website to assist applicants. Please visit our website at caloas.ca.gov and search for non-profit security grant or call<PHONE_NUMBER> if you have any questions.


Following a night stay at Gales Hotel in Irvine we made a short journey to the Ayrshire Seatide town of Largs where our adventure was about to begin. I've done a lot of filming across Scotland in the last couple years but this is the first time we're sat on a boat about to leave the mainland and welcome to what's going to be four episodes of ferry golf yet we have set sail on a real adventure I wanted to do this for quite some time the next four Sundays you'll see an episode every week of me on a ferry on an island playing some golf and it's a real adventure and it adds to the excitement this is not about just playing golf it's about this whole journey and the first island we go to is Cumbrae and the golf course we're about to visit is Millport. I can't wait to get there to be honest with you. Once we have arrived at Millport golf club which is it's probably two or three mile away from the port itself take long to get here it's a bit more in terms of their housing and where we drove through than I expected to be honest with you but it's absolutely deathly silent here this morning so so quiet almost surreal let's get to the first CA so quiet. The Isle of Cumbrae only has 1,300 residents but this is Scotland and a golf course is part of the island's fabric and it's a golf course that's supported by residents holiday makers and daytrippers alike and from what I can see a warm welcome awaits right so on Simon is Alex Higgety who is current captain at Millport Golf Club and Alex I'm about to tear it up on the first yeah the question is what am I gonna find out there what can I expect? Lots of ferns lots of gorse keep it down the middle and once you get up to the fifth and play from there on you'll see the most spectacular views you'll see in the midst of Scotland. I like the idea of the views keeping it down the middle that's the that's the hard part yeah we'll see how we get on. Thanks, enjoy your day. Thank you, cheers Alex. Thanks for coming. Keep moving malt keep moving and bounce and bounce that's so firm that's not bad you know this place what is it 1,97 I think it's a par 3 it's gotta be all uphill the thing after four holes is just the absolute serenity of this place I said on the way in it's quiet it is so calming of it's probably I think the four greens in reg so far you find yourself swinging about 75% of what you normally would everything just drops down a little bit because you feel very much it's great so as you climb up the views just get better and better and as you can see now so the clubhouse I don't know where it is it's down there somewhere took the way to the left I think but how my word how good is that and it's still deathly silent I can imagine obviously the wind does blow on Cumbrae it does a bit in Scotland so I'd imagine there's days when you absolutely blown off your feet up here because we're relatively high right now but even on them days I think you can have a bit of a glance round yet I love courses where I say it time and time again where even if your golf is absolute garbage you can have a little bit of a look around and think thank God I'm on this golf course I'm not stuck in work or an office or something else Scotland is very very pretty isn't it right wedge up the hill so we're approaching halfway and this is just ideal holiday golf I've got you'll notice I've got no driver in the bag today you might need it when the breeze blows but other than that now it's kind of you can certainly go around with half a carry bag a Sunday bag you'll see some great stands that I love where you just prop your Sunday bag up on which I've not seen too often around the place the views like I said are absolutely spectacular I just our ferry from Largs it's just a 10 minute trip over and then like I said five 10 minute drive then into Millport it's 24 quid to play here today and I just think it's a fantastic little break from everything is with air sure there's so many good golf courses everybody knows about them for the sake of a 10 minute ferry journey and getting on to the island it adds to that little bit of an excitement and like I said it becomes a day trip it's not just about the golf it's a back kind of experience it really is nice I've just been got the scorecard on 10 because I would assume this was stroking next one it's certainly the most difficult hole we've played so far which is team back on the horizon plenty of room off the tee box but it's a second shot in which I only had a nine I'm nine iron in hand but I managed to pull it into this side it's very much into a narrow gap and either leak one right or what I did pull one left lost ball into this long stuff I thought was a fairly tough hole but maybe you've only got a short iron in hand and on my second ball it's just behind the camera woman who's making her way backwards but yeah great golf hole and tough the toughest we've played so far but stroke index one is yet to come I forget in the old it might do nearly made a bit of a save in there but like I said pull one into the long stuff over there and as I said earlier don't win Jan just have a little bit of a nose round and the Sun has come up now the views are even more spectacular I'll give myself that one but I said about stroke index one was yet to come it's a 13th hole and I can see why it's tough it's 440 off the yellows we've got a decent ball up the left side of the fairway and the camera is huge depending on which way you're playing obviously they're up or down the cameras are quite severe and you've got to be on the right side of the fairway but still left 183 in and I've just flew the drone from here in which you're looking at now I can only see the tip of the flag and it looks to be the most narrowest of greens to try and get to are really tough golf all I'm playing the fairways have been really firm and fiery I'm gonna play a six iron which is definitely not what I would play for 183 but hoping this sort of bounces in a little bit that's a decent ball here's that firm bounce it's almost like it's landed on a tennis court that's just bounded up in the air from what I can memorize from the from the drone shot I think that might have missed the green just on the left hand side based on it being so narrow and a really good strike to be fair but by far the toughest all we've played this morning right my round has come to an end and there been a really enjoyable morning we had a bit of sunshine that came in for a little bit last hole is 299 off the yellows which is where I've played from and out of interest the course plays just 5400 yards as a visitor off the yellow tee blocks and for me you know the 5300 yards sort of explains what this is all about it's having a bit of fun it's a fairly relaxed easygoing course it's very much a holiday course you come here you make it all about a day out you get that ferry over which is all part of the experience so much to eat in this clubhouse afterwards which is seemed very very friendly indeed and now it's time to get a ferry back onto that mainland see where we're going next right that is us back on the ferry to the mainland interlarges and then we're about to catch another ferry in a couple of hours time onto another island and that'll be next week's episode so don't forget next Sunday 6 30 I'll see you all then for episode 2 of ferry golf comments down below hit that like button and if you haven't subscribed already then I'd appreciate it if you would do so I'll see you all soon


So, many of you may be familiar with Wordle, it's a game that's very popular right now. When you complete the game, it gives you share options. And those share options will give you an image of what to share with the people, but it's not actually an image file, it actually looks something like this. And the way this is done is using emoji cons to show your progress in the game. Which I thought was real neat. So I thought, you know what, if you can draw stuff with emoji cons like that, maybe I can write a bash script that will convert images to emoji cons. So I created this script that I can give an image file to, such as this BMP here, this bitmap. And I can output it like that. Now, my output is a grayscale, but that could always be improved upon. And it also works with JPEG images, even though they have compression on it. So I'll put a link in the description of the video to the script, so check that out. And in my next video, I'll go into more detail on how this works. Have a great day.