Hey, welcome everybody. In this video, we're going to deploy a Next.js project on a virtual private server. We'll use the power of GitHub Actions and leverage the GitHub Action Runner to establish continuous deployments triggered by GitHub Code Commits. And I almost forgot to mention that in this video, we will install the latest Node.js version and use PM2 as a process manager under a separate user account. Then we will install and set up NginX so we can reverse proxy to our Next.js website. And finally, we'll point a domain name to the server and set up SSL certificate. Before we get started, I wanted to try and draw a very basic diagram of what is going to happen in this video. And I've already changed the diagram like a million times where hopefully this one will be okay. So essentially, in the first step, we're going to be creating a very basic Next.js application. From there, we're going to use GitHub in order to have version control of our project. And also, it's good for collaborative software development. Now, when we create our project, each project will have its own actions. Action is the platform that is going to help us automate the software build. So we are literally going to make a list of actions that we want to do in order to be able to build our project. Now, in order to publish your website, we need a web server. In this case, in order to host the website, we're going to have an Ubuntu server. Now, in order to connect to a Ubuntu server with our GitHub project here, we're going to install a GitHub runner. This runner is basically going to be installed on Ubuntu server. And it's going to allow us to talk to our project and then do the actions. You will see in the video that when we connect our runner to a project, we'll be able to see whether the runner is idling or offline inside our project here on GitHub. So that's how it's going to work. And the last step would be here, a user makes requests. And here, we're going to be using engine X to reverse proxy to the server and wrap the website from port 3000. And when this step is done, basically, the user gets a response. And that's it. I hope that you find this diagram useful and enjoy the process. Hey, welcome everybody. And let's get started. So for today's video, we're going to be using github.com in order to do the continuous deployment. If you haven't yet, go to github.com and sign up for free. I've already logged into my account. So I'm going to go to the dashboard of github. So a little bit zoomed in. And then from here, we need to create a repository. So let's click new. Let's give it a name. I'm going to choose ruddy-vps as virtual private server. For the description, I'm going to leave it empty. And my repository is going to be private. I'm not going to create a readme file because next.js comes with one. And then for the gitignore, we're going to select node because we don't want to be uploading all the node files onto GitHub. And the last thing that I'm going to choose is the license form project. And this is going to be MIT. Let's click create repository. And here we have a brand new project for this project. I'm going to be using github desktop, but feel free to use the command line if you wish to push and pull your project manually. And if you go to desktop.github.com from here, you should be able to download it for Windows, macOS. And I believe that there is also a version for Linux if you wish to try it out. It's nice to have, but you don't need it. You can just use the command line if you wish to. The first thing that we need to do is if you don't use the github desktop, just make sure that you clone the project locally so you can work on it. In my case, I'm going to go on github desktop and from here on the drop down menu, click on it on the add drop down menu here, click on it one more time and then select clone repository. Let's find the repository that we just created. So ready dash VPS and let's select it. And I'm going to save this in c drive github dash applications ready dash VPS and clone. If I open this in the explorer super quickly, you should see that I have exactly the same files inside here as the ones on my GitHub repository, which means that I've successfully cloned the project. And now we can create a brand new next.js application. I need to create the next.js application inside this folder. So I'm going to do left shift right click, open in terminal. If you're using mac or linux, you can just cd to your project folder where you wish to create it. And now we need to create own next.js project. So npx create dash next dash app at latest.  If by any chance you missed this last bit, and it creates a new folder for you, you can always grab the files and put them into ready VPS, but you might need to install your modules one more time. Would you like TypeScript for this project? I'm not going to be coding anything. So I'm just going to put the default options in here that I have. So TypeScript, no ESLint, no Tewin CSS, yes, source directory, yes, app router, yes, import alias, no. And that's it. As you can see, the project is being created in this folder, which is great. But as I said, if you created a new folder for you, just grab the files, paste them inside here and just do npm install to install the modules and you should be good to go. Let's test the project super quickly. So I'm going to do npm run dev and let's copy the URL. And as you can see, our project is now working on the port of 3000. I'm going to open this super quickly in Visual Studio Code. So left, right click, open in terminal. I'm going to do code period, enter. And this will open Visual Studio Code with the project on the left side here. Now the only thing that I'm going to change inside the project page is this here. Instead of this, I'm going to put by Ubuntu and say, so hopefully this should refresh by Ubuntu and we get to go. Anyways, this was just a quick test to see what everything is working. Now the real reason that I opened the project in Visual Studio Code wasn't to change the logo here, but to talk about the .env file. So normally your project will have a .env file where you store all your secret keys and so on. So I'm going to put .env.local and you want to be able to add all of your variables inside GitHub. I'm going to create a new one next underscore website URL and this is going to be equals HTTPS slash slash and then website.com. Maybe this is something that you're reusing throughout your entire application. Obviously you probably have secret keys and you want to be able to upload them on GitHub. Uploading the actual .env file is not safe to do, especially if your project is public on GitHub. You don't want to do that. And I'm going to show you how we can transfer them. But first what I'm going to do is go to the GitHub application here and then push the changes. So I'm going to do init as initial deployment and then commit to main. Push origin and they should push absolutely everything except the .env file. So if I go back to my GitHub page and refresh, you should see that we have the next .js project in here without the .env file, which is exactly what we want. Normally the .env file is ignored by this file here. So now let's have a look at how we can transfer all variables. If we go to settings and here on the left side, you should have secrets and variables. Click on this and then click on actions. From repository secrets, we need to create a new one. So click new repository secret and we need to give it a name. So in this case, we basically grab the next underscore website URL and we paste it in here and no secret goes inside here. So I'm going to copy my secret and paste it. Okay. If I add the secret, you will see that or variable name is now here and you should be able to use this variable name now throughout your project. And one thing that I wanted to show you is that if you go here and edit this secret, so I'm going to edit it, you will see that the value is now gone. So you can definitely update your value. You can create a new one, but your initial value is gone. And this is obviously for safety reasons. So that's all good. And if I go back, we have all secret key. I didn't update it. All good. Let's go back to code. The next step would be to create or virtual private server. For today's tutorial, I'm going to be using digital ocean and the service that I'm going to be using is in the products and then compute and it's called droplet.  Now we are going to be using Ubuntu in this tutorial, which means that you can pretty much do this on any other provider that you wish. You can use Amazon, you can use a Raspberry Pi if you wish. Whatever you like, feel free to shop around, see what's best for you and your needs. And you should be able to follow along as long as you use Ubuntu. If anybody decides to use digital ocean, I would appreciate it if you'll use my link below. This is not sponsored in any way. It will just help me a lot if you use my link below. That's pretty much it. Now let's log in. And here on the left side, you should see droplets. So if you click on droplets, click create droplet. From here, select your region that you wish. I'm going to choose London because this is the closest to me. From choose an image. There is a big marketplace that you can choose images from. But today we're going to be using Ubuntu with the version of 23.10 NX64. Let's scroll down, choose size. I'm going to go with shared CPU, which is the cheapest. And then if we scroll down a little bit more, for the CPU options, I'm going to go with the regular this type SSD. This is going to give us even cheaper options. And the one that I'm going to use is the six dollar per month one. And this is actually fitting in the minimum Ubuntu requirements, which are one gigabyte of CPU, one gigabyte of RAM and 2.5 gigabyte SSD. So this fits as of minimum. But if you use another provider and there is a cheaper option, I wouldn't go through it because you might struggle. So definitely go with something like this or bigger, of course, if your project requires it. So let's go down a little bit more. And from here, we need to choose authentication method. Now the easiest method would be to go with password. You can just select the password and you can log in with root using SSH. Now the problem with passwords is that they can be brute forced. And technically speaking, you might be able to restrict your IP address from the networking tab in here. I haven't tried it, but you're most likely going to be able to do that. But the safest option here is to go with an SSH key. And I'm going to show you how to set up this. So it's up to you which way you want to go. I'm going to do SSH key. And I've already got one inside here, but I'm going to create a new one. I'm going to click new SSH key. And then from here, we need to follow the instructions. So here on the right side, it says follow these instructions to create or add SSH key on Linux, macOS and Windows. Windows uses without open SSH can install and use putty instead. Let's follow the instructions. So I'm going to copy the SSH key gen here. And we need to open a terminal, PowerShell, whatever you have. So I'm going to open the terminal here. And I'm going to paste the command to generate a new key pair. So right click SSH dash key gen, press enter. And this is going to generate the public private RSA key pair. And you can name them if you wish. But I'm going to leave the default name which is ID underscore RSA, press enter, give it enter a passphrase, I'm going to put my name ready and press enter, ready and press enter.  Let's go up. And you will be able to see that your identity has been saved in see users range dot SSH ID RSA. So I'm going to copy this. So obviously if you're Linux or Mac, it's going to be different. But I'm going to copy this, go to my PC and paste the inside here. And we need to search for SSH. And then here the private key and the public key. The public key basically has dot pop at the end. And that's it. So let's open this and let's copy the code from here, the entire thing. And let's close it. Let's go back to the website here and paste or public key. I'm going to paste them. And for the name, I'm going to say Radis desktop PC. And then I'm going to add the SSH key. Now that we've added the SSH key, let's scroll down and they say we recommend these options. I'm going to click on the add improved metrics monitoring and alerts because it's free. And then feel free to choose whatever else you need and scroll down a little bit more. For the house name, I would strongly suggest you that you change this. So I'm going to put ready at least to know what it is because when you create multiple droplets, it will get confused in which one is which. So definitely give it a name. Give it a few tags, which will make it easier to find. And that's more or less it. Let's click create droplet. All right, this should take 20 to 30 seconds. And I'll be back. Okay, or virtual private server has been created. And if you click on it super quickly, and inside the dashboard, you should be able to see your IP in here, which you can use to SSH. Now one thing that I would suggest you do is to reserve an IP. And the reason for this is because if you ever need to power down this instance and create a new one, you can quickly detach the reserved IP and attach it to your new instance. So that can be quite helpful. And if you do it, I would suggest you to do it now. So I'm going to enable it. And I believe that it's free. I don't think that it costs anything. So I'm going to assign reserved IP. Okay, or IP has been assigned, as you can see, it's still doing it. But if I click on droplets and click on my droplet, you should be able to see that we now have the reserved IP in here. Let's copy the IP and let's open the portion. So I'm actually going to be using this portion here and just clear everything. Let's try to connect to this IP to a server using SSH. So in order to do this, do SSH, and then root is the username that we want to connect with and then add and we paste the IP in here. Now, if you want to see what's going on behind the scene, you can put dash V and this will show you everything that's happening. So I'm going to press enter. All right, I'm going to type yes, press enter, enter passphrase, that's ready. Enter. And as you can see, we are now inside or Ubuntu server using root and then ready Ubuntu and so on. Also, this has been added to the to the known host. And next time I try to connect, it won't be asking me any other questions. So if I was to close this, and if I do right click, open in terminal super quickly one more time. And if I do up, this is going to be SSH root at the IP, press enter. And then it's going to ask me for the passphrase ready, press enter and we are in. All right, before we start setting up or Ubuntu server, if you haven't managed to log in by any reason, obviously, maybe pause the video, try to see what's going on, you can put dash V after the IP in here to see what's going on. But also there is another way. So the other way would be to go in your droplet and the actual droplet has a console on its own. So if you click on this, it will open the console. And you'll be logged in as root. Here we go, connected. And it will be exactly the same as if I was to SSH from my computer. And you can continue using this as well. If you wish to, it's really up to you. So this is definitely an alternative way of doing it. I'm going to close this, I'm going to close the SSH folder, as we won't need them. And let's open the connection to a server. All right, the first thing that we need to do is to update the outdated packages and dependencies on our system. Do sudo as super user do, and then apt update, press enter. And this should take a couple of seconds to get the latest packages. Now we need to do sudo apt upgrade dash Y. And this is going to build everything on our server. We just need to press enter. And then okay, one more time. Perfect. The next thing I'm going to do is create a new user. And the reason I'm doing this is because at some point in the future, you might end up having multiple users, and you might want to have different Node.js versions, whatever, you might want to be able to install different package versions for specific user. I'm going to clear this just so you can see a little bit better. And then to add a new user instead of root, we can do add user. And then the username goes in here. So in my case, I'm just going to put ready. This is the user that one had. And the user has been created. We need to put a password for this user. I'm going to put my password of password. I'm retype the password of password. Okay, everything is looking good. Full name. I'm just going to put ready. Dev, press enter room, room number. All right, from here, I'm just going to press enter. I'm not going to feel any of this information. And then is this information correct? Yes, press enter. And we have the info added to the ready user. One thing I'm going to do now is to add this username to the super user group. So I'm going to do so we potentially won't have to do sudo on every command that we do. But if you have a struggle to install something, if you don't have the permissions, you can always do sudo and then do the command. So in this case, let's try this user mod ag and then sudo and then the username of ready, because we're still using the root username, although that we created a new user, we're still using the root username. And basically the option stands for pending this user to the super user do group. And the G flag basically stands for group, which group do you want to add this username to? And the group that I want to add it to is sudo. That's pretty much it. And press enter. If we do PWD, PWD, you should be able to see that we're currently using root. And now this is very important. We need to switch to the newly created username that we created, which is ready in this case. So in order to do this, you can do sudo, switch user su-ready. And now you'll be able to see that we're getting ready at ready Ubuntu and the rest. So before it was root and now it's ready. This is going to be important because when we run on Node.js, we want to be running it from ready later on. Otherwise, the GitHub actions might not recognize the process. I'll show you later on. All right, this is all looking good so far. If we do LS, let's see where we are. It doesn't really show anything. All right, since we're still on the server, I think it's a good time to install the packages that we need. So I'm going to clear this one more time, just so you can see a little bit better. Okay, now let's install the first repository, which is going to be Node.js. In order to do this, let's first of all do sudo apt update. One more time, the password for ready is password, press enter, and this is going to do the updating. The next thing that I want to do is to install the latest Node.js. Now, if we go to the browser super quickly, the great thing about digital ocean is that they have articles for pretty much everything. And if you scroll down on this tutorial super quickly, maybe I can paste this somewhere as well. So you have it. But basically, you have a couple of options to install Node.js. And the one that I'm going to be using today, which I found the easiest was this one here. So using the Node version manager, this was the easiest one I found. But to be fair, I think they're all equally easy. So what I'm going to do is copy this line of code here, paste it. And if you wish, you can post the video and copy the URL and press enter. Let's go to the second line here. I'm going to copy it and paste it. Okay. And then I'm going to go to this line here, copy, paste. Let's go to the next one, copy, paste. And this is going to list all of the Node.js versions that we can choose from. As you can see, which is amazing. And now we need to choose the one that we want. And I believe that with Node.js 14 app router, the minimum was around 18.7, I believe, maybe around here. But obviously, I want to use the latest one. So what I'm going to do is like this. Currently, on my PC, I'm actually using this one here. So I'm going to do the same VM, install and then the version. So V 20.10.0, press enter. And this will install Node.js first. Now let's do NVM list. And hopefully, you should be able to see that the default Node.js version is now set to V 20.10.0, which is awesome. Now let's install PM2. I'm going to clear this. Let's go back to the browser and search for PM2 in Google. So PM2.keymetrics.io. This is actually great. It's basically a Node.js process manager. And it's super easy to install. Basically, I'm going to copy this. But let me show you super quickly what you can do. Essentially, you can run multiple applications on your server. And they have a lot of like really cool interfaces that you can use, such as this one here to monitor your processes. The commands are very easy to use, like list your command, your processes, stop, restart, delete, and so on. So this is what I'm going to be using. There is probably, I think that there is a paid version for it, but we're going to be using the free version, which is absolutely fine. I've been using it for a while and it's awesome. So let's go back and let's do right click. So MPM install dash PM2 G and dash G for globally. I'm going to press enter. And this should take a couple of seconds. All right, now that we have everything that we need, let's go back to GitHub and create our application runner. So I'm going to close everything here and go back to GitHub. All right, the next step would be to set up an action runner. So if we go to actions and then runners, and then here we should self hosted runners. If you click on this, let's click on new runner. And now we need to create a new self hosted runner. And from here, we need to choose Linux 64 architecture is fine. And we need to run the following commands on our server in order to be able to connect GitHub to a server and then do the continuous deployment. Okay, so I'm going to zoom in a little bit. In fact, I'm going to put this on the right side. All right, because the menu is not collapsible, I had to put this at the bottom. But essentially, this we're connected to or server using ready. And we need to follow the instructions from here. So where it says download, let's start copying. So this is going to create a folder for us. MK the actions that runner CD actions runner, press enter. And we are inside this folder here. And now we need to download the latest runner package copy, right click to paste it, press enter. This should take a couple of seconds. Now we need to validate the hash. Let's copy, right click, enter. Here we go. And now we need to extract the installer, copy, right click, enter. Perfect. Let's scroll down to the second bit here, which is configure create runner and start the configuration experience. So I'm going to copy this, right click and paste it. As you can see, we're getting authentication. Enter the name of the runner group to add this to runner, press enter for default. I'm going to press enter and the name of the runner. Okay, press enter. Enter additional labels. I'm going to press enter to skip and runner successfully added and the name of work folder. I'm going to try to put this as default as well. I'm going to press enter. And we should be good to go. And now the last thing that we need to do is to run it. So potentially if I do LS, you should be able to see that we've created a lot of files here.  So I'm going to copy the command and right click to paste it run dot SH. Connecting to GitHub. Everything is looking good. Connect to GitHub. Yep. Listen for jobs. Perfect. Now one thing that you might want to notice here is the second step here. Using your self hosted runner. When we create or YAML file, we need to put this runs on self hosted, which I will show you. Okay. One thing that I wanted to show you about the action runner now that we've connected there to GitHub. Let's go back to GitHub super quickly. Click on settings. And then here under actions, you'll see runners click on that. And then you should be able to see your server inside here and the status should be idling. If I was to close this control and see and now the runner has stopped running. And if I was to refresh the page here on GitHub, you'll be able to see that this is now offline. If we ever need to restart the server, I want this to be able to restart as well. So we don't have to do it manually. So I'm going to do control and see to exit this. If we do LS dash one, we can see all the files inside this actions runner folder. So the first command that we need to do is sudo svc dot SH install present password for ready was password. Okay. Now if we do sudo dot SVC dot SH and then status, you should be able to see service enabled, present enabled, active inactive debt. Okay, that's cool. And now we can do sudo dot slash SVC dot SH start. Okay. And now as you can see, we should have active, active running. And the last thing that we can do if you wish to, you can stop it by doing stop instead. But we don't want to do that. So let's leave it as it is. Let's go back to the browser here refresh, make sure that this is idling, which is great. From here, let's set up or workflow, click on actions, search for nodes. And the one that we want is this one here, node.js by GitHub actions, click configure. And then let's remove the comments because it's already hard to see inside here, but I can't zoom anymore. And let's have a look into this. So the first thing that we have here is the project name. I'm going to leave it as default. And then the second action here is on push. So when push changes to a GitHub project, essentially it's going to run everything else. And as you can see, it's looking for the branch main. You can also make different branches such as development, prediction and so on. And when you push change to them, you can deploy your project. In this case, I'm going to be using the main branch. So every time I push changes to the main branch, it's going to run the rest of the file. And for pull requests, I'm going to remove this because I don't want anything to happen when I do pull requests. So let's move that jobs built runs on Ubuntu. Earlier when we set up the action runner, the instructions there were to change this to self hosted. So let's type self dash hosted. This is important. And then for the strategy matrix NodeJS version, we need to select the NodeJS version that we installed earlier in this tutorial based inside here. Let's remove this comment as well. We don't need it. We can also pull the EMV variables here. So by doing EMV column here is where we can list all of our EMV variables by using the name. So in this case, dot EMV variable was called next website URL. Here we go. And then the value you do column and then the value can be taken from GitHub by doing dollar sign, curly bracket, curly bracket, C dot, and then the variable name. So next underscore website URL and then close this with the two curly brackets. And this comes from settings, put this on the little tab. And then this is going to be on the secrets and variables actions. And it comes from here. So the value is going to come from here. What else do we have? Okay, so we have different steps and everything else in here is absolutely fine, except we don't want the test for testing purposes. All I want to do now is run those actions, build the project and don't do anything else.  If we go to actions super quickly, you will see that we already have a workflow running. So if I click on it, this might take a while, but if I click on it one more time, hopefully click, click one more time. Here we go. So this is what I was looking for. So it's going to start the jobs, it's going to run the actions, it's going to use the note version that I set up manually, and then it's going to continue doing the rest. Okay, I might have to speed up this part because it will take a while. Okay, and our first build is complete and it's done in one minute and 37 seconds, which is awesome. If we pull this, fetch everything, pull everything. And if I go back to my project and click on GitHub workflows, Node.js, YAML, essentially we got up to here where we built the project. And if I do ls to list all the files and do dash one, this will list all the files line by line. When we created the actions runner, we created a work folder here, which is where our project should be. So if I do cd underscore work, and then let's do ls one more time, dash one, we have pipeline mapping, actions, temp tools, and then we have ready vps, which is awesome. So this comes from GitHub. If I do cd ready dash vps, this should be our project. If I do ls dash one, I don't fully understand why it does two folders, so ready dash vps and then ready dash vps. Not sure why, but we need to go one step further. So right, so cd ready dash vps press enter. And now if you do ls dash one, you should be able to see all of your project files. So we have the tailwind config, the source, the public, the packages and so on. If I do cd source and then ls dash one, you should be able to see app. And then if I do cd app, and then dash one, oh, cd app, first of all, and then ls dash one, you'll be able to see father conglowers, layout page and so on, which is exactly the same as all project or project has been built. And finally, we should be able to run this project. Okay, let's clear this and let's see the back to this folder here. So cd backwards ones, cd backwards one more time. Here we go. So as long as you're in the project folder, and if I do ls one more time with one, this is the project folder. So from here, we need to start a new process. Just like you do npm run depth, we need to start the website, which normally is npm run start. So if I go to if I go to package.json, you'll see that we have next start. So we need to run this script inside or bone to server. So website is running, and it's probably going to run on port of 3000. In order to do this, we're going to be using PM2, which we installed early in this tutorial. So we're going to do PM2 start npm dash dash, which is going to give us an option of doing name. Unfortunately, it goes on another line because there is a lot to it. Let me do that. Okay, that's a lot better. I think. And now we can choose a name for the process. In this case, I'm going to call it next, js, close this, and then we can do dash dash start and then dash dash watch. Let me zoom in back. Here we go. That's what we need. Another press enter. You will see that PM2 started. And we have a newly running process here. It says that it's online. Watching is enabled, which means that if the server for some reason crashes, it should restart automatically. And it's using the user ready, which is great. And yeah, that's pretty cool. If we go back to our instance here, and if we click on our reserved IP, and if we go to the browser and type the IP and then port of 3000, press enter. As you can see, our project is working, which is great. Now there is one more thing that we need to do. First of all, if I restart the server, this process will most likely stop and we'll have to do it manually. So we don't really want that. You might want to restart your server at some point, and you want everything to run seamlessly and just to work. We can do PM2. Let me zoom in and then startup. Press enter to set up startup, copy paste the following command. Okay, so we need to copy this command. Copy right click to paste it. Press enter. Password for ready was password. Okay, that's looking good. And now we want to be able to freeze this process. So on reboot, it will start. So freeze the process list on reboot via PM2, save, press enter. Saving current process list successfully saved in ready PM2 dump dot PM2. That's pretty much it. All right, now if we do PM2, we should be able to see the process that is running. So now let's try to shut down the server and see whether we get the service, the action runner working and also let's see if we get the PM2 also working. If I go to the browser super quickly, you will see that the website is working. And now let's shut it down.  Okay, maybe so do shut down. And here we go. The system will power off in literally one minute. And then we'll see how this goes. So if I refresh on the website now, it's still working. I'll wait a second. And then I'll refresh in about a minute to see what's going on. Okay, the server should be shutting down, even the processor, even the CPU changed here a little bit. So if I refresh, okay, so the server is now down is switched off. The website will not work. Here we go. It's already should just go blank in a second. And then our action runner here, if I refresh is also offline. So now let's put the server back online. And this should take a probably like 30 seconds or so to start all the services. And I'm hoping that the PM2 will start automatically and the website will work. And also I'm hoping that the server worker here will start automatically without us having to do anything else. So let's wait and see. All right, let's try to refresh this. Maybe it's already done. Okay, we're still offline. And it's idling. Okay, it didn't take long, maybe like 30 seconds. And as you can see, the runner is idling, which is amazing. And now if we go back to the website, the PM2 is also working. So the process is also working. But we should be logged out from the console because the server closed the connection. Okay, awesome. Let's clear this up. And let's reconnect to the server by doing SSH route and the IP address. I'm going to put my passphrase. I think it was ready for me by center. And I'm already back on the server. All right, now, technically, everything is working here. If I was to change something on the project, let's say we go to the page, get started by editing. So I'm just going to say, hello world. Our local host is gonna restart here. And if I do super quickly, local host of 3000, you will see that we're getting hello world and some other stuff in here. Maybe I can just remove this code. Here we go. Just so we get hello world on its own, and we have hello world. Okay, now if I was to push this to GitHub, let me go to the action super quickly. Here we go. This is the first action that completed. But if I was to push this code to GitHub, this change, say, updated home, and then commit to main, push origin should take a second. And now if I go back here, I probably need to refresh. And here we go. This has picked up the new job, which is updated home. And now it's going to go through the entire process of building the project. Here we go using Node.js, running the project and so on. So this should take again, probably like a minute to do. And then we'll set up the rest of the project. Okay, perfect. Or second build was also completed. But now we need to change one more thing inside here. If I was to go to the project and refresh, you should be able to see that we're getting the latest changes. And this is the live website. Now one thing that we do need to change here is inside or Node.js, JS, YAML file, where we have NPM run built. We also want to add one more line. And this is so or PM2 process restarts or starts the project. So if I do PM2 list, you will see PM2 list is because, okay, this is a good thing, actually, I'm logged in with root. And that's why I cannot see the PM2 list. So I'm gonna have to switch users. So let's do clear. And let's do pseudo switch user to dash ready. And now if I do PM2 list, we should be able to see all the current running processes. One important thing is that when we push changes, we want to select this process here and restart it. So this process has an ID of zero. So in order to do this, we can go here and then do dash, run and then PM2 restart. And we restart the process of zero, like so we want to do that. But also in order for this to work, because we can only run the command PM2 inside the project directory, we will need to find the project directory and change the folder. So inside here, I'm going to do name and then say change directory. And to change the directory, we can do run CD. And then we change the directory from here. And it's going to be home, I believe slash ready slash action runner dash. And then the website name. So let me have a look because I actually don't know the full thing. So I'm going to do right click. Can I not do that? Okay, so now let me do that. So let's do CD slash home slash ready slash action runner actions runner press center. And now we have the work directory. Okay, so it's going to be CD underscore work.  Okay, so let's do that. So this is actions runner and then underscore work and slash ready VPS slash ready VPS. And now if I do this, let me try to paste it. Here we go. And now we should be in our project directory. And if I do this, this is where our project is. And this is where we can restart the PM process. So when we CD to this project folder, we should be able to run mp to restart in order for this to happen. I would definitely suggest that we push this. And then we wait to see what happens. So I'm going to push this change to restart process, PM to restart process zero. I'm going to definitely commit this and retest everything just to make sure that everything is working before we do the next thing. So I'm going to go back to the website actions here. I'm going to wait for this to happen. And then once we are done, we'll continue. Okay, the process is done. If I click on it, click on the job, click on build, scroll down to the bottom somewhere, it would say, Oh, here we go. PM run PM restart zero. And hopefully, yep, everything is looking good. If I go to the console and if I do PM to list, you should see that this is still working. Which means that all website is also still working. All right, the next thing that we need to do is to point a domain name to this IP, and then we can create the SSL after. So my domain name is located under porkburn.com. I'm going to sign in from here. Obviously, every domain name register will be slightly different, but the settings will be exactly the same. I'm going to select my domain name, which in this case happens to be ready dot lol. I got a really cheap for a year and then I probably won't renew it. But essentially, what we want to do is scroll down to the bottom and find the record. As you can see, I have two records here, which I want to remove. So I'm going to remove both of them, like so. Let's go to the top here where we have the record. I need to go back to my server here and get the reserved IP. So I'm going to copy this, go back to my domain name, and we need to add two records. The first one is going to be an address record or a record, and then it's going to be blank. So this is going to be basically ready dot lol. And then the answer will be the IP address. That's it. All we need to do is add it. And then this is going to be added here at the bottom. And also I need to add one more. So again, a record, but this time we're going to add an alias. It's going to be basically www dot. In fact, we don't need the dot because we've got it here. So we add in www and then the URL is there. And we just need to put the answer to be the IP address of a server again. Click add. And now at the bottom here, we should be able to see two a records. And sometimes the records might take a while to propagate. So that's something that you might want to check. And I'm going to grab ready the low and look for this IP and NS lookup search for NS lookup. Let's choose the first website here, but ready dot low find NS records. And as you can see, speak to digital ocean. And we have exactly the same IP as here, which means that it propagated in literally like no time, which is pretty cool. So I won't have to wait. It's already done. And of course, I can put www dot find records. And this is also propagated, which is awesome. If I go to the URL of ready dot, if I go to ready the low and press enter, nothing will happen. But if I go to ready the low of 3000, you will see that the website is actually working, which is pretty cool. Now let's set up a reverse proxy. So we don't have to do the port 3000. And we also set up the SSL. All right, let's go back to the command line and let's clear everything. And normally you will do exactly the same thing as in the beginning of the tutorial, do pseudo APT update. If anybody's tuning in now, put the password of password. That's for me. Okay. And now we're going to do pseudo APT. And we're going to install engine X, like so. Would you like to continue? Yes. And now to see the status of engine X can do system control by doing CTL and status. And then engine X press enter. And if you see this, everything is looking good here. Okay. Engine service, a heavy performer web server and reverse proxy server. If I was to go to ruddy.low and press enter, I'm hoping that we get welcomed, which is awesome. So engine server is working. And now we can just do reverse proxy to go to that port number. Okay, let's go back to the command line, clear everything. And from here, we need to create a custom configuration block. So we don't need the default directly. And in order to do this, we can do pseudo. And then we need to do nano nano is the editor, by the way. And this is going to be etc, etc. Engine X and then slash sites available slash available. And then the domain name. I don't know if you're able to see, I'm going to do this. And then the domain name is going to be ruddy.low in my case and press enter. This is going to open the editor. And then inside here, we're going to have to copy and paste a little bit of code. And feel free to post the video. Basically, we have a server which listens on port 80. And then we need to change the server name here to ruddy.low. And then www.ruddy.low. And this is very important thing that we need to change it here is the proxy pass app server address. So in this case, we are going to need to do localhost of 3000, which is where our next JS website is working on. And the includes proxy parameters you can check out in the folder, etc. engines proxy params. And then you'll have the proxy set headers inside there, which you can edit if you wish to. I'm not going to do any of this. All right. And now we need to do control X. And this is going to say, would you like to save the modified files, press Y. And this is going to save it as here, ruddy.low. As you can see at the bottom and press enter. And we should be good to go. So this file should be saved inside here. And now we need to enable this configuration file by creating a link from the sites enabled. There are actually that engines reads at startup. So see the LN dash s. And then the folder is etc dash engines sites available slash ruddy.low. And then we do, etc. Etc slash engines slash sites enabled. And then slash and then we press enter. Okay, that should be done. We can test the configuration file by doing sudo engines dash t. Okay. And we have an error. And I believe that we're going to have to open the sudo nano site available ruddy.low. It might be because I've put, I haven't put HTTP here slash slash localhost. So I'm going to do control an X. Yes. Press enter. And now if I do sudo engines dash t. Okay. Syntax is okay. Everything is okay here. So it was just the HTTP that I forgot. And the last thing that we need to do is restart. So sudo system control restart and then engines press enter. And now if I go back to the browser put ruddy.low. As you can see, our website is working. We are fellow world by Ubuntu here, which is pretty cool. And now we just need to install the SSL. So I'm going to go back to the command line here. And let's do sudo apt install, third bot, and then python, python free. And then third bot dash engines press enter. Would you like to continue? Yes. Okay. Let's clear this. And now we need to go to sudo nano, etc. Engines sites available. And then ruddy.low. Make sure that you have your domain name in here. I've already added mine. I'm going to close this with control and X. Make sure that you do sudo engines dash T one more time. Everything is looking good. And now we just need to obtain a search by doing sudo third bot dash dash engines dash D. And then ruddy.low is the domain name. And then dash D, www.ruddy.low is the other domain name. So press enter email address. Okay. So I'm going to put my email address, press enter. Yes. Yes. One more time. And now this is going to go and request certificates for ruddy.low and www.ruddy.low. And as you can see, the certificate was issued and it was saved on there, etc. Etc. Let's encrypt live ruddy.low and then full chain.pam. And yep, everything is looking good. Successfully deployed the certificate. Congratulations. You have successfully enabled HTTPS on ruddy.low and ruddy and the www domain name. So if refresh automatically, as you can see, this went to HTTPS. And now we have a valid certificate, which I can see here. Connection is secure. And I'm not and here we go. Certificate is valid. If I click on it, should see somewhere on here. But but yeah, that's pretty much it. And just to test everything one more time. Let's go back to the project. Let's edit the page. And let's put hello world v1, for example, save this. And if I go back to GitHub desktop, and if I commit this push, it's going to take a second. And if I go back to GitHub here, let's see the actions, you will see that we're getting update page.js. This is obviously going to take some time to build. And hopefully, after this is done, we should be able to go to our domain name and see the change of our website. And that's going to be it. Okay, and our build is completed. So if I go back to the website here, ruddy.low, we should be able to see hello world with v1 refresh, hello world with v1, which means that everything is now working correctly.  That's pretty much it. It was a tough tutorial to do because there is a lot of variables around. I hope that you find it useful. Consider liking this video and subscribing to my channel. And hopefully, I'll see you in another video. Bye.


