of call. Far at the world's end, strange fascinating lands back in us bid us revel in their exotic splendors. Come with us as we head for Port of Call.  A fertile, smiling land, half European and half African whose sunny shores glow with the deep gold of fragrant oranges these white beaches are finged with feathery palm trees. Come with us to Portugal. Seven centuries before the Christian era, the Phoenician navigators having founded trading posts all around the Mediterranean basin sought new outlets for their commerce. Sailing through the Strait of Gibraltar, these hardy mariners bore to the north dropped anchor at the mouth of the River Tagus and there planted the nucleus of the same smiling city which now greets us Lisbon, for the past six centuries the capital of Portugal and in spite of the bustle of its port, Lisbon and thrown upon its seven hills still reminds us that it was once the favorite vacation land for the haughty nobles of ancient Rome and that its varied charms were celebrated by the great poets of antiquity. Making our way inland, we feel the intervening centuries slipping away. Soon we are immersed in the atmosphere of the Middle Ages fraught with grim tragedy, with nightly courtesy with the songs of the troubadours, the clash of armor the mingled war cries of Christian chivalry and of the Moorish warriors of Islam. Before the Gothic pile of the Church of Alacoca the shades of the distant past seem to take shape before our eyes and we witness anew the old tragedy of the love of Pedro the severe or the beautiful Ines de Castro. A house in Coimbra, the ancient capital, 1352. Do you think it is a sin for me to be so proud of Don Pedro's love for me? Sin? Oh, no, no, Senorita Ines. Ah, your beauty, Senorita, is the warm beauty of the Portuguese not the cold, haughty beauty of the Spanish princess. Hush, the Spanish princess would one day be queen of Portugal. If she leaves, but she will not last long now, that Spanish princess. They say she is very ill. God will take her away or spare her as he knows best. Oh, but come, Maria, don't Pedro may come any minute now. Maria, look, it's my hair all right and my dress, my veil, oh, hurry. See, you are beautiful, just a touch of rouge. There. Now, run to the window, Maria. Can you see him? They got horses coming down the street, Senorita, men with torches. See, see, it is Don Pedro. Oh, my handsome prince, ah, but you are late. I know, things have happened at the palace, serious things. What is it, Pedro? My wife, the Spanish princess. She's... Yes, this evening Ines, she's dead. Poor thing.  She wasted no love on you. She has always known that I did not love her. Our marriage was only a political arrangement. I know that, Pedro. That's why I'm sorry for her. It calls to be near you and to know that you love someone else must be torture. I've been jealous of her, of course, but I've not envied her, even though she was your wife in the eyes of the world. Ines, but now she is dead and things are different. When I follow my father on the throne of Portugal, it is you who will be the queen at my side. Pedro, what are you saying? It is impossible. It will be as I say. Your father will arrange another political marriage for you. Another Spanish princess, perhaps, who will be a rich dowry and support of Spanish troops. I could bring nothing but my love. And what more good I desire. Pedro, how will you manage this? It's very simple. We will be married before my father knows anything about it. Married? But when? No, at once. Pedro? Come to the church. Come, Maria, a clog for your mistress. Your Majesty, these alliances by marriage with Spain are an old and well-tried policy. We should by all means continue them. There is no better way to assure the good will of Spain toward us. And Spain is indeed a mighty power. This is the opinion of all the council. Very well, then. Harold, advise on Pedro that we wish to see him at once. See your Majesty. We fear that the future of Portugal demands that you contract a new marriage with another princess of the House of Castilla. The Spanish envoy assures me that such a project would be greeted with pleasure at Madrid. We wish now to inform you of our decision and to receive your consent. Is that all? Right. You consent, of course? No. What? I said no. Don Pedro, I am no longer speaking to you as your father. As king of Portugal, I order you to give your consent immediately. Your Majesty, I have sacrificed myself once for reasons of state. As crown prince of Portugal, I married a Spaniard whom I did not love. By her, I have had a son to carry on the royal line. My duty and at-respect is finished. I will not marry another Spanish princess. That is final. I will oblige you too? You cannot oblige me too. And why not pray? Because I am already married. Married? To whom? I know. It is an infamous Ines de Castro. That's all.  Don Pedro, my son, be calm. Fillio disrespect is a grievous sin. I have married Senorita Ines de Castro. And when I succeed to the throne, she will be queen of Portugal. Never, never! Your Majesty, I have a plan. Plan? Yes, wait. Very well, Pedro. We shall not decide the matter today. Go. Lead your troops in your campaign across the Tavus. Perhaps the heat of battle will melt your stubborn heart. Farewell. Guard thee with your arms. Farewell. Now count. Your plan. What is it? We can do nothing with Dom Pedro as long as he is married to this decuster woman. He has loved her for many years. They are devoted. Yes, yes. I know all that. Come to the point. Dom Pedro will soon be safely out of the city. Then what is to prevent us from removing the only obstacle to the Spanish marriage? You mean? Ines de Castro. Shh. Wait a moment. The council may require? Yes, sir. Now we are alone. Well, continue. It is very simple. De Castro returns from her evening prayers at the cathedral at nightfall. Two men could strike her down in the streets. And I know the men. Get them. Here they are, your majesty. Are they trustworthy? They have been of service to me. Very well. But no bungling. I do not want wounds. I want corpse. You will have a corpse, your majesty. Oh, good. Two thousand cusados each. Come back here for it tonight. As soon as you have killed Ines de Castro. Ines de Castro? Never mind. I know. Come on. Let us go. And as the king and his evil advisor waited in the dark council chamber, the hired assassins stole through the gathering dust toward the cathedral. There they waylaid their victim. Their sharp daggers flashed. Ines de Castro fell dead. Great was the wrath of Pedro. Only the intercession of his mother prevented a civil war between Dom Pedro and his father. But Dom Pedro did not forget or forgive. Five years after the tragedy, King Afonso died. Pedro replaced him on the throne of Portugal. And became known as Pedro de Sevilla. Well, Carlos. Your majesty, I am happy to say that I was able to trace the assassins of Dona Ines to their hiding place in Spain. And you brought them back? Yes, your majesty. Excellent, Carlos. I shall remember you for this. See that they are well guarded. I shall deal with them later. Very well, sire. And now, the queen of Portugal. The queen of Portugal? I said the queen. Cardinal, listen to me. Prepare the cathedral at once. Flowers, music, candles, all the clergy, all your finest robes, incense. But your majesty. Silence. You have heard my wishes. Go and prepare. See your majesty. Chancellor, I want all the court at the cathedral within an hour in full dress. For the coronation. The coronation? Exactly. Tonight, we crown the queen of Portugal. And we crown thee Ines de Castro, queen of Portugal. A nominate partner, set filly, that spirit of sanctus, amen. Amen. Ines, my beloved. And so Pedro, through to his promise to his beloved wife, at last witnessed the coronation of Ines de Castro as queen of Portugal. With the full ceremony of coronation, his deepest tribute to her memory, five bitter years after the assassins of his father took her from him. Looking inland, we see the lofty mountain barrier which separates pastoral Portugal from the arid uplands of Spain. To the westward, there is no barrier but the sea. And the Portuguese have always been at home upon the sea lanes. It is largely due to a Portuguese prince that the 15th century became the era of discovery and that the limits of the known world were extended to include new continents. Deeply versed in mathematics and navigation, Prince Henry, surnamed the navigator, though he had never made an ocean voyage, spent the greater part of his life directing the efforts of Portuguese explorers. At his death in 1460, the west coast of Africa had been explored and charted as far as Cape Verde. The impetus given maritime science by his school at Saugus, where were gathered the greatest photographers, mathematicians and navigators of Europe, kept alive the spirit of scientific exploration Henry had fostered. Thus it was in 1497 that Vasco de Gama was commissioned by King Emmanuel I of Portugal to attempt to reach India by circumnavigating the African continent. Vasco, your ships are ready. They are the finest caravans ever built. Arthur Muldias himself was in charge of their construction. They are supplied with every known aid to navigation, every available chart and book. They carry stores for three years. The crews are all especially trained. You have the finest ship masters and pilots in Portugal. You will command the flagship, the Sao Rafael, your brother Paolo de Gargama, the Sao Gabriel, and Nicolas Coelho, the Sao Miguel. To you we entrust the royal standard of Portugal. In all confidence in your skill and courage we say, go Vasco de Gama for the glory of God and country. Music As the king waved God's speed to his explorers, as the people cheered and cannons fired their salutes, Vasco de Gama and his 160 adventurers hoisted the royal standard, loose the white sails of their vessels, and sailed out the mouth of the Tagus River for their epoch-making voyage. Holy mother of God, will he ever see land again? Not on this course, that is certain. I sail with Diaz. We made the whole west coast of Africa, but it was not like this. We stood on and off and landed every few days. But this, we have not seen land since we left the Cape Verde islands. Nor will we, I tell you, if we hold on like this to the southwest. We've been on his tag for how long, Bosun? Two months tomorrow, two months. Think of it. I am fighting, Bosun. You are not the only one, lad. It is getting darker and colder every day. There is less daylight, more darkness. Oh, I wish he would tack now. He swears he will stay on this tack till he is sure he can clear the Cape of Good Hope when he comes about. We will all be dead before then. He is insane. We will run into ice, or we will be swallowed up by some monster. The ships are taking water as fast as we can pump it out. I wish he would put back to Portugal. That's what I wish. Maybe he would if we were too full. That is a dangerous talk. Look, the Sao Miguel is standing over towards us. They are signaling. Listen. What is that? Oh-ho. The gamma. Well, go ahead. Many are sick. The ship is leaking. They insist we turn back or stand in toward the land. Listen, men. We will not turn back one ship's length. We will not stand in toward the land until I have held on this tack long enough to clear the Cape when we come about it. This is final. I want no more questioning. Did you hear that, men? It is no use. The other ships are afraid like we are. You heard what they said. We cannot go on with this mad man any longer. There's only one thing to do. Mutiny. Excuse me, Capitan, for running in. I did not want the men to see me. It's important, Capitan. Well, what is it? Sir, you know the men want to turn back. Yes, I know. Are you afraid, too, lad? Yes, sir. But I think you will bring us through while they do not think so. But please, sir. Go on. Are they up to something?  I was afraid of that. They are in earnest, sir. Thank you, lad. And be careful.  I know it, sir. But save yourself. Why did you risk this for me, my boy? I do not know exactly. Except that I... Well, I am just a little ship's boy. I do not matter if I live or die. But you are...  You must be saved from harm by ignorant men because you will find the route to India. At least you believe in me. Good lad. I have an idea. Yes, that is it. Tell the bosom to call the ship's company on deck. Yes, sir. Now, men, we are all gathered together because I have something important to tell you. You are all frightened and weary. Yes, we are weary. I am no more valiant than the rest of you. I am just as tired as you. I would like to be home in Portugal just as much as any of you. I am not an inhuman monster who enjoys seeing you terrified and suffering. I know you do not want to go on. And these ships, after all, these storms are in a dangerous condition. So, I do not want to be answerable for your lives. Therefore, I have decided that if we run into bad weather again, I shall abandon the voyage and head back to Portugal. I thought that would please you. It pleases me too. But there is a formality to go through first because if we go back, the king will blame me unless I have something to show him. Therefore, my clerks are preparing a document setting forth all the reasons we have for abandoning the voyage. And I want each one of you to sign it. Yes, sir. Now, the document is in my cabin. You will sign in order of rank. First, the shipmaster, the navigator, and the pilot. The rest of you after it. Come forward, you three. Come in. Here, Carlos. Miguel, put the three men in iron. Quickly, push them into the lower cabin. Lad, fetch me all their navigating instruments at once. Bring them to me on the quarter deck. Yes, sir. Now you, Miguel, stand watch over the prisoners. Carlos, come on deck with me. Give me the instruments, please. Here they are, sir.  Here are all the navigating instruments in the ship. You'll see what I do with them. Holy Mary, he's thrown them overboard. Over the board. The instruments are gone. See, they are gone. And the only three men in the ship who know how to use them are my prisoners. Now move from you and they will be killed. Now you will go with me where I choose to take you. You will rely on me from now on, or you will perish. You can all know now that this voyage is going on as planned. And if I do not obtain the information the King sent me to get, neither I nor any of you will ever return to Portugal. Thus it was that the indomitable Vasco da Gama persevered in his purpose. Ten months after leaving Lisbon, he dropped anchor in Calcutta, having crossed the South Atlantic within a few hundred miles of South America. The sea route to India was open. For a brief period, Portugal was the world's greatest maritime empire. The might of Portugal endured until her armies were defeated by the Spanish king Philip II, whose ferocious lieutenant, the Duke of Alba, placed Portugal under the Spanish yoke in 1581. From then on, her power melted away. Her far-flung colonies, Madeira, Brazil, India, and China were lost to her. And though she passed through a long succession of political changes, from a Spanish protectorate to a constitutional monarchy and dense to a republic, Portugal has never regained her ancient standing as one of the great powers. Through Upper Portugal, flows the river Douro. At its mouth lies beautiful Oporto, in its present aspect, very much like a city of the 18th century. It was the ancient city on this spot which gave its name to the whole country. For the Romans called it Portus Calais. It is by the wine which grows in the Douro Valley that Oporto is known chiefly to the modern world. In the days when George III was king of England, rich, warm, ruddy port wine became the delight of the aristocrats of Europe. Through crystal decanters, it has shed its purplish glow on the fine white linen of countless dinner tables in the old and the new worlds. Kings and diplomats, princes and merchants have sat long at table as the handicatters were passed around comparing notes and savoring the rare, rich taste of good port wine. It is perhaps due in part to the glow of the sudden sun thus brought into foggy England hogsets from Oporto that the English have ever been firm allies of Portugal. So as our ship steams out of the harbor of Oporto to carry us home, let us profit by this delight of the gourmet to drink a toast to charming hospitable Portugal in the generous wine which will serve henceforth to stir in our hearts a cordial souvenir of this beautiful country. We invite you to join us again next week at this time as we journey to another of the world's fascinating ports of call.