Because it was obvious, you know, even everybody in the city, even us, we always figured and tried to figure out like, if we, if no limited cash money would have worked together, he let alone even touring. That's what I'm saying. It never even been a tour or nothing. Yeah, we on Boss Talk 101. And one thing I always wondered was like, I always was, in my mind, I wanted to put cash money and no limit together more than what I was thinking it. It seemed separate, but I'm like, damn, they right there. You could tell it was family. You knew it was respect. Right, right, right, right. I knew it was respect. I didn't have nobody to tell me that, but I also knew that it was not the same too. I could tell that as well. Right. Because it was obvious, you know, even everybody in the city, even us, we always figured and tried to figure out like, if we, if no limited cash money would have worked together, he let alone even touring. That's what I'm saying. It never even been a tour or nothing. I was always wondering why. It never been a tour or nothing. And y'all from here. But you got a lot of juvenile on the ticket now. Yeah. Juvenile on tour with them right now. Nobody is juvenile. And Mr. could have been kind of back and forth on both sides, but it's just more like right now, it's just more of like with Juven is just that nobody is committed, like even though it's a no limit tour, nobody is actually committed and signed to this company no more. Okay. Is everybody, we are coming together to do this, but so each artist is their own boss now. Yeah. That's why it's called reunion tour. Right. So and the thing about it was that, um, like I even, I even never understood like even after the situation was caught, I always like, um, I think I asked Peter about it one time about when we was moving and I asked him about court. It was CCG's. Yeah. Yeah. Of course. You know what I'm saying? I asked him about the group and he was like, he was like, well, I don't know because I guess one wanted to stay and the other one didn't. Yeah. So it was that's what it was. And he said that like one day they, they wanted fans, okay? Right. And then, but they didn't have nothing and then he, because say, we don't have, we, this is opportunity. That's what he kept telling me about that, about what, but the guy didn't like P because of he was pressing him for an advance, you know, or trying to get something out of it, you know, right. Right. And even at that time, it was like, um, P had money, but I don't know what the company had. Like that's what artists and people feel to understand is like, like if I made all my money personally on another business and I decide to start another business like a record company, don't count on, don't count on my personal money. You just look at to what, what, what, the, the, the, um, the label is that right now. Mm hmm. You know, just, I heard this one thing with, with Shaq and Bill Cosby said when they, when they children told him, but that we rich. He said, no, I'm rich, which is true. It's a hundred percent true. I'll help you get that. I'll get to you. I'll help you get to where I'm going, but I'm rich, me and, me and your mama rich. Yeah. Y'all not. Yeah. We on boss talk one on one.