Hello everyone! My name is Dennis. I'm an application engineer working in MAMS. I'm here in CES 2019 showing my demo about SLAM. So here is the demo. It's about the simultaneous localization and mapping. We are fusing the data of the IMU sensor, our LSM6DSR, plus encoders and Timeofly Array VL53L1X. We are fusing all the data together in order to get simultaneous localization and mapping. The demo is meant to illustrate the ST know-how and sensor fusion algorithms to develop solutions for applications that require real-time localization. The algorithm is on SLAM developed internally in ST and accurate real-time position. It includes, as I said, the IMU, Timeofly, and will encoder-based. This is the main SLAM block diagram. We first need to integrate and synchronize the data between the timeofly and the IMU. Once the synchronization is completed, the main block of the extended Canon filter is working. It is sliding in Windows and processing by Windows. We can find a keyframe in the maze. When the loop is detected, we try to update the same features in order to better estimate and close the loop to fit the features. This is the ardor description of the demo. We have our VL53L1X Timeofly sensor. The nine sensors will provide 176 degrees field of view. We have a resolution of 1.5 degrees and a sampling range of 5 hertz. Then we have the LSM6DSR IMU that has a sampling frequency of 100 hertz and an excellent biostability of 5 degrees per hour. And a lot of digital features that includes a FiniState machine and machine learning core. The algorithm is fusing the IMU Timeofly encoders and giving a real-time loop closure, enabling an accurate area mapping. For any other information, visit our website ST.com. Thank you and have a great day.