Israeli generals reveals cost of defending against attacks of Iran, $1.33 billion. Israel has claimed success in defending itself against Saturday's drone and missile barrages by Iran, but that effort reportedly came at a high price. The interceptors, jet fuel and other materials expended in shooting down Iran's unmanned aerial vehicles and missiles cost about $4 billion to $5 billion shekels or $1.06 billion to $2.33 billion. Israeli Brigadier General Reem Aminoch told local media outlet YNet News. The estimate included only Israel's direct costs, not counting the considerable weapon reused by the US and other allies in helping to defend against the attack. Aminoch, formerly the financial advisor to the Israeli Defense Forces' chief of staff, said West Jerusalem used such ammunition as arrow and David's sling interceptor missiles which have per unit costs of about $3.5 million and $1 million respectively. He also included sortie expenses for the fighter jets that did the bulk of the work in shooting down Iranian drones. The general lamented that it was far cheaper for Iran to launch the attack than for Israel to defend itself. The attack cost Iran less than 10% of what it cost us to defend against it, he told YNet. In the future, in a year, two years or five years, they can carry out 50 such attacks. And let's say that if the Israel Defense Forces net budget in 2023 was 60 billion shekels, with less than double that, you have no chance of reaching a situation where we can maintain the required amounts. The Israel Defense Forces claimed that 99% of the more than 300 kamikaze drones and missiles launched from Iranian territory were successfully intercepted. All of the UAVs and cruise missiles were shot down, military spokesman Daniel Hagari said while a few ballistic missiles got through Israel's defenses. Those projectiles fell at the Nevatim airbase and caused only minor damage to infrastructure, the spokesman said. He added that the drones launched by Iranian-backed militants in Iraq and Yemen all failed to reach Israeli territory. The fire takes place during the peak of what is considered the dry season in South Florida, which extends until the end of May. Meteorologists said the conditions have been drier than usual across the region, and no rain is expected during the early part of this week. Firefighters in Boca Raton are working to extinguish a brush fire of north of Clint Moore Road. Boca Raton fire rescue services department leaders say the brush fire that began last Thursday morning was under control. Crews are currently conducting the controlled burns in the area of the brush fire to use up nearby fuel to prevent a possible rekindling from spreading the flames. Fire crews with multiple agencies are also working to put out any remaining hotspots, the fire has caused large flames and smoke to billow into the air. Smoke can be smelled for miles depending on the location. There's no need to be worried, said Boca Raton fire rescue services department deputy fire chief Janie Smith. Multiple agencies, including Highlands County fire rescue, worked a large brush fire, causing residents to evacuate their homes. People were asked to avoid the area in Sun and Lake from Granada to Schumacher Road while crews were on scene. The brush fire is estimated to be 55 acres in size. According to officials, all homes on Granada Boulevard between Edgewater Drive and Ortego Street were evacuated, which were about 20 structures in total, mainly duplexes.