Hello developers, my name is Matt Ravel and today I'd like to show you how to integrate bootstrap into an Angular 9 application. I'm going to begin by showing you this GitHub repo that has all of the completed code. That's an octa developer, octa angular bootstrap example, and in this repository is a demo dot adoc. This is the instructions that I'm going to use to guide me and you through this screencast. If we look at the raw version, I have an ASCII doctor plugin installed that shows a much prettier view. What I'll show you today is how to first integrate bootstrap into an Angular 9 app, and then convert the app to sass, because CSS is a little more fun when you're using sass in those variables. It's more like a programming language. We'll make the app look good, we'll add form validation, and then we'll write some code to develop a searchable, sortable, and pageable data table. The last part sounds hard, but actually Spring Data JPA makes that very easy. We can actually do it in under 10 lines of code, so that's thanks to Kotlin and Spring Data JPA on the back end. This builds from a previous tutorial. If you were to read build a crud app with Angular 9 and Spring Boot 2.2, you'll see how we developed that, and there's a screencast there as well. There will also be a number of live templates I use in this, and IntelliJ live templates are basically a way to just type a few characters and spit out a whole bunch of code. Those are available in my GitHub repo at mrable.idlive templates, and you'll see we have some prerequisites, Node, 12, Java 11, and an Octa developer account. I'm going to put all those instructions on the left there, and then on the right, I'll make sure we have Node 12 installed, and Java 11, and an Octa developer account. I already have one, but if you do not, you can go to developer.octa.com, click on create free account, and go ahead and sign up for one. Enter your email first name, last name, and that's about it. Mine is at dev13320. You can see, and I can sign into there while we go back to these steps. So to begin, I'm going to clone the previous tutorial that I mentioned, this Angular 9 plus Spring Boot 2.2 crud example. So using git clone, and we'll put that in an octa-angular bootstrap example directory. It already exists, because I like to practice. Try that again. And now cd into there, and go into the notes directory, that's the Angular app. If you were to look back, you can see there's notes and notes API. The notes API is a Spring Boot application written in Kotlin. So if we go into notes and do MPMI, this will install all the dependencies in that project. Next I'll integrate bootstrap for the CSS and ng bootstrap, which is a component library with Angular that you don't need jQuery. You can just use Angular to add behavior to bootstrap. So MPMI bootstrap, and you don't have to specify the versions, but these are the only ones that I am certain work, because I tested it. So 6.0.0, you're welcome to try some other ones, but can't guarantee everything will work. And then we'll open both projects in IntelliJ, and then we'll start by importing the Gradle build file for the Spring Boot project. So import Gradle project, and then we'll go into the notes project in source app, app.module. We will add that ngb module. So under imports, ngb module, make sure you get the one from ng bootstrap, there we are. And now we should be able to run our client using cd into the notes directory and ngserve-o to open your default browser. So you can see it opens up my default browser, which is Firefox in this case, but it doesn't actually have anything in it. Let's look in the console and see what's in there. Oh, it shows an error. So it looks like your application needs Angular localized, so we'll grab that command. We'll put this on the far left, back to our terminal, and in notes we'll run ng add Angular localized. So ng bootstrap depends on that. And now you can see our app is running, and we have a login button. But let's worry about making this screen look a little better. So we'll put this down on the bottom here, and we'll keep that Firefox on the top. The first thing we're going to need to do is add the CSS for bootstrap into our styles.css. Now you can see we've had some changes there. Let's change app component to use some of the bootstrap classes. So I'll change this h1 to a nav, and then we'll add some classes, nav bar, and nav bar expand when it's large. And then we'll make it dark, and we'll make background dark as well. Okay, so now we're getting somewhere, but our title doesn't look good, so let's add some classes to that. We'll use nav bar brand and text light. Now we need to wrap that around the title. Now we're getting somewhere, and we'll put a little padding around our router outlet here. We'll use container fluid here, and we'll put some padding on the top, pt3. Then we'll go and grab the router outlet. Now we're getting somewhere, and now we have something that looks better. Now I want to show you how to secure this. So it's already set up using Okta for security, and it's not really Okta, it's OpenIDConnect. So any OpenIDConnect provider should work to secure this particular application. I'm using Spring Boot on the back end and Angular 9 on the front end, and so I'm going to go ahead and configure Spring Boot first. So we have to register a new app on Okta. So we'll go to my account at dev13320, log in there. Like I said, we're going to start with the Spring Boot app. So I'm going to add a new web application, and I'll just call it Spring Boot. And it's localhost8080, log in, OAuth2 code, Okta. And so that's built into Spring Boot. If you were to use a different provider, you would use something other than Okta at the end, but the rest of it is standard Spring Security configuration for OAuth and OpenIDConnect. So we'll go ahead and click Done. And then we can use the client ID and client secret at the bottom here to configure the security for our Spring Boot app. So we'll go into the notes API directory, and we'll create a Okta.env. No? Okay. We'll just do it from here. Okta.env file, and we'll paste those values in there. So for the domain, find as dev13320.okta.com. You can also find this value under API Authorization Servers right here, issue where you are. Now I need my client ID and client secret. Grab those, and secret. And now we have the Spring Boot side of things set up. So we can source that, Okta.env, and run Gradle Boot Run. And if you're to load up that app at localhost8080, I'm already logged into Okta so it didn't redirect me. If I go to API Notes, you can see there's a few notes that are already entered. And if we're to go to User Notes or even User, you'll see all my information. So that's all working on the server side. Now let's configure the client. So we'll need to create another app for the client. This will be a spa single page application. And you'll want to make sure and use 4200 here. And Loginary Direct is 4200 and plus a callback. You can make this whatever you want, but you have to make sure your Angular app works with it or is configured for it. And if you don't get this right the first time, if you don't put 4200 in there, you might get a cores error across origin resource sharing error. You can go in here to the trusted origins and add 4200 later. If you put it in there as a base URI, when you first create the app, it'll actually do it for you. And it doesn't really matter what you name it. So mine's named My Spa and you can see I'm using Pixi, proof key for code exchange, the most secure form of OAuth for browser applications. And so here we have under source app, auth routing, that's where everything's configured. So I can put a client ID in there. And it's already got my issuer in there for the last tutorial. So now it should have rebuilt the client. So let's try logging in and now we're logged in. So if we were to look at the notes and create a new note, you can see that's all working. However, it doesn't look that great. So let's fix that. But first let's actually commit our code.  And so the reason I did that is because now I want to convert this project to sass.  So I'm going to use sass to customize bootstrap. The first thing I'm going to do is run this ngconfig command, which uses schematics to change the extension, but we're not in the notes directory. So let's switch to that. And then let's find all the files that end in CSS. And we don't want to look in node modules because that's a big ugly mess of source files. So it's still looked in there, so I forgot to add that. You can see we only have three files. So if you wanted, you can manually rename them, but you can also use a rename command and just substitute for CSS SCSS. And you can see it renamed those files for me. If I were to look at version control, you can see that it's removed some and added some. Now we can replace all references to those CSS files with using sed in our source app directory. And then also in the angular.json file, there is a reference to styles.css. So there's two of those. Change the first one and the second one to scss. And then also the styles refers to bootstrap. We can change this to scss and scss from bootstrap. And the reason you might want to do that is to override some of the default variables that bootstrap uses. So let's see an example of what that looks like. In the source directory, we can create a variables scss file. We could override some of bootstraps, for instance, it's primary and it's secondary colors, and there's light and darkened macros that you can use that makes it very easy to adjust things. In styles.scss, we can import before bootstrap variables. Now if we were to go back to our app and run it and do serve, start it back in while we're here, you can see it changes the primary and secondary colors. So that's pretty nice, but we don't really need that right now because I'm not very good at picking colors. So we'll comment that out, take it back to what it was, and now let's make things beautiful. I'm going to start by changing the app.component.html to use a better looking navbar. So it already has a navbar, but let's put one with some menus in it. So like I said, I'm using live templates for this. You can install my live templates and have the same bsnavbar command. And you'll notice now we have this navbar up here and we're using an angular icon that was already in the project. And we have this toggler that should allow us to toggle this menu. And you don't see the menu right now, but if you make it bigger, it shows home, octadev, and the GitHub repo for the project, as well as the logout button since we're already logged in. And then it'll say if we're logged out to please log in to manage your notes. And you'll notice that there's still that login button there. Well, we can remove it, or you could leave it. But in home component, we'll want to take out the login and the logout buttons. Now you won't see them. So the one problem with this is that this menu doesn't actually work. So to fix that, we can use some components from ngbootstrap. So in the button, which toggles it, we'll add a click event handler. And we'll say is collapsed equal to the opposite of whether it's collapsed. And then we can use IntelliJ to create that variable for us. And we'll set it to true. So it's collapsed by default. And then we'll go ahead and change this notes to be capitalized so it looks a little better. And it's still not working. Let's go back to our template and we need to use the ngb collapse directive here and say it's all dependent on whether that variable is collapsed or not. So in this case, we can now click it and you'll see we have an expandable menu for our mobile application. Now let's make the note list a little better looking. So log in here, view our notes, and you can see there's some things that need to be fixed here. So we'll start by going into our list and we have this breadcrumb here that's floating at the top. And so this was all generated from Angular Crud, which is a module on MPM. So if I went to Angular Crud and just googled for it, that's an MPM module. And so if you were to look at its GitHub homepage, you can see how the site looks. So when it generates the default templates, they actually look good on this site, but they need some work in ours. So that's what we're doing here is fixing that. So now we have our menu that looks better on the top. We're using this card here and we need some different classes. So let's do a card body. And then this can be a card title here and we'll take out that div and we'll make this into card text. Okay, so now we're starting to get somewhere and we can take out this div and this doesn't need to be a card. That goes to the text, so we'll move that to the bottom and reformat things and add some divs down here at the bottom. Now we're getting somewhere. It's starting to look better. You'll notice this form here doesn't quite look good on Mogul or it takes up a lot of space, so let's make that into an inline form. Bootstrap has excellent form support form inline. There we are, that makes sense. And now things are a little squished together so we can use some margin classes to clean that up a bit. So on this title here, we can say that we want some margin on the left and we want it to be small and we want some margin on the right and we want it to be a little bigger. So now things are looking better and this one I think should probably be two as well. Okay, and then we have this feedback. We'll give some padding around that too with the margin two or some margin around it. All right, so now let's go into our form and you can see that one needs some work too. So again, we'll take off that float right at the top. These are already bootstrap classes that are in there and then we'll make a similar change here. Two card body and card title. Take out that div and then card text and then down at the bottom add those divs. So that's starting to look better. And you can see we already have form group and form control. In here those are classes from Bootstrap that make these look nice and we'll put some padding down by the button or some margin again. So we'll go ahead and do it on the cancel button, margin left two. So those are spaced a little better and now let's make the title field required. So I'm going to take that one out and it's that same input field but now it's got this ng class that says hey, if it's been touched or it's invalid then show this message here that says title is required. And so if you actually touch it and then tab out it adds a red outline around it as well. So that's good for validation and down here this edit form is not clickable. If you do put something in and you save it then it's not going to work because our backend isn't up and running. So what happened over here? Oh, we forgot to source our octa.env. Now we can hit save and it'll work and it'll go back to our notes list and we can see it. So now let's make it so we can actually use this search right here because right now if we put, you know, d in there it's going to bring back. So we need to do some work on the server side. So in our user controller that controls the user's notes we can add a title parameter and we'll make it optional. So that's how you do that with Kotlin. With Spring MVC and Java you would have to actually add a request parameter and specify default value. So I really like how Kotlin makes this easy. And then we can say return if title is null or empty and go ahead and just return the default one and that's this find all by user else repository find all by user and title containing and then whatever value pass it. So let's ignore the case just like you often do and say principle.name and then we'll also want to pass in that title and then we'll create this on our repository. So this is that note repository that's in our demo application and spring data makes it so this interface and this method will actually create the query for you and pass in and substitute the appropriate variable. So this will find all by the user and any title that matches what we pass in. So now we can restart our server and let's add a searching for title in here for the next time. Probably enter some more data. So let's enter a two and some data and since we restarted it lost all the data so we'll add one again and now if we were to search for two we would just get two and if we search for one it won't even be case sensitive. So we're searching by titles all working and now I'd like to add sorting you can't click on these column headings so let's add sorting. So you can do this mostly in Angular and the note list will add a sortable directive so you can see here this is a directive its selector is any TH or table heading that has a sortable attribute on it sends an event of the direction that you want it to go in. So in our note list component we'll go ahead and add first of all the headers as a view children and an on sort and the on sort method is what does all the logic so we'll grab that and just move it down a bit right after ng on init and so this gets that event and it goes ahead and resets the other headers and then sets the column and direction so in note filter we'll need to add that column as a string and direction as a string and reformat that and now we can modify in note service to take those into account so here's find right here and we'll first of all pass the sort to the server side using filter.column and comma filter.direction and then we'll need to change this up bit, this return method so it's not just returning a list of notes there's a content that has a list of notes and the the new response that we'll get to shortly and so that's a map from rx.js operators there so now we can update the note list to have sortable not on the id because we don't care about that one but let me change this just to a number because I think it looks better and we'll also have onsort and we'll pass in the event to that and we'll copy and paste that down to the next column our text column and now let's add finally some css in our main css and so this will show an arrow using this data image and we do need to do some configuration on the server side so spring data has excellent support for searching and paging and sorting, you can do size and it'll bring back a certain size you can also have previous and next links and pages and sorting so the sort is sort equals name, comma, description or descending rather name, comma, descending or ascending so that's what we'll be sending so we do need to do some updating to our user controller add pageable as an argument not from awt print, that is a mistake that's easy to make so grab it from org spring framework data domain and then you'll pass it in to the repository and then in demo application you can add it here so again pageable and again it tried to use awt so import from spring and while we're in here we'll need to return a page now instead of a list we need to change this to a page as well and let's modify data initializer so there's a bunch of data in there and we don't have to keep adding it so we can change this list of to be a 4x and 0 of a thousand and we'll save note x and for our current user so that's whatever your email address is mine is matt.raybel at octa.com we can go ahead and restart our server our client is automatically restarting itself whenever we make changes if we were to go to localhost4200 and log in you can see we're logged in there's an error back here it didn't like so I figured it out I forgot to delete the sort variable when the direction is not passed in so by default you don't want a sort parameter so now you can see we have all of our notes and if we click on the title column we forgot to add to the note module so we have to add sortable here that sortable header directive now we can click on the title and you can see it's sorting as we expected to now let's add pagination with ngbootstraps ngbpagination component so we'll start in the filter so notes filter by adding a page the default will be 0 and a size because that's what spring data returns by default and just after the table in our note list component we'll add some pagination code so we're using ngbpagination the max size we're just going to say is 10 so that's how many pages will be displayed across the screen collection size will be based on the total and then filter page and size and when we change the page call this on page filter and then we'll also have how many items can be on each page so we'll need to add first of all it's not recognizing this ngbootstrap component and that's because we need to add it to the note module make sure you have a comment there and then you'll see it recognizes that and now we need to modify our list to have those variables so first of all the total and this is a convention to add dollar sign when you have an observable it's kind of like a hint to yourself number and then we'll modify the search method to set it so whenever it calls search set this total to this note service and we'll have a variable in there called size and then we'll add the on change and on sort and we'll whenever we sort let's reset the filter page to be back at one or the first page so the on change we'll just set the page size and the page change we'll go ahead and execute the filter and I had to do the minus one to get everything to work with spring data correctly and then to get the UI to display it correctly I had to do that so I think that works or it works good enough for a demo right and then we'll update the note service to add a size variable again it's an observable change our find method to have those sizes and the page and the comma there and we'll also when it comes back need to set this dot size dot next to response dot total elements and we can set this to any so there's no complaining down here and we're getting some more so we got a fitter error here where is that that's in our list component so fix that now everything is compiling now if we go here and go down to the bottom and you can see we can paginate to the third page and we can also make this bit wider and see that we can do just ten items per page or a hundred items per page so that's all working you have a fully functional data table that has sorting filtering and pagination you select huh so one of the things I wanted to show you is you can actually do all of this very quickly and easily with Jay Hipster and the Kotlin support for Jay Hipster so there is a Kotlin blueprint that overrides Jay Hipster's default Java back in and it uses angular and bootstrap and spring boot all by default so I already have Jay Hipster installed you can see 6.6.0 I also have Jay Hipster installed or Generator Jay Hipster Kotlin and so what I can do is create an application right from this file here so go back to my home directory kill all Java and we'll create an easy notes directory and then I'll create this notes.jdl in it and what this does is it configures a base name and it overrides any defaults that Jay Hipster has so authentication type by default is JWT I like OAuth better we're going to use Gradle we're going to use Elasticsearch so we get that search functionality and we'll use protractor to prove that everything's working we're going to include all entities our entity is defined here it's just a note with a title that's required and a text field that's a blob so that a bigger text area on the client and then our relationship is going to be many notes to one user and we'll add pagination as well and then we can use khipster import jdl notes.jdl so now we can start the docker containers that we'll need for keycloak in Elasticsearch so keycloak is the OAuth provider by default just because you can run it in a docker container so that's pretty darn convenient and I'm using omize.sh and I have jhipster plugin installed so there's some shortcuts that I can use so keycloak up we'll go ahead and start keycloak so if I was to show you what that looks like there it is and then I can also do jhes up for Elasticsearch in a docker container and then I can start the application using Gradle W and then once it's started I can go to gd80 and sign in to keycloak using admin admin and you'll see it populates it with a bunch of data by default and if I were to add a new note first note and type to my admin user then I can search for it but I also want to show you that you can prove your whole app is working using mpm run this uses protractor and runs tests for everything so we'll go ahead and run mpm i just to make sure that's installed and then mpm run e2e and so you can see all those tests pass so pretty slick you know and what 20 lines of code or so we were able to develop a whole spring boot app with Kotlin on the back end and angular on the front end and use bootstrap to style it all you can do it manually like I showed you or you can do it with jhipster so thank you for watching today you can find my team octadev on twitter you can find me at mrable on twitter and we also have a youtube channel we'd love you to subscribe and we hope you have a wonderful day