It's the Cube, covering Sapphire Now. Headlines sponsored by SAP HANA Cloud, the leader in platform as a service. With support from Console Inc, the cloud internet company. Now, here are your hosts, John Furrier at Peter Burris. Okay, welcome back everyone. We are here live at SAP Sapphire. This is the Cube, Silicon Angles flagship program. We go out to the events and extract the signal from the noise. I'm John Furrier, my co-host Peter Burris. Our next guest is Dave Mason, SVP, Big Data and SAP at NetApp and Czech GoRinger, Cisco Global Partner Organization. Welcome to the Cube. Thank you very much. Thank you very much for having us. So, NetApp and the file business, the file storage, disk, flash, flash is taken over the enterprise. Certainly, it's powering a lot of the stuff under the hood. Everywhere. And success of FlexPod. You get a lot of big accounts like SAP. HANA and cloud, on-prem, is exploding here in performance numbers. What's going on under the hood for you guys? How are you guys involved in the SAP equation? How does all this connect? So, let me start, Chuck. Let me kick off just for a second.  It's been an amazing ride. We've built a multi-building to our business out of that, and it's been a keystone to a number of customers in developing our business practices around it. Actually, we just released the latest version of that with Flash, enabling an all-flash solution, or all-flash fast, in there. And that has grown so fast. In fact, it's the fastest-growing product, one of our fastest-growing products at NetApp. We've seen the history of the company. It's 22 years. Flash is a crack of storage. Flash is not, Flash is a crack of storage. It's going crazy. You get people stuck on that. They never go anywhere else. In fact, what's going on in the industry, is the reason it's not the media, and people keep saying it's the media, right? It's not the media, it's the experience. Because right now, Flash is changing so fast on the size, the capacity, where that used to be the last frontier. Used to see that you could never get more than maybe a terabyte of Flash and it cost a fortune to do that. Prices have dropped through the floor. Capacity has gone up through the roof. We're releasing a 16 terabyte drive in one month. On all Flash, that'll be incorporated into our Flash array that's going to be part of the FlexPod ecosystem. That enables people to do so much more. And as I said, it's more experience than it is media. Because once you get people, as you said, to get them stuck on it, they never go back. What they do is they put all their workloads onto it. It simplifies their environment. And the reason they do this is because we're seeing people get away from tiered architecture and going to a performance tier for persistent storage and a capacity tier. And that simplifies their services. But object storage has been booming on capacity, right? Absolutely. And object storage is where we see it or an S3 connect. Either one's going to go that way. Well, as digital and software and analytics get more deeply embedded within the business and becomes an increasingly crucial asset to how any business behaves in its marketplaces, then the physical constraints of capturing moving data become very real and they're starting to become part and parcel of the whole concept of business design, business model design. How are leaders starting to think differently about designing their business or their business models as it pertains to this notion of data availability anywhere, move quickly over distances that satisfy experience requirements? I'll let Chuck take the first one. I'll take the second one. How's that? Absolutely. Well, first of all, as we kind of talked about the partnership between Cisco and NetApp is actually very, very important to Cisco in general because over a multi-billion dollar business but it's really important to our SAP strategy. NetApp and Cisco today have been innovating around total cost of ownership of deploying SAP applications into your question about the digital enterprise as these applications start to bring data in from different sources, you're trying to take advantage and deliver new business outcomes through the applications through bringing data in from that management and that total cost of ownership is crucial. And we started down a journey many, many years ago with using the FlexPod as the basis. And what we've done is we've been innovating together with SAP around how to bring that total cost of ownership lower and so that you can bring these new business scenarios. And one of them is around how do we share in HANA? How do we do things like tailored data center integration? How can we share more resources? How can we take better advantage of the infrastructure to deliver those outcomes? It used to be very dogmatic back even just five years ago but we'll go back 10 years for real, people putting their heels into the ground and digging in around architectures. Scale out, scale up or two different notions, almost two political spectrums, right? It's like Hillary Clinton and Donald Trump, I don't know if it's a bad example, but, you know. One wants to build a wall, it's called a firewall, that's Cisco, but I mean now have scale up, scale out now are completely indescribable. No one is independent of each other. It depends on the workload, right? So, you know, UCS has been, we've covered some of the UCS stuff with Cisco. So, you know, in and of itself, storage has their own challenges with, you know, high performance and certain workloads just on the storage side, you mentioned tiering. When you start to get into stuff where optimization and automation comes in, now we're kind of in the Cisco, so I'm trying to piece this together here, and if I get that right, that's kind of where I see the action here. So, can you guys share where the complexity gets extracted away? What are you guys doing with FlexBod specifically and with Cisco, say UCS or other tools so that the customers don't have to go through all the hassles? Because, again, the simplicity angle is huge, right? How do you make it simple as what everyone wants? But, you got to automate in order to get there. What's being automated? How does that affect the customer? What are some of the things? Can you put some color around that?  So, there's a couple of planning principles. The first one is, you know, we want to get better asset utilization. So, that's through, you know, virtual servers, that's through shared resources and optimizing all the tiers, whether it's network storage or compute. The second piece is we've been working with SAP, not just to automate the infrastructure, but also to automate the requirements of the application, specifically things like SAP HANA, and now as we're going into big data solutions, SAP HANA Bora. We've created co-innovation labs. We're working very closely in very tight partnership with SAP, together with NetApp. You know, the three of us are coming together to have that end-to-end, starting at the application requirements and then with a single click, being able to deploy those applications, configure the infrastructure seamlessly and then by using automation, we bring another element, which is what we call security and governance. So, by not having a manual, you know, reducing manual processes and all that, we have a service assurance, we know how things are deployed, we have an audible result at the end of the day. And that's been a founding principle of our work on FlexFOD. Absolutely, absolutely. FlexFOD was all about simplicity from the ground up. I love Bill McDermott's keynote this morning, talking about lending on simplicity and the focus on simplicity and the whole deal with make it consumable for the end customer to use. And that's really what we've been talking about and that's what our relationship is. And by the way, the relationship for SAP, I look at this as kind of the perfect marriage, so to speak, well, maybe a three-way marriage, but perfect marriage, you know, I don't go that far, but I'm just saying that we have got a incredible relationship with SAP over 12 years. We've been doing business with SAP five or six years with Cisco. It's kind of like the Russell Westbrook and the Steph Curry of the industry joining together and we are just so proud of that relationship. And you know, and the goal to say warriors, you mentioned them, the offense, you know, Steph Curry's the MVP and what's going on is going on with him, but you look at, that's a team chemistry and their approach is different. They've thrown a lot of three-pointers. So you have a new game. So I'd say Cloud is kind of the new game now and you're seeing that. Cloud is the three-pointer of the IT industry. It's the new high arc three-pointer. But back to the business model question that Peter brought up on the storage and now I was teasing it out earlier. The apps themselves are the business model, right? So what you have is, it's easy to say, oh, Facebook's one big app. Okay, that's their business model, make billions. But enterprises as they connect and SAP is integrating with a lot of touch points.  They're a big company. We had IBM on earlier. If all these things, they're integrating well. So that requires mixed workloads. So this is the big question. So how do you guys deal with the diversity of workloads? Are they, and how do you deal with that? Is that built into the system? Because that's an issue right now for the enterprise. It's not an easy saying, hey, it's a clean sheet piece of paper. There's multiple apps, different workloads, different times, real time. What's your take on this mixed workload perspective? I think the way I see it from a number of customer meetings I've had is everybody is struggling with how to lower their overall cost of operation. I mean, that's kind of the net of it, right? And so they look at every opportunity they have and they look at their toolbox. They say, well, what am I going to put on-prem? What are we going to put off-prem? What are we going to keep internal? And what are we going to give off to a third-party solution? And what we see is many customers, in fact, almost all customers, are using some sort of hybrid solution, that hybrid cloud opportunity, where it says I'm going to have some element of my workload in the cloud, through an S3 connection or into Amazon or into Azure, whatever it is. Or I'm going to have, and I'm going to have some element of that on-prem, okay? We believe that's the architecture of most companies. And in fact, I think that's where we see our value, because the value benefits- That's the hybrid cloud, basically. That's the hybrid cloud. And the value benefit of the hybrid cloud with Cisco and NetApp is that that on-tap was built for that type of ability to go back between clouds. It's agnostic to clouds. It doesn't matter if you're in Azure today, in Amazon tomorrow, that ability to snap back and forth and then bring it back in if you need to deal with the workload change, okay? And that's where we see most customers moving to. Chuck, what's your take on the relationship with NetApp? Because obviously Cisco's evolving as well. Everyone's retooling for digital transformation, whatever trend they want to call it, but it's the same trend. People digitizing their business, dynamic, perimeter-less security. You got hyper-converged out there, so you guys know a lot about conversion for structure between Cisco and FlexPod. You guys are in that business. You got hyper-converged, you got real-time apps. Talk about the state of the relationship with NetApp. What's the future look like? A lot of people have been talking about it. What's your take? Yeah, I mean, right now, our relationship with NetApp is basically one of our most strategic relationships. And when it comes to SAP, it's really foundational. We're doing all our co-innovation with SAP with NetApp. We've built out labs at SAP with NetApp. And the reason for that is, at the end of the day, these are mission-critical systems. Cisco's strategy is to work with best-of-greed partners like NetApp to make sure that you have the security, reliability, and also the innovation engine to deliver these applications. So right now, we're doing a lot around SAP together and I don't see that changing in the first year. SAP is very much co-development-oriented, aren't they? Pretty much. They're from a long time. From day one, and that's why I can find a better partner than Cisco in going working with SAP and enabling SAP. We're the core of the HANA Enterprise Cloud. We actually are that core. And in fact, I met a couple of the EVPs over at the charge of this business. They are saying, Dave, our resiliency is critical and our ability to deliver our customers' needs in HANA are the number one thing we have as a priority within and across SAP. Where is the customer's challenges from you guys' standpoint? And obviously, the market's changing. I mean, internet working was created by TCPIP that basically creates Cisco. But now with cloud, is there an inter-clouding technology that's similar to what routers work? Because you again, we've mentioned perimeter-based securities down. Is that now a fact that you get security? And now you got cloud traversal. You got HANA, you got BlueMix and IBM, are we going to see cloud bridging or is this whole thing going to get flattened down so there's a common protocol for dealing with cloud? I'll give you my point of view, and it may be wrong. I'll just tell you right now. Yeah, I mean, it's futuristic, so we want to kind of tease it out. I think the reason that cloud bridging, as you said, it's going to happen because competitive natures are going to stay in place. The competitive environment is going to push for that. And so the ability to go between clouds or ability to go in the cloud, I was actually talking to a customer about a month ago, they actually have their dev tests, their test dev into one cloud, and they have their archival data in another cloud. And they want to move back and forth between those two clouds. And the ability to flex back and forth as changes and pricing goes up, especially as you have demand pricing now, it's so critical. I was going to just add that the pace of change and what we're seeing right now doesn't lend itself to a flattening. That's when you see technology slow down and things, I think there's so much change out there. We call it the world of many clouds, and we're seeing that. But one thing I do want to call out is, we've seen a change over the last couple months of our business where SAP workloads now, it used to be, well, maybe cloud, a percentage now. We're seeing now almost all customers are like, how do I leverage the cloud, obviously, for SAP specifically? That means they're mission-critical workloads, and that's where you have to think about what kind of infrastructure you're running in the cloud. Does it have the security, the controls, the innovation that companies like Cisco and NetApp are driving? And it's got compliance, you've got integration, there's automation, it's not trivial. You have disaster recovery, you have all the aspects that are needed in the cloud that you're used to from the on-prem solution. Yeah, and still, data is growing too. So if you're in the storage business, I don't think it's going to be a depression when it comes to storage. There's more storage needed, but more and more capacity optimization is huge. Well, we keep storing everything. Do you ever throw anything away? No, I keep upgrading. People build on top, this is an evolution of layers of innovation. It is, it is. I don't see a destruction, I think, more in advancement there. Absolutely agree. Well guys, thanks for coming on theCUBE. Chuck, Dave, appreciate it.  I'm on theCUBE, really appreciate it, and thanks for the candid insight. Just go to NetApp here inside theCUBE at Sapphire. I'm John Furrier with Peter Burris. You're watching theCUBE. Thank you very much. There'll be millions of people in the near future that want to be involved in their own personal well-being and wellness.


This is the story of Chalon Arang, the legendary evil Balinese witch. But did she really exist, or was she imaginary? Great Japanese kingdom of Madang decided to bring the island of Bali under its control through its princess Mahendra Dutta, marrying the young Balinese king Udayana. Their reign brought a period of relative peace and prosperity. Behind the scenes, though, it was Queen Mahendra Dutta whose wisdom really guided public affairs. She drew upon Lipyakara, a palm leaf manuscript, Lontar, on how to govern fairly and justly. She needed it to keep the violent Balinese aristocrats in order. Then, suddenly, King Udayana died. Mahendra Dutta reigns as Queen. However, she's a woman. A Javanese, and worst of all, rules justly. So she has made bitter enemies of the corrupt courtiers who are thinking how to get rid of her. Then, a volcano erupts. Famine and cholera strike. Two senior ministers, Patti Madri and Malin Maguna, decide that it is time to act and bring back the bad old way. So they start rumors. Who is responsible for this dreadful calamity? We know the Queen prays secretly to the terrifying goddess Batari Durga. Perhaps it is she who has sent this plague and killed the King too. Falser the rumor, the faster it spreads. Vested interests fear and hate the Queen for introducing new ideas. For questioning tradition. When the two ministers feel confident enough, they advise the Queen to leave for your own safety. Mahendra Dutta departs for the remote forest village of Deira, with her daughter Ratna Mangali. No longer Queen, she modestly calls herself Walu Nateng Deira, the widow from Deira. Soon, after her departure, however, nepotism, corruption and violence take hold in the kingdom once more, and ordinary people suffer intolerably. Educating her own daughter, Walu Nateng Deira explains two aspects of power. Brute force cannot defeat mind. Those with inner majesty, Vibhava, will triumph in the end. Also, beware tradition. It is used to coerce and to deny change, flux and creation. Men feel threatened by change and call it black magic. Gradually, more and more people flee the ruthless regime and make their way to the forest to seek advice and help.  Recognizing Walu Nateng Deira's growing reputation poses a threat.  On arriving, he's surrounded by the Sisya, who have learned not to be afraid and make fun of him. They force him to flee, aimed at being outwitted. He returns to the court claiming Walu Nateng Deira transformed into the terrifying figure of Chalon Arang before his very eyes. In the court, panic reigns. What to do? How to turn things to our advantage? If masculine force won't work, perhaps guile the will. Pati Madri goes in search of the wily old court counsellor, Ampou Barada. He devises a plan for his son, Kabo Bahula, to seduce Ratnamangali so he can steal her lontar, which they attribute with magical powers. Yes! Did it yesterday? You didn't get it right. Okay. Come on, focus. That's better. On, do your homework. Ampou, Walu Nateng Deira is destroying everything. I don't know what to do. Maybe, maybe you, you can help. I've heard about your problems. Have an idea. You go back to your people. Leave it to me. I'll deal with it. Thank you. Off you go. Thank you. Thank you, Ampou. Hey! We really don't want to do this. No, no more writing. Put it away. We have a job to do. What is it?  Is she pretty? Is she sexy? Hey! Focus. You need to steal her lontar. Bring it here. Give it to me.  When Kabo Bahula arrives with a plan to seduce Ratnamangali, she's disgusted by his arrogance and his aggressive overtures. She rejects his advances. Finally, Bahula tries a more modest approach. Knowing the gossip about her mother frightens off all the young men, Ratnamangali reflects and finally agrees reluctantly to accept him. At night, while everyone is asleep, Kabo Bahula steals the lontar manuscript to give to his father. On waking, discovering the lontar missing, Walu Nateng Deira realizes that Ratnamangali and she have been tricked. After her initial shock and anger, she calls her sisi to discuss how best to respond. She decides ultimately to ignore the attack because she realizes the men behind this are trying to goad her into a violent reaction. They seem to believe the power resides in objects like lontars, not in the thoughts of the person who reads it. Kabo Bahula returns and tells his father a quite different story about how brave he was. He managed to capture the lontar in the face of deadly danger. Every night, Walu Nateng Deira and her sisi Nalakas transformed into terrifying apparitions. So the legend of Chalon Arang was born. As Walu Nateng Deira has not reacted to the theft Ampubarada is puzzled. He has no idea what she's up to and cannot report his success to the court. So he is forced to go and find her. Discovering her calm, he tries to enrage her by waving the lontar at her. She simply hands it back to him. So Ampubarada throws it in the fire and she still refuses to be drawn. He attacks her. However, she deftly evades him until it dawns on him that the stories of her being a witch were false. Instead, she has such majesty that he is obliged to submit. Walu Nateng Deira transforms into a truly independent woman and Ampubarada learns the nature of inner power. Do not believe everything you are told.