Greetings, microprocessing unit friends! I'm back with another apparently pointless project. Well, it's a learning opportunity. I can't learn something unless I work on a project involving what I want to learn, so here we are, hopefully learning something together. We're going to be learning about a new HDL. That just means that it's a new hardware description language that isn't VHDL or Veralog.  Anyway, in my head, that's how it happens. Now, check this out. This is my Space Invaders pinball machine. It's the pinball machine that I grew up playing, and I really enjoyed it. This was back in high school. The machine was made by Balli in 1980, and you can see the sort of Infinity Mirror effect that they have going on there. You can see the Alien, and it kind of looks like an HR Giger Alien, and that is not a coincidence, because the movie Alien came out in 1979, just one year before this pinball machine came out. The Alien from Alien was designed by HR Giger, who had this characteristic sort of biological slash machine sort of interconnected creature sort of vibe going on. And Balli actually copied it. Maybe not the entire thing, but they copied the style. And in fact, Giger ended up suing Balli for this design. Balli nevertheless produced about 11,000 of these machines, and they did end up settling with Fox, the movie company that came out with Alien, and Fox received royalties for every one of these pinball machines that was made. And in fact, they ended up getting three of these machines in order to promote the sequel to Alien, Aliens. And here's a bit of the gameplay going on. Back in high school, when I played this machine, I actually managed to turn the score over. The score is six digits, so you can go up to a million, and then it turns over. I actually managed to turn it over a hundred times, because I had figured out exactly what I needed to do in order to make all of the bonuses multiplied together. So the credit score actually ended up being 99. And some of my classmates actually came in, and they couldn't believe that I had actually turned it over a hundred times, and they thought that I just stuffed quarters in it, which of course would have been $25 at the time, because it was 25 cents per play.  And this is the inside of the back box. You can see on the upper left that is the CPU. It's not actually the original CPU, because the original had a battery backup on it, and that battery always leaked, and most of those boards are pretty much dead now. This is the power supply board over here. This is the sound board. This over here, I believe, is for the solenoids, and this over here is for the lamps. It's the lamp driver. So this is actually a replacement board. It's actually a replacement board made by Altec Systems, and I have one fresh out of the box right here. It actually contains a 6800 microprocessor, which is the original processor used on these machines. In fact, there were many of these different types of pinball machines made by Balli using the same microprocessor board, so the only thing that actually changed was the firmware. Now, this particular board has the firmware for all of those games, and you set up the game that you're configuring the board for using these dip switches down here. And these are for game options such as the number of coins per credit, the number of balls per play, three or five, whether you're on free play or not, that sort of thing. Now, the 6800 CPU started manufacture by Motorola in 1974, but I couldn't find any Motorola data books past 1988 with a reference to the processor, and I've seen 6802 processors with a manufactured date of 1989, and the 6802 is just a 6800 with an internal two-phase clock generator and some RAM. By 1990, it seems that Motorola's 8-bit CPU days were gone, since a backgrounder produced by the research firm Gartner DataQuest was all about the 8-bit 6805 microcontroller, which was a completely different incompatible animal, and their 32-bit 68000 family microprocessors. However, you can still buy 6800 processors from, for example, Jameco, a reputable mail-order electronic supplier in California, and from eBay from perhaps less reputable sellers where you can get 6800s with date codes from 2012. And if you're willing to spend $360 a piece, Rochester Electronics in New York remanufactures 6802s from the original dimasks, most likely to maintain obsolete military equipment. Nevertheless, there may come a day when these processors are no longer available, and then where will we be? In the dark ages, that's where! So the idea here is to implement a 6800 on an FPGA using N-mygen, and then plug it into the pinball machine and see if it works. I've chosen a Lattice Ice-40 FPGA because they're on the less expensive side, around $4 to $6 for the smaller one, but also because there is a really good open-source toolchain for it. This is a development board for the largest Ice-40, which has 8,000 lookup tables or LUTs. Generally, the size of an implementation is measured in LUTs for a given FPGA, so we can size the chip to the implementation. One problem, though, is that most modern FPGAs will go only up to 3.3 volts, and the 6800 is a 5-volt part, which normally wouldn't be a problem, except that the Ice-40's inputs are not 5-volt tolerant. So I want to try some of these high-speed bi-directional logic-level shifters instead of fooling around with resistive voltage dividers. I'm a bit suspicious about voltage dividers because of their effect on signal rise and fall time, and drive currents, and that sort of thing. So we'll see how that turns out. Well, let's get started. Now, we see from the datasheet that inside the 6800 CPU we have two 8-bit accumulators, A and B, a 16-bit index register, X, a 16-bit stack pointer, SP, which allows the processor to maintain a stack, a 16-bit program counter, PC, which tells us where in memory we're executing instructions from, and six single-bit flags. Let's look at the signals for the CPU. So to simplify things, we're only going to pay attention to the signals important to executing instructions one after the other, and not things like peripheral signals or interrupt signals or status signals. We can see that there are two clocks called Phase 1 and Phase 2. Now, here's a little diagram of them showing that they do have a relationship to each other. They're not completely random, and we'll get into exactly what each phase does a little later. We also have a 16-bit address bus that the processor uses to address locations in memory or other peripherals, and we have a bidirectional 8-bit data bus, which is used to read data from memory or other peripherals, or to write data to memory or other peripherals. And that's really all we need to get started. The rest of the signals either help to coordinate what happens outside the core instruction executor of the CPU, or put the CPU into special states, which we won't deal with now for simplicity.  That is our perfectly round, massless, frictionless CPU. Okay, here's a diagram of the CPU doing a read from memory, and it's our first clue to what the CPU does with the clocks. So here are the two clock phases, 1 and 2. Notice that in this diagram the edges don't coincide. In fact, the negative edge of phase 2 can go right up to the positive edge of phase 1, but it is not allowed to go past. Anyway, here we see the address lines and data lines. We can see that to do a read. First, the CPU changes its address lines to the address it wants to read. The diagram shows that this change is referenced to the positive edge of phase 1. TAD here is the time from the positive edge to the address lines becoming stable. In the 6800, this time is typically 220 nanoseconds, but can be as high as 300 nanoseconds. For our FPGA implementation, of course, this time will be on the order of nanoseconds. So we know that the address lines change as a result of the positive edge of phase 1. Great. Next, the memory responds with the data at that address. This is shown by TACC, the access time of the memory. Then we have TDSR. This is the setup time for the data lines, and it means the amount of time the data lines must remain stable for the CPU to work. For the real thing, this is a minimum of 100 nanoseconds, but our FPGA has setup times of around half a nanosecond in the negative, which just represents the delay from the pins changing to the internal flip-flop inputs. Anyway, notice that the setup time is referenced to the negative edge of phase 2. This means that the CPU latches the data in on this edge. TH here is the whole time for the data lines, which is the amount of time the data lines must remain stable in order for the data to be latched in correctly. Again, for the real thing, this is a minimum of 10 nanoseconds, but our FPGA has a whole time of around 2.5 nanoseconds, which is plenty. Okay, so we have two important pieces of information here. One is that the CPU latches its read address onto the address lines on the positive edge of phase 1, and on the next negative edge of phase 2, the CPU latches the data being read. Okay, let's take a look at writes. We see the same thing for the address where the address lines get set on the positive edge of phase 1. However, it seems that the data to write doesn't come out of the CPU until the positive edge of phase 2? Well, no. There's a signal controlled by the memory, or the peripheral being written to, called DBE, or Data Bus Enable. This simply tells the CPU when it can release the data it wants to write onto the data bus. The actual data in the CPU is ready way back here at the positive edge of phase 1. So, output signals are changed by the CPU on the positive edge of phase 1, and signals are read by the CPU on the negative edge of phase 2. Good enough for the core CPU functionality that we want. Now, let's look at executing an instruction. We know the CPU will do a read from memory for the instruction. This is the fetch cycle. All instructions are one byte long, so once we have the first byte, our destiny is set. The CPU can latch the data into an instruction register, and that tells the CPU what it should be doing on each cycle, that is, from positive edge to positive edge of phase 1. In fact, the data sheet has a handy table of what the CPU does for each instruction. Notice that the minimum number of cycles for an instruction is 2. So, let's look at this first instruction listed in the data sheet, ADC, or add with carry. The address mode is immediate, which means the byte to be added, the operand, is in the next location in memory. This instruction adds that operand to one of the accumulators, and stores the result in the same accumulator. Let's see how that would work. We start by latching the contents of the program counter register onto the address lines. We'll latch the instruction to execute near or at the end of the cycle, but remember that the data is available on the data bus even before then. This means that the moment the instruction stabilizes, we know what we must do on the next positive edge of phase 1. One thing that we always do is add 1 to the program counter and use that as the next address to read. So, we do that during cycle 1. Now, on the next positive edge of phase 1, we transfer the result to the address lines. We can also transfer the result to the program counter. Okay, during cycle 2, we read the operand. Again, we know we are doing an add with carry, we know the source accumulator, and so we can immediately add whatever is on the data lines to the accumulator. Whatever this result is, it stabilizes when the data lines stabilize, which means that on the positive edge of phase 1, we can transfer the result to the accumulator. As for the address, we can transfer the program counter to the address lines even though we didn't change it, and now we can execute the next instruction. Okay, so, here's what I want to build. We have a bunch of 8-bit registers. The 16-bit registers are also divided into two because 16-bit addition will take place using an 8-bit arithmetic logic unit. I'm also including a temporary 16-bit register to hold address calculations and a temporary 8-bit registers for any other temporary data. We also have a transparent latch for data in and a register for data out. You typically don't have bi-directional or tristate logic in the middle of your FPGA logic. That's left for the pin Ios to handle, so that's why we have two registers for the data lines, one for data in and one for data out. We also have a transparent latch to hold the instruction we're executing, and we have an address register for the address lines. I mentioned an arithmetic logic unit, or ALU, so here it is. It has two 8-bit inputs, and it also includes the flags. To feed the ALU, I'm going to have two 8-bit data buses. Any of the 8-bit registers can be connected to any bus. The function that the ALU performs depends on an input that will come from the instruction decoder and sequencer, and its output can go to any of the registers to be latched on the positive edge of Phase 1. We also need a way to add one to the program counter and store it back in one cycle, so we have a 16-bit increment decrement unit. The decrement part will be useful for the stack pointer. To feed this unit, I have a 16-bit bus, and I'm not using the two 8-bit buses for that because I will need to use the incrementer while doing other things with the ALU, so those buses will be occupied. The output of the ink deck unit can go to any of the 16-bit registers and also to the output address latch, also to be latched on the positive edge of Phase 1. And the function that the unit performs is also controlled by an input that will come from the instruction decoder and sequencer. Finally, we have a cycle counter that works with the instruction decoder to control all of these data paths and functions. Let's see how this would work with the ADC instruction we looked at earlier. We're going to assume that just before the first cycle, we've routed the program counter over the 16-bit bus to the address register. Now, when the positive edge of Phase 1 happens, the address register gets loaded with the program counter, and that gets output to the address lines. We're also ready to receive the instruction from memory, so we also enable transparency on the instruction register. This way, whatever appears on the data lines goes right into the decoder. At some point, the ADC opcode comes back from memory. Since the instruction register is in transparent mode, the opcode gets decoded for cycle 1. The decoder says, OK, for this cycle, for ADC, we want to read the next memory location for the operand, so we need to route the program counter through the ink deck unit, set up the unit for increment, and route the output to the address register, and to the PC. This gets us ready to output the next address, which is the address of the operand. Also, we set up the cycle counter to increment. Note that what we've done is perform all the calculations we want, but we have not yet stored anything. Everything needs some time to settle to their final values. At the end of the cycle, we'll get the positive edge of Phase 1, which clocks all the final values into their final destinations. Now, the positive edge of Phase 1 comes in, which commits everything we've done. So we latch the new program counter into the address register and back into the program counter, and we load the next cycle number 2 into the cycle counter. We also turn the data in register transparent since we're about to receive the operand. OK, let's set up everything we want to happen during this cycle for committing at the end of the cycle. Since we want to do an add to, say, accumulator A, we route A to the first 8-bit bus, the data in register to the second 8-bit bus, tell the ALU to do an add with carry, and route the output back to accumulator A. We'll also do the same thing we did before to the program counter. Finally, we'll set up the cycle counter to reset. And finally, the positive edge of Phase 1 comes in. All the data that we set up gets latched, so A gets its new value, the address gets the next address, the program counter gets the next address, we turn the instruction register transparent again, and we're ready to proceed with the next instruction. And that's really all there is to it. I know that I say that facetiously, but it really is just a matter of on a given cycle for a given instruction, set up the routing for the operations that you want to do. Then, on the positive edge of Phase 1, at the end of the cycle, latch everything in, and start again. So those are the basics of what I'm going to be programming. Now, I'm not going to be doing any programming in this video. I think it's sort of gone on long enough, and if I actually start doing any program, the video is going to just last forever, so we'll wait until Part 2 to see that. But in the meantime, if you do want to follow along, I have written sort of a tutorial for nMyGen. It's not quite a tutorial. It's really more a series of comprehensive notes that I wrote to myself, which explain how to install it, the various concepts that it uses, that sort of thing. So that will probably be useful to me to get started and to you if you actually want to install nMyGen and all the things it requires so you can actually start playing with it for yourself. It is fairly easy to use if you know Python. So until then, I think we'll draw this video to a close. Check down in the description for a link to my tutorial slash comprehensive notes, and I will see you on the next video.