All right, if you're sick of working with Q dialog and you want to actually test out Q main window today is the day There's a reason we haven't covered it yet though. It's very complex If you look at the documentation it just goes on and on and on I mean this reads like a horror novel But really what you need to understand is the Q main window comes with some functionality baked right into it for example menu bars status bars toolbars you can dock widgets and a central widget which It takes a little bit of explaining what a central widget is but basically it's the reason why you're looking at the window For example this web browser the central widget would be well this web page area It's the entire reason why you have the application. So a text editor. You'd have a giant text area You know so on and so on let's go ahead and just dive in here and let's take a look at how to build one of these So we're gonna say new And let's just call this cute with its beginners seven dash one We're gonna leave this as Q main window and just leave everything as the default Next next finish Now from a code perspective things don't look too different. We're just inheriting Q main windows to Q dialogue The user interface though looks different. You notice right off the bat. We have this type here If we kind of scroll down We can scale this you can see we have this status bar down here might not be readily available in the video But it's there and we have this little actions editor down here. Hmm If we could right-click and then we go to new we can actually make some new actions So let's call this New and it's automatically named action new and we can have tooltips icons make it checkable have shortcuts and all sorts of other stuff We're just gonna keep this video super simple And there's action new Let's make a few more. Let's call it open save copy paste You know just some general actions in case you're wondering how I'm coming up with these actions It's pretty much standard that most applications have things like undo redo cut copy paste things like that And let's see here we've got Copy paste. We don't have a cut. So let's do cut. Let's keep this simple and let's say new and we're gonna say select all And we could say select all and it actually renames it with the underscore automatically And you may be wondering. So what's the point of having these actions? Well? There's really two main reasons a We want to populate right here. This is called a menu. So we say file and let's just double click in there file And hit enter there we go. You see ta-da now. We suddenly have menus and we can type here or we can drag and drop So for example, let's just drag up here and you see that little red line there's new open save and Then we can go over here Let's type edit drag and drop. We don't want new here because we got it over here. So we can just cancel off Let's go copy Cut let's go paste And I want to add select all but I want to add a separator, which is just a little line See if we can find one here. Yeah, see this line right here between these two That's a separator So we're gonna go here I'm gonna just click the double click the add separator adds it in automatically and then we're gonna go to select all Grab that move it up Now if you're not super skilled with mouse, you can actually just do them right here You can just type right where it says type and it'll make the action for you Little bit error prone. That's why I like doing it down here and then dragging and dropping Now, let's say We want a toolbar right here. We want buttons going across what we need to do is actually Look at this. You can see by default. There's no toolbar We can just right-click add toolbar and you get that thin little line right there Then you can just drag and drop. Whoops. I missed it. That's what I mean by not particularly skilled with mouse and keyboard sometimes And we're graphically building our interface and we can right-click and we can append a separator and it adds a little line Might not be readily available in the video, but we can just add the copy Let's go with cut and let's say paste Now we have a bare basic interface. Let's save this Let's go ahead and run this and see what this thing looks like here This is our main window in all its glory We have our actions going across and our actions in the menu and they call the same code So for example, if you right-click and you go to slot Ta-da, we have our queue actions and we have changed hovered toggled Triggered and triggered. So we're just gonna go triggered without any parameters and there's our code So trigger is really defined on when the user clicks them And I think my interface is just taking a minute. There it goes So we're just gonna actually go in we're gonna define the slots for each one of these This is a bit of the boring part of development is just doing what I call the plumbing connecting everything up Now the great thing about this is you have one Slot that can be used multiple times either via the menu or via the toolbar Let's go back here and we're gonna add a plain text at it Let's go ahead and add it in here and we can try and set some sort of layout or something and It kind of looks okay Save and run this But you notice how we have this little area around it. It's not very attractive. We want that going right to the edge here So let's flip back in here. Let's go to our implementation file and we're gonna say UI and There's set up UI Don't get that confused with what we're about to do set up UI is different than set central widget And you don't want the user interface. So I see a lot of people asking that question Why don't I see the option to set the central widget in the UI? It's because it's not part of the UI class. It's part of the Q main window. So we're gonna say this Set central widget and it just takes a Q widget and now we can say UI plain text at it save and run and let's see what this looks like now Now you see how it goes right to the edge. It actually ignores any layout that we put in there just goes right to that edge and We have pretty much a text editor here comes complete with scroll bars And I'm gonna just grab some text off the screen here and we've got just a mini text editor complete with word wrap and You guessed it menus So let's go ahead and fill in some code here to make this thing somewhat functional. Let's close that Let's go in here And first things first we want our includes. So we're going to say Include Q file dialogue Actually, let's do Q file first Q file dialogue and let's do We want the Q text stream Q message box In case you've guessed what we're doing. Yes, we are making a very very basic text editor If you're on Windows, it's gonna be something very similar to notepad You can call this whatever you want. You call file name and file name Whatever doesn't matter as long as you have it in there now from here really we just do what I call the plumbing We start filling out these slots and that way things are start happening when we click buttons. It's pretty simple All right now We've got our constructor. We're gonna leave the deconstructor just the way it is Now we just simply need to start filling out some things and we're gonna go into the new button or the new action We're gonna say UI plaintext edit and we're going to actually clear that out And we're gonna say UI status bar And we're show a message and we're just gonna clear out any message that we have In case you're wondering no this video is not going to make a complete app I'm gonna actually break this out through the entire section just because this type of programming does take a while And we'll be here for a few hours talking about this For example open gets a little bit more complex. We're gonna say a Q string path equals and we want the Q file dialogue Which does exactly what we think it does. We're gonna say get And there's open file URL and open file name. We want get open file name this and Open a file And it does exactly what you think it do it pops open a dialogue saying hey What file do you want to open it? It'll let you select the file off your local path here They're gonna say Q file File and let's go ahead and feed at the path that the user just selected And we're gonna say if file Open and we want the Q IO device Read only Just in case you've skipped ahead. Yes, we do cover all this in the Cute core beginners intermediate and advanced series out on you to me So we're not gonna really in depth cover Q IO device in these videos And we're gonna say If we cannot open these and then we're gonna show a critical message box to the user let them know Hey, you screwed up Not my fault you the user screwed up And we're gonna get the error string indicating why we can't open that file and then let's go ahead and return And then let's go ahead and queue text stream this Stream gonna hand this a handle to the file And if we're here, we have an open file. So we need to close this file Some people don't do that force of habit. I always do it just in case I don't want to lock up any resources And then we're gonna say plain text edit and we're gonna set that plain text By reading the entire file Pretty simple pretty easy to understand But then we also want to get a little added bonus that status bar at the bottom case You're wondering what a status bar is technically this is a status bar, although that's a toolbar But the status bar is that thing on the bottom that usually shows the file or Some other message. So we're gonna say UI status bar and we want to show a message Notice how we can add a message or a timeout along with that. We're gonna do just the message. The timeout will actually make it disappear I just want to show that message and Let's go ahead and say M file Go path Might be getting a little ahead of myself that might confuse me in another video. Let's go ahead and copy this Because save is pretty much just doing the opposite of what we wanted to do initially So in save we're going to say Get save file name not get open and then save File there we go Notice the difference between get save and get open their two distinctly different dialog boxes, although they may look identical on your operating system Set this to write only and then we're just going to Change this we're gonna say stream UI plain text edit to plain text. I really wish they changed that to just text And then don't need to set any of that because it's already saved But we're going to anyways just leave it right the way it is and everything should just go I mean Now we've got a semi functional text editor at this point. We can open a file the user can modify it They can save the file. So let's fill out some real simple signals and slots here So we've got our Action is called copy and then we've got paste cut select all so we're just gonna say UI plain text edit and We want to copy we could have very easily just you know connected those via signals and slots Using a bunch of connection code up here. I like doing it here in case I want to like Show on the status bar. Hey, we copied. Hey, we pasted. We did something Some people don't like doing this I like doing it because it gives me the option to just say oh, yep I want to add some extra code here And then it's just very boring we just say cut and select all And we're just calling the slots on the q-plane text edit save and run make sure we got no build issues here and We can open something and see there's our open dialogue and all of its glory And we could actually open something up if we really wanted to I'm not gonna mess around with that we can actually say new news it out and let's just say Let's come back in here. I want to actually jump in here. Where's our new code? Because I know somebody's gonna grab this and say oh it doesn't work and they didn't follow the entire series, so We could actually just say clear So we're gonna clear that out Now we have a semi-functional text editor so we can we can say no we can open things we can close things and You know, of course, we need a little bit more error handling and things like that We can add in some some just code here. So let me just grab something off-screen You know, for example, you can grab here you can copy and then you just go in here and you can paste Or you could say edit select all Cut you can actually paste it back in doesn't matter if you do it to the menu or through the toolbar They're the same slot and it's actually just pretty cool I hope you enjoyed this video. It's part of a larger project out of you to me called cute widgets for beginners with c++ This is a large course with 73 lectures and 17 hours of video footage This course covers everything from what is a widget all the way down to complete example applications Using the skills you've learned in this course Sorry, there's no QML in this course. This is strictly cute widgets I will make a QML course later on but this just focus on widgets from a beginner's perspective Even those as a beginner's course, you do need to have some fundamental information available You need to know c++ and the cute core libs I do have some courses available out on you to me cute core beginners intermediate advance It's not necessary you take these courses, but it is highly recommended and as always I'm available out on the void realms Facebook group along with 3,000 other programmers. See you there


Hello, this is a video about solving linear equations. The first thing we need to talk about is identifying an equation. An equation contains an equal sign while an algebraic expression does not. An example one will identify each of the following as either an expression or equation. Looking at part A, there is no equal sign, so that means we have an expression. In part B, 4x minus 13 equals 13. There is an equal sign. We do have an equation. In part C, once again we have an equal sign. That means that we have ourselves an equation. A few little things to note about solving linear equations. First off, when we solve linear equations, the goal is to find the solution, a value which makes the equation true. Next, if you see x equals 2 or 2 equals x, they both have the same meaning. Next, as we go through and solve equations, the purpose of an equation is that we have two sides that are equal to each other. So if you add or subtract something from one side of the equation, then you have to add it or subtract it from the other side. If you multiply or divide by something on one side of the equation, then it must be multiplied or divided by on the other side. Some steps to solving linear equations. Step one, we'll clear the fractions. Step two, we'll distribute and remove parentheses. Step three, we'll combine like terms on each side of the equation. Step four, we'll get the variable terms on one side of the equation and constant terms on the other. Step five, we'll simplify and solve. Step six, if you want, you can actually plug in the solutions and check your answer. Now one important thing to note about these steps is that steps one and two can often be interchanged. Some people like to distribute first and then clear the fractions. I am one of those people. Example two, let's solve some linear equations now. In part A, it give me y minus 7 equals negative 6y. You have y's on both sides of the equation, so your goal is to get the variable term on both on one side of the equation. So in this case I have a 1y and it's negative 6y. I'm just going to go ahead and subtract 1y from both sides of the equation, giving me negative 7 equals negative 7y. Your goal is to get y by itself, but you're multiplying by negative 7. You have to undo multiplication, meaning you need to divide both sides by a number. Since you're multiplying by negative 7, divide both sides by negative 7. This gives you 1 equals y, which is the same thing as saying y equals 1. Second equation, in part B you have 9x minus 15 equals 10x plus 3. Once again, variables on both sides of the equation have a 9x on the left, a 9x on the right. I will take away 9x from both sides. This gives me negative 15 equals x plus 3. You're getting x by itself, but there's a plus 3 attached to it. The only way to undo plus 3 is to minus 3 on both sides of the equation. This gives you negative 18 equals x, or x equals negative 18. In part C, we finally have a chance to distribute the 7 to the set of parentheses that follows, 7 times in parentheses x minus 1. This will give us 7x plus 8 equals 7 times x is 7x. 7 times negative 1 is minus 7. We have variable terms on both sides of the equation. There's a 7x on the left, a 7x on the right. The moment you go in and subtract 7x from both sides of the equation, you'll get the following. 8 equals negative 7. Now the variables canceled out in this case, leaving us with 8 equals negative 7, which is totally never true. When you get a statement that's never true, that means the equation actually has no solution. In part D, you have all these fractions with 3s in the denominators. Our goal here is to go through and multiply every single term, or fraction in this case, by 3. Since we're multiplying fractions together, some of you might like to see it written as 3 over 1. 3 times 2 is 6, 1 times 3 is 3, then you have x. Plus 3 times 6 is 18, 1 times 3 is 3, 3 times 4 is 12, and once again, 1 times 3 is 3. Don't forget the negative sign. I have to do a little bit of housekeeping here. 6 over 3 gives me 2x, 18 over 3 gives me 6 equals, 12 over 3 gives me 4, and that's negative. The goal is to get the x term by itself, but there's a plus 6 attached to it. Taking away 6 from both sides, that gives us 2x equals negative 10. You want to get x by itself, but you're multiplying by 2. Divide both sides by 2, you get x equals negative 5. In part E, I can now distribute 3 times x is 3x, 3 times negative 4 is negative 12. We get 3x minus 12 equals 3x minus 12. This seems a little bit weird, but the moment we take away 3x from both sides, we're actually left with negative 12 equals negative 12, which is always true. Once again, this is a special case because the variables are all canceled out, leaving you with negative 12 equals negative 12, but this time we get something that is always true. So the solution for this equation has to be all real numbers. Anything will work. In part F, you have fractions again, so I'm going to go through, since 7 is what's in the denominator, I will multiply through by 7, or 7 over 1. This will give me 7 times 6, which is 42, over 1 times 7, which is 7. Y equals 7 times negative 12, which is negative 84, over 1 times 1, which is 1. Simplifying gives me 6y equals negative 84. We want y by itself, but you're multiplying by 6. Divide both sides by 6 to get y equals negative 14. That's an introduction on how you solve linear equations. Thanks for watching.