I thought it was a new one! What am I, Brad? What am I, Brad? I thought it was a new one. That's gonna be the next one. So I'm gonna be up on the mountain for probably six to eight hours of training today, which means a lot of sun exposure, which means a lot of sunscreen, you know? And yeah, we just, this is it, baby. This is the hard workout. I'll tell you what I'm doing at the base of the mountain. The Halo headband is on the way. It's on the way. Oh, man. All right, so for today's run, Uppikes Peak, I'm going to use a Nathan handheld. I'm gonna carry my debit card, stick that in there, because there's a cafe on top. And so it'll make more sense once I tell you what I'm doing. And then I'm gonna put a little tailwind in the water bottle, and then two spring energies in as well. And then the GoPro, of course. Going with a Bobobar for breakfast. That's right. There it is. I don't know if you can see that little Bobobar. Oh, yeah. Boom, butter, boom. Oh, little chocolate in there. That's so good. Oh, yeah, everybody. We made it to the base of Pikes Peak. It's a lot busier today. I think folks are realizing that are racing in two weeks from today, two weeks. They're realizing, okay, now is the time to put the work in as much as I can before race day. So it's busy here in the parking lot. What am I gonna be doing? So I'm running up the peak at a pretty good clip, okay? Going lighter weight. So I'm just carrying the handheld, two gels, the GoPro, and then my debit card. Because once I get to the top, gonna eat some food. Hopefully they have some decent food on top at the cafe. And then I'm gonna run back down three miles to Tree Line.  So this is the toughest workout of the training block, no doubt. And then, just like two or three weeks ago when I was here, pitch hike off the top because you can drive to the top of this mountain and hopefully somebody picks me up. If you know what I mean. So it's a good day to get some work in and yeah, I'm trying to think what else. I'm just excited. Like this is, and I'm trying to mimic race day as much as possible, waking up a little earlier. Okay, so no phone, which means no music, no podcast, just nice and quiet, calm, relaxed. That's my strategy for race day is I'll probably listen to classical music on the weight of the race. I just like to remain as calm as possible and so anyway, I'm mimicking today for race day. I'm mimicking race day today. All right, I don't even know what else to say. I'm ready. This is why I have to do a bunch of stuff other than just tighten my shoes, so let's do this. All right. We will see you. So I'm not going to film it all on the way up, but I will do some filming once I am at the top. We'll see you back at the car in like six or eight hours. And I'm back. Oh man. You're probably wondering what happened and you're probably wondering, Seth, where's your water bottle? Oh my goodness. Let me explain what went down on Pike's Peak today. I'll get you the stats for the run back at the studio. It was a great day. It was a great day. I'm happy. I'm positive. And guess what? I still love the person who stole my water bottle on the top of Pike's Peak. That's right with my debit card, my GoPro, and my water bottle. I basically got to the top after running up the mountain and then the goal for today was to go back down the mountain for three miles and do a fart lick and that's what I did, but I didn't want to carry the water bottle for those last three miles of fart lick work. So I hid it under a rock right next to a post. There's hundreds of people up there because it's a very popular place to drive to. Somebody must have seen me hide the water, hide the water bottle under the under the rock and I got back from the fart lick and it's gone. My debit card, my GoPro. So I didn't do a ton of filming today, but the shots that I did and okay. So I owned, I owned two GoPros as of two weeks ago at Jackson Hole. You know, I lost it and then it never was, it never was returned. If somebody found it, I don't know. Well today, somebody just straight up stole it. So ah, so I'm out on GoPro, so I'm going to have to ante up and get a new GoPro. But anyway, that's what happened. That's why I haven't, that's why I can't show you any shots from today's run. But I will show you a shot from six months ago and I actually filmed an exact shot from today at the exact same location. But in order to reach your goals, you got to do the work when nobody else is watching. So this is me on Pike's Peak six months ago in the dead of winter, putting in the vertical time, getting the altitude training. So just like it's like when you don't want to get out of bed early in the morning, when it's snowing out, when it's raining out, you don't want to go for your run.  So anyway, I love you all. I love you whoever stole my water bottle and we live to fight another day. I'm off to get a little treat and it was a great, it was a solid run. I'll tell you about it once again, back at the house, back at the studio. Hi, we made it back to Denver and yes, I'm pulling into the Best Buy parking lot keyword optimistic. I'm optimistic after today's run and I'm also optimistic that this YouTube channel is going to survive despite cameras being lost or stolen. Listen, when you come back faithfully to watch the channel every day and yes, get through those ads every now and then, maybe not every day, but every now and then, that allows my family and I to pinch pennies, build up a little nest egg to replace camera equipment because it does, it's, you know, these cameras, this audio equipment, it just doesn't happen. But you guys being here every day, I have a little nest egg built up, so we're not going to let a bad egg, whoever took my GoPro and my water bottle today, we're not going to let a bad egg ruin our day. And so I'm going to go into Best Buy, get a new GoPro, I just checked and they have a little, a little deal going right now. So I think I can swing it financially, but it's, it's frankly, it's because of you, just so you know. So I, I, there's no way I could have done this a year ago if this would have happened in last summer, 2018. All right, we're not going to let him keep us down, right? We, we don't let him keep you down. We're going to win. We are going to win in this world. Huh, what you making over there? I love you. I love you. Oh, my, my, the huge, hello, my goodness. That is what I'm talking about. I love you. No, there it is. There it is. That's going to, that's going to be the next T-shirt. I'm, I'm, I'm just cause of life, I'm thinking around October. I just need a good design. I'm going to take a hot second. Yeah, we just need a hot second. Just a hot second. Oh, I think Khan actually, by the time this publishes, almost guaranteed we will have passed 25K cause of, cause of all of you. Oh, we love you guys. You all are the best. 25,000. That's amazing. That's crazy. That's crazy. That's your hard work. That's his true grit. Oh, come on. I get it. I get you guys. I get what you see in him. Come on. Come on now. We're just, we're just one day at a time. He's the real deal. Not, not, not letting the, not letting the thieves get us down. And onward and upward. Here we go. Delicious dinner. Gonna go eat second dinner here in a little bit. And yes, put down my daily dark chocolate. I don't know about you, but when I'm running more than 60 to 70 miles a week, like, oh, I just love chocolate every night. Like, it's just like the body needs some good. Dark, it's gonna be dark. No milk, gotta be dark. In my humble opinion. Okay. Today's workout was the last hard, hard workout of the training block. Not the last hard workout. The last hard heart. Meaning today, I wanted to be pretty tired by the end of it. And sure enough, I was. Now next week, I'll go hard a couple more times and then the actual race week, I'll go hard once. But a couple of people were a little confused about my tapering. So when I'm talking about tapering, I'm talking about volume reduction, not necessarily intensity reduction. In fact, volume goes down, intensity goes up. So just wanted to clarify, a couple of people were confused on Strava. That is what I mean when I'm talking about tapering. And today's run was 19 miles, 9,300 feet of vertical gain, or 30 kilometers, or 24. Hold on. All right. And I'm back, a little situation in the house. So in meters, let's see 20, 2800 meters of vertical gain today. So the workout was actually 13 miles up the mountain. Exact same course as the race in two weeks. And then I ran, once I got to the top and put my water bottle down, I ran back three miles to treeline. So from 14,000 back down to basically 11,700. And then all the way back up doing a fart lick.  And then that didn't quite get me to the top. So I just jogged it to the top after that. And by the end, yes, I was very tired, a little disappointed about my camera being gone. But other than that, it was an amazing day. I feel very good about the effort, optimistic about the effort. And it's not like I'm just excited for next week to really start to tapers I'm still gonna hit about 80 miles this week, which is down from a hundred. And then next week will be about 50 to 60, probably about 50, depending on how the legs are feeling. So basically cutting my mileage in half from the two weeks prior. Okay, and finally those words that I repeat to myself on hard workouts and in hard races. Okay, you're ready for this? And I'll be curious to hear what you have to say in a minute. So today I felt very good. The first three miles were actually the downhill traffic from all of the people doing the incline was insane. Like I probably passed 200 people. So I had to yell, runner, runner. Cause I was going up and everyone was coming down. So that was a little cumbersome to the workout. But the first three miles was fine. But then from mile four to 10, I was just boom, boom. And I was telling myself, what was I telling myself? Eyes up, quick feet, pump your arms. Okay, that's what I repeat to myself over and over and over again. Eyes up, quick feet and pump your arms. I probably said that to myself a hundred times today. The other thing that I repeat to myself is float it, don't fight it. And especially with uphill running, it's tempting to want to fight the mountain and want to attack the mountain, but instead float, it's like that dancing. Mountain running is dancing in disguise. Float up, it's like, it's such a, it's hard to describe other than your light on your feet and you're trying to float up rather than dig, dig, dig, dig. Cause when I dig, my legs get tired a lot more quickly. Did I say that right? A lot quicker. So anyway, that is what I repeat to myself up on hard workouts in hard races. And yes, of course I will repeat those words over and over again in the race in two weeks from today. When you're watching this on Saturday and I repeat a couple other things, but I think I'll save those to tell you after the race. And yes, the question of the day, what do you repeat to yourself over and over again? Do you have like a mantra or a saying that I think it's actually pretty important to have something to lean on to, to help you refocus. Cause in a 13 mile race or a marathon, it's even a five case sometimes it, sometimes you get a little spacey and you start daydreaming, which isn't the worst, but at the same time you, then you realize, wait a minute, I've slowed down a lot or my form is off. And so anyway, what helps you focus? What do you repeat to yourself? That is the question of the day. Thank you for being here. Thanks for your patience with the GoPro footage. What are you gonna do? We arise again tomorrow and we will do it again. All right, seek beauty, work hard and love each other. See you tomorrow.