Salvation is free, but the anointing will cost you everything. When you get saved, you lose your unsaved friends. When you become anointed, you lose your lukewarm friends. There is a price to pay for the anointing. All of us have the anointing within us, but not all of us walk in the anointing. But the anointing which ye have received of Him abideth in you. And ye need not that any man teach you, but as the same anointing teacheth you of all things and is truth and is no lie, and even as it hath taught you, ye shall abide in Him. That's 1 John 2 verse 27. Now, the anointing is God's power. We all carry God's power, but not all of us live in such a way that His power can flow through us to help those around us. If you desire God's power to move through you, then you must count the cost. The anointing oil, which was symbolic for God's empowering presence, was created from olive oil. The olives used for the oil had to be shaken from the trees and then crushed. So, two things had to happen before the oil or the anointing was produced. A shaking and a crushing.  God loves you too much to leave you in mediocrity. So, He'll shake up the systems upon which you rely. He'll shake the relationships that hold you back. He'll shake the circumstances that limit your potential in Him.  Expect that your plans will be disrupted. Expect that you'll find yourself in situations that require much faith. After all, if where you are doesn't require faith, you're not in the will of God. And after you are shaken from the familiar, you will be crushed, put under pressure to be processed. Here's the thing, pressure can only reveal what's already within you. It can't produce what's lacking. So, only the spirit filled produce power under pressure.  God must process you before He can use you. Now, sadly, because we live in the day of social media, anyone can create an online platform. And because just anyone can create an online platform, anyone can skip the process. But ministry is more than influence, it's service. We're ministers, not public figures, servants, not celebrities. We're called to preach God's word. Not our political preferences or personal opinions. Ministry is not necessarily a promotion. It's a death to self. Put your desires on the cross and leave them there. And the reward is beyond worth it. Our reward is that we will please the Lord. Our reward is knowing that Jesus will reap the reward of His suffering, lost souls.   Your prayers should be, Lord, empty me and spend my life for your glory. Count the cost, lay it down, let God's power flow through you. And remember that the anointing doesn't come through striving, it comes through surrender. I'm David D. Hernandez, and that is your Moment of Truth. For more free teachings like this, make sure you're signed up to my email list so that I can send you weekly emails with content that will help you to grow spiritually. Go to davidhernanisministries.com slash email.