My name is Teepora. On my campus, I found a small tree languishing in the shadow of some well-established trees and I replanted it, and called it my PhD tree and the tree is me and I am the tree and together we will flourish in my studies. I am dreaming of Māori students like myself being unstoppable in their quest for academic qualification. Maori participatio in the tertiary sector is growing in the last 10 years postgraduate numbers have gone up. Last year there were 500 plus Maori doctoral enrolments and I was one of them. The numbers are great but if they were trees it would be a very small Maori growth. And I wanted to think about what are the ways that tertiary staff like academics, councillors, librarians, administrators, how do they imbue in us a sense of being unstoppable. Now they might not use those words but I wanted to get together with a group of Maori students and a group of these tertiary staff along with me where we could share our experiences, what we know, what we've done. And then there will be the next moment. In exhilarating time we make meaning of everything and then come out with some best exemplars of how to move on in Maori supports. What I've liked about this idea of the study is that further on I want to run a symposium where Maori students come and they hear their own voice and they're in preparation for going on to their doctorate. Prepare them in the early entry stages. So as students you're all aware of the sense of languishing in your studies where you are in a state of procrastination and despair and hope leads away. What is important for doctoral students who are Maori is that qualifications create wealth which then creates outcomes important to Maori like health, wealth, education opportunities and sustainable whānau, family environments and conditions. And what I like is the idea and what I dream of, my unstoppable vision is that my PhD will be put alongside other Maori PhD trees and it will be a forest that is so vast that it stretches to the horizon and beyond. Imagine that. I do. Kia ora.


What I found with other yoga studios is that they've taken the spirituality out of the yoga practice And it's important to us at Ahana that we educate our students about the goal Which comes from the Vedas, which is the oldest text ever written and there's so many beautiful lessons to learn that will make you a better person My name is Don Feinberg. I'm the owner of Ahana Yoga I was a professional dancer living in New York. My friend took me to Jivamukti yoga and I fell in love with it So I started this business When you come into Ahana, we've built this community on Authenticity not about you know the car you drive or the clothes that you wear But a shared support in your struggle and it feels really really really good I Love walking into Ahana. It makes me feel like I'm walking into my second home It's funny. I never wanted to open up a yoga studio per se and then opening I felt a sense of peace because I wasn't happy with the way that things were going in other yoga studios around town and Now we have everything in one spot Yoga has a lot of great Outcomes like you could get ripped you can have good abs you can feel good and all of these things But that's not just yoga to be able to get the philosophy the chanting the proper alignment Will help you generate tools for you to just make a change in the world


And I also come from the perspective of someone who's been a campaigner that's worked with the medical establishment, has worked with NHS England, who have a very good relationship with the CEO of NHS England, Simon Stevens. Part of what I did is I managed to lobby and change the policy, both in terms of the British Medical Association, the Academy of Meteorological Colleges, to say that hospitals should not be promoting or selling junk food. That is already established. NHS England, this editorial that I co-authored with the former chair of the Medical Royal Colleges, Terence Stephenson, who then became the chair of the GMC, Mahibben Marathapu, was actually the clinical fellow to Simon Stevens, the chief of the Academy of NHS England.  We put this together and we basically put this editorial saying that health eating should be a priority, a sure way to improve health outcomes for NHS staff and the public. And some of the things we wrote about was we said that informing patients to public how diet can improve health is a responsibility of all health care workers who should lead by example. And of course, to do this, health workers need to have education training and access information, which of course is lacking. This is completely contradicting how Royal Free put out this tweet saying they were very happy to receive these free donors from Krispy Kreme. It doesn't make any sense. So there's a lack of accountability here. There's clearly a disconnect with what's going on. And this is a hospital, by the way, I worked in. So I found this very bizarre. And I'm just really saying that this just doesn't make any sense to me at all. So what about medical education, nutrition education in medical school? It's basically nonexistent. I didn't learn anything about nutrition and health in medical school. It's something I had to learn for myself over the years, after I qualified, after even being a specialist registrar in cardiology. But what's interesting and what gives us hope is that most doctors, most medical students realize that nutrition is crucial to good health. And most of them expect patients to have an understanding that doctors should have an understanding of basic nutrition. And 99% felt that nutrition played a role in maintaining good health, which is all really great news. This is publication in BMG Nutrition, which you can look up. But the problem we've got still is that majority felt they lacked the knowledge, the time and confidence in being able to have those discussions with patients.


You love one man almost as much as Liszt and that is Prokofiev, one of the greatest pianists really in so many ways. He was the Russian Liszt in many ways later on.  Two minutes, it's so mocking. It comes out of a such an ironic mood and mocking the suggestion via Balik. Can you do it? I think so, and this is the piece that gave Prokofiev his nickname the bad boy of the keyboard because he wrote it really, what was he, 18 years old? Yeah. He wrote it to shock the people in St. Petersburg and he did. Nobody wrote like Prokofiev. He was a shocking man. Richter said in the movie about Richter, he said you didn't want to get into trouble with him. He was tough.