So if you're still coming in and settling down, don't panic. I'm not starting the presentation yet. I just wanted to tell a little story to fill the time. So I mentioned a minute ago that we've got a short URL up there pointing to the slides. If you look very, very closely, you'll notice that the domain is G1A.io. I decided a couple of days ago that I needed my own personal URL shortener. Because don't we all? Of course we do. And building a URL shortener, it's a very technical task. And it's very difficult. It involves doing one lookup. And then you have to print two HTTP headers. Very difficult. So rather than doing all of that work, of course what I did was I stood up a Drupal 8 site and installed the redirect module. And it handled all of that stuff for me. It was great. I literally did that. Sorry? Let's see how the time to put it in. You didn't see how the time to put it in. Yeah, I think you should put it in and do time to first byte. Because if you have a URL shortener, of course, you should host it on Pantheon, where it's cached with a Pantheon global edge and has a very, very short time to first byte all around the globe. That wasn't an advertisement, I'm just saying. I guess it's still a sub-second. Now is that all the way through to Google or just the redirect? OK, you have some. If you're just coming in, I'll point out once again that there's a link to the slide deck at the lower left of the big screen. It'll be there for the first three slides. Then you're on your own. Or you can memorize it. It's A2, which is short for A squared, otherwise known as your automation. I am doing only one talk this time, and I'm really excited about that. Because at DrupalCon Vienna, I was doing two talks. And the original plan was I was going to do one talk that was my talk. And it's going to do another talk, which was Drush 9 with Mosh. And I was just going to stand there on the stage and smile while Mosh did this thing. And then suddenly we had this plan to do all of this stuff. And suddenly I had two primary presentations too. It was crazy. I could have be two. All right, everyone. It's about the top of the hour, so I'm going to get started. You have come to the right place if you're looking for automate your automation. Practical DevOps. You can find the slides once again at HTTPS, g1a.io, slash A2, all along at home. I'm Greg Anderson. I'm an open source contribution engineer at Pantheon. I also dabble in the back end and do various things like that. I am sometimes known in the community for being a contributor to a number of open source projects such as Robo, Drush, and various consolidation tools. A couple years ago, I was deep in the depths of automation. And I had this problem where sometimes I'd set something up that would be broken. I'd set the same thing up again. And so just in a moment of frustration, I tweeted out that my least favorite thing was spending hours fixing off-credential token problems so that automated deploys can work. But of course, my favorite thing is automated deploys. So we have to work our way through it. So last year, I gave a presentation on creating a smooth development workflow for PHP. And I talked about some of the services that you can use in order to make the stuff go better. But it takes time to set it up. And the observation I had is that all of these great automation tools have automation APIs. So why don't we automate the automation? Before I get started on that, I just wanted to give an example of one of the problem sets of automation that you can encounter in the industry. This is a real-world situation at Pantheon. We are watching a number of upstreams that contain cool and useful software like Drupal 8 and WordPress. And if a new tag appears, then we need to take that new code and get it into our repositories, which are slightly customized for our platform. And from there, it can go out and be distributed to all of the sites on the platform. Of course, we do this with automation. When a tag shows up, we have an automation script. And the key part of the concept of this automation script is when it does its work, it creates a pull request on the repository that's going to receive this new code. CircleCI does its job, sees the pull request, runs its automation, and then when things go right, a human can merge it into the branch and have the tag applied. In order to keep track of what's going on, the automation script will also occasionally post comments to the PR, giving instructions on how to use this thing before it goes live, and a little update when it makes the test site and things like that. So by watching the PR, you know what's going on with automation. You don't have anything else to do to find out what's going on. It's just all right there. So although you, personally, might not have to do this same exact task, we probably have other things that you'd like to automate. And this model of creating a pull request and throwing comments onto it is a good one to follow to do a number of things. So when you're starting off an automation, you go through a very simple process. You identify something to automate. You make it good because you don't want to automate a bad process. You want to automate a good process. So make sure before you start writing code that you know what a good process is. And then you can survey the available tools. You know, what can we do to make this thing happen? And then you automate and repeat. Keep going. Make things better and better as time goes along. Now if you've seen any of my talks recently, you've probably seen this XKCD cartoon because I lead with it just about all the time. This is a funny cartoon and it shows on one access how much time you can shave off of a task versus how often you have to do the task.  And why is this a funny cartoon?  And this is a funny joke because software engineers, they're kind of the opposite. We've got all these trees to chop down and you're like don't worry boss, I've got the sharpest axe on the block. And when I get to chop in those trees, they're all gonna come down really fast. But the point about this cartoon I want to make is although it's funny because of that, he only grants you a one to one ratio of cost savings to benefits and there are other benefits besides your simple time savings. For one thing, if you automate your task, you're not going to forget how to do it. And you're not going to make mistakes if you do it over and over again. And another really important aspect is that not all time is valued equally. If you have an hour of dead time at the end of a sprint, the value of that time is much different than the hour immediately after a client has called you up and said, oh my God, we have got a critical situation and we need to get another bill turned immediately. So if you've invested time in automating so that that emergency time goes smoothly, you've benefited greater than the one to one time that goes into it. And finally, the more you automate, it becomes possible to do more. So this table of how long it takes you to do a task, this table shifts as you put work into it. And so your efficiency goes up and up and you have to reevaluate what you're going to automate, where are your bottlenecks? So there are really a lot of benefits to continuously improving. So what can be automated? Anything you do, development tasks, testing, deployment, maintenance, tasks, updates, just anything that's dragging you down. And we can get really excited and say, I'm going to automate everything, just go for it. But then when we look at all of the things we do manually, it can be really discouraging. Like, oh my God, are we gonna automate all of this? Can just take a long time to make these scripts or write these programs. But if you don't do it, you incur a cost. There's an opportunity cost to not automating. Your repetitive tasks are prone to errors and mistakes. If someone leads the organization, knowledge about how to do this task might be lost. If the task is done manually, it might evolve over time and the documentation or playbook might just become out of date because the people who knew how to do it didn't take the time to update the documentation or the tools. And finally, when the situation gets worse and worse where you don't have time to automate because you're spending so much time doing things manually, that can lead to discouragement. So that's what we're going to talk about today is how to tackle this problem with some of the tools that are available for us in the community. Because we're really at an amazing point of software development right now where there are all of these services like GitHub that are just out there that we can utilize to make our lives more efficient. The first example I'm going to give is scripting with Composer. This Composer has a number of facilities for hooking into the Composer processes and adding additional custom scripts. Composer Create Project is something that many people in this room have probably done before. If you've ever used the Project Drupal Composer Drupal Project, the first step of starting off a Composer-based Drupal install is to make a clone of that project with Create Project and it gets pulled down. The project that you pull down is usually considered to be orphaned from the one you created it from. That project continues to evolve by its maintainer but a lot of times people don't track it. They expect that the things that are going to change in that template project should be in one of the dependencies of the project itself and not in the project that you clone. So usually it's sufficient to just run Composer Update to stay up to date once you've created your own copy. It is possible to track the parent if you want. You just have to find the URL of the original repository and add another remote and then you can pull from the upstream. Composer actually, if you save that you want to preserve the original VCS files, it'll have a remote already added to your local system called Composer and you could do a get remote rename from Composer to upstream or whatever name you wanted instead of applying a new one. After Composer completes an operation, it looks inside of your Composer JSON to see if you have any defined custom script actions that run and create project is no different. And a post create project script is a good way to help customize a project after it's been cloned and orphaned. The Drupal Composer Drupal project uses this facility in order to create some directories and set file permissions. And also the Drupal Composer Drupal scaffold project will download additional files so that it actually does that not as part of a project that is post update and post install. And we're going to do some exciting things with this hook later on in this presentation near the end. Just hold on for that. In addition to the hooks for scripts that will run after a standard Composer operation, you can also define your own scripts inside of the Composer JSON. And you just give it any old arbitrary name that you want and define either other Composer scripts actions to run or shell commands to execute. And in the projects that I make, I like to define a suite of standard actions so that if someone just downloads one of my projects, they know that they can just run Composer tests and it's going to run the full suite of tests. And usually I define different commands for the different types of tests that exist in my project. Like often there's linting, style checking, unit tests, maybe some functional tests if it's a project that uses BeHat. And on the right of the slide, you can see some quick examples of how you just have a JSON file that defines the script name and then contains the bash code to run. As I mentioned at the beginning of this presentation, we've got a lot of services available in our ecosphere and these services contain APIs that we can use to customize the service themselves. I'm going to go over a couple of the things that are available to create full requests, post comments and set up test credentials for surface CI and things of that nature. These are some of the more useful things that you'll do often when you're automating your automation. Of course, there are other APIs that you can follow techniques similar to these and customize other things. So creating a full request is a two step process. You do this manually all the time. The first step is you push a branch up to GitHub and then the second step is creating a PR which usually do that by visiting the GitHub website. But there are other choices. There's a handy tool called Hub that will let you create full requests from the command line. GitHub has a REST API that you can call directly using Guzzle or any other HTTP client on PHP. And finally, occasionally you will find custom libraries specifically geared for one service. And K&P Labs, GitHub API is an example of a very robust API that you can use to do anything that the GitHub API offers. So pushing a branch to GitHub. When we do this manually, usually we just name the origin, name the branch. If you're not familiar with the dash U flag that tells GitHub to remember the name of the remote that we're using. So subsequent calls to get push, go to that same remote again and you don't have to name it. But if you're using a continuous integration service, it's generally less convenient to use SSH authentication. You can, of course, add SSH keys to your CircleCI or TravisCI server, but it's way more convenient to just throw an OAuth authorization token into an environment variable. So if you see then we can replace the name of the remote with a full URL to the repository. You don't have to set the remote. You can just use it right on the command line. And in the case of GitHub, it's possible to embed an OAuth token right inside the URL. It's a little bit backwards. The token is the username and the password is a constant string xoauth basic. I don't know why they swapped that. But you follow that pattern and you will get a get push. It'll go straight through using OAuth and you don't have to worry about your CircleCI freezing up because it's asking you if you're allowed to connect to that IP address. You can fix that with a SSH config, but that's more setup to do. So I recommend using OAuth to push your branches. If you want to use the hub tool, which is useful both for manual tasks on the command line or inside of simple integrations, you can easily install it using brew or apt-get install.  And this command is operating contextually. It looks at what branch you're on in the current get repository based on the current working directory. Very convenient, very easy. But if you're doing CI operations, it's less convenient to install a tool. It's not so bad, but if you can avoid it, calling the API directly is another option. This little blob of code, I'm not going to go over line by line. I just want to point out that we're just doing a normal GuzzlePost request here and the important part for the GitHub API and most of the service APIs is you want to use JSON to send and receive data. Most of them expect this, some expect accept other data types, but I just try to be consistent and use that for content type application JSON and then the Guzzle parameters has this extra JSON element where the actual post data goes. And you also have to figure out how to authenticate some APIs. We'll put a token in the headers, others expect the token as a query parameter on the command line. And I showed this pattern even though we don't necessarily need it for GitHub because I'm going to show you a better way on the next slide, but all of the other services are very similar and if you don't have a cool API like K&P Labs GitHub API then following this pattern is a good way to add additional services to your automation. Oh yes, my little hacky workaround. There's something of a composer bug. Composer, when it's running your auto loader for a composer script, it only installs the auto loader sections for the classes. It doesn't install the auto loader for the files and the reason it just skips these critical things that should be auto loaded is that the makers of composer figured that they couldn't count on whether or not these files were able to be loaded more than once because sometimes PHP include files are not item potent. So they just sort of threw up their hands and said we're not fixing this. So in one of my sample programs, I work around this by requiring the files that are included in the auto loader by hand. This is kind of a fragile solution because if Guzzle changes what it's auto loading, then you have to update your program, which isn't great. I think the best workaround is to just avoid using Guzzle in composer scripts. Maybe make a standalone tool. You can exec the standalone tool and then you don't have to worry about this nonsense. The short URL up at the top links to the issue where the composer maintainers are discussing why this is this way. If you're interested, you can take a look at it. So if you want to create a pull request via the REST API, you just need to give it the proper URL, which in this case is repose polls with the name of the repository in the middle. Give it a title, something to put in the body. And if you're adding a pull request to a fork, you put the name of the fork repo with a colon followed by the branch name. If you're pushing right up to your main repository, you just leave that part off and just name the branch and off it goes. And base, of course, is the point that you forked from. Very often, master. If you're using the K&P Labs GitHub API, which I strongly recommend, it looks very similar. The parameters look very much like what goes into the HTTP post request, but then you just call the GitHub client with the appropriate API, in this case pull request, and we call the verb is create, give it the parameters and boom, K&P Labs does all of the work to make sure that that pull request gets created for you. Posting comments, as I showed in the first example, it's a very useful way to communicate with other people on your project. If you have a project where you are trying to create a flying machine and you have a pull request that's trying to get ready for the big demo, your colleagues might have some questions like are you sure this thing's going to fly and do we have anyone who's going to do the cliff demo? Cliff jump demo and we'll return to this concept later because the way you build confidence in these things is through testing and automation. Unfortunately, you cannot post comments with the hub tool. It's just missing that feature. There's a pull request there that if you feel like hub really should be able to post comments from the command line, maybe you can help out and convince the hub of maintainers to do some work there, maybe merge it. But you can add a comment from the REST API and this looks very much like the pull request creating sample that I showed you a minute ago that just does a post and as a body that says what you want to say on the command. There's also a K and T labs equivalent to this which again is just using the repo API comments create and the parameters are once again analogous to what parameters you would add in the actual API if you're posting with Guzzel. So the next thing I'm going to talk about is configuring test credentials. This is always really tedious when you're setting up automation yourself if you have two or three different systems and one's going to talk to another. You have to go migrating through the appropriate part of the user interface to set an environment variable or what have you. But we can actually do this directly from the command line using APIs that are provided by CircleCI and Travis. CircleCI has a number of command line tools that you can install but none of them have any facility for configuring environment variables. But fortunately Circle provides a REST API and just like the previous example I showed there's a lot of different ways that you can send these with Guzzel or the built-in HTTP, I mean sorry the built-in Curl that PHP provides but this example right here just shows how to do it directly with the curl command on the command line. The post parameters are name and value and in this case I want to make a environment variable called cred and I put the credential token into the value and then this will set the credential in CircleCI in any test that runs in Circle then we'll have that environment variable defined so you could use it in your tests to authenticate with your service. And you could wrap this in a script so you didn't have to flip through all of those pages every time you made it in a project. The Travis has a really excellent command line tool. You can install it with brew and APT get just like the hub command and it has a very simple command Travis end set and then you give it the name of the environment variable, the name of the token and it sets it. Really easy to do. Downside is of course you have to install one more tool. There is a REST API for Travis. I have not used it because it doesn't support OAuth and the authentication steps you have to go through are a little bit convoluted. Now certainly there are advantages to doing this but if you remember that matrix of how often you do a task versus how long you'll save I just have never gotten to the point of wanting to invest the time to go through this. So I really recommend that you just use the command line tool for now but if you're in that situation where you have to install the command line tool a lot of times in a lot of different places maybe it would be worthwhile to go through and do the multi step authentication handshake that Travis makes you do if you want to use the REST API. So the next section I want to talk a little bit about testing practices. I'm not going to be all meta about automating your automation we're also going to talk directly about just automation and just testing because as I mentioned at the beginning it's important that when we automate processes that we're automating good processes. So one of the really important processes to automate is a deployment. And when you deploy something you want to have a very high confidence that the deploy is going to go correctly. And the way that we are confident that the deploy is going to go correctly is that we have tests and the tests show us that the code is working correctly. The best thing you can do to have good tests is to write good to code. The way to write testable code is very simple it's a two step process. You pass a value to a function and the function returns a value. If the function has side effects then it gets a lot harder to test. So if you can just keep writing your tests like this then you'll find it's a lot easier. You can keep writing your code like this it's a lot easier to write your tests. So here's an example I wanted to show you in PHP unit. PHP unit has a feature where if you have a test here I have a test called testexample and it has an annotation called data provider. And when there's a data provider annotation the annotation itself has the name of another function. You can see up here we've defined the function and the data provider function does nothing other than return an array of arrays and each of these items represents one execution of your test. PHP unit is going to call testexample over and over again for each of the array items returned by the data provider. And the first element of the array is going to line up with the first parameter of your function and the second item of the array is going to be the second parameter and of course the third item in the array will go into the third parameter. So in this example you can see here our test is instantiating our model which is called example and the model takes the constructor which is just one value and then there's a simple method of this example called multiply which multiplies two numbers together. You can see that values go in, a value comes out and we assert that the value we expect is exactly what we intend the function to do. And if you can keep writing code like that such that it's very, very easy for you to write tests with data providers, then you are winning at testing because you know that your code is testable and the results are reliable and if you have discovered new permutations or code paths through your code that needs to be tested it's easy for you to add more tests just by adding more parameters with the appropriate expected results. It gets a little bit more complicated if your code will sometimes throw an exception but you can also catch those with PHP unit as well. Sometimes however, you can't write code that's perfectly testable. There may be side effects or there may be some large system that you can't easily write in your integration test environment. In those instances you have two choices. You can do functional testing or you can mock up some tests. Functional testing uses an entire working system to do a test. So like if you have a website you will run the website under a web server and you'll use curl or something equivalent to send it a web request and you'll check to see that that web request comes back correctly given all of the environment is set up exactly the way it should be in production and Behat is one tool that we often use to write these kinds of tests. It's usually very easy to write functional tests with a tool like Behat but the problem with functional testing is that it's sometimes harder to maintain. It can be a little fragile because you change the way the system runs and your expectations might be slightly different so false failures can come in and then you have to say oh there's a failure it's not really a failure we have to update the test fixtures so the false failure goes away and the functional testing also sometimes takes longer to run than other kinds of testing. Some people don't like functional testing as much and so they will sometimes attempt to use mocks to build a gaps and test code that is less than fully testable a mock replaces an actual system with an object that just provides a value that you set up in the fixture. It's useful for providing values and collecting results but like functional testing mocks can be kind of hard to maintain but they have the opposite problem. Sometimes your actual system that you've mocked away changes but your mock hasn't changed at all so your tests are still passing but the actual system doesn't work anymore so a false pass is really a much worse failure scenario than a false negative. So really the point I'm making with mocks is that you should avoid using them except in cases where you're just using them to provide values or collect results because any place where you've mocked away the code you should assume that that portion that line that you've mocked away is not tested. One of the examples I saw was someone wanted to get their test coverage up and they had a function that was really hard to test and it used four objects and all of them were hard to test and so they just mocked all four objects and the mocks just checked to see that the parameter values were what were in the code. So some people say this is double accounting or something like that but really all you're doing is you're testing to see that you implemented the code the way you implemented it which is a tautology and it doesn't really help you. So I'm kind of down on mocks. Use them where you have to but beware when you're doing that cliff jump demo if you're relying on the mocks to tell you whether your flying machine is gonna fly it's not a lot of reliability and we like that reliability because we can automate deployment if we have a high degree of confidence. So next I wanted to talk about leveraging Docker. Circle two and Travis both allow you to easily use Docker containers and if you haven't used Docker containers sometimes it seems a little intimidating it may seem like it's easier to just use the traditional testing system where you don't have to build a container and you can just use one that the testing provider's already given to you but I want to show you that with a little bit of automation it's really really simple to use a Docker container every bit as simple as using the built-in mechanism provided by the services. With automation we can automatically rebuild our Docker image whenever the source repository changes and even better than that we don't need to set this automation up it's already set up for us if we use certain services. So this slide shows you how to make a custom Docker image I'm just gonna show you this briefly in case you've never done it before a Docker image starts with a from line which says here is another Docker image that's going to be our base so we find something like Drupal Docker PHP 7.1 CLI and this has a lot of the prerequisites that you need for a Drupal site and you say okay I would like to add some other things on top of this standard image like Drush. All you need to do is add a sequence of run commands and each run command is just a sequence of shell scripts to install some things. There's a couple of declarations before that where you define the name of your working directory and you mount it in the container but basically you can see that the steps for setting up a Docker image are very similar to the tedious, slightly slow way of installing every time that you might do if you're using an old traditional Travis build or something of that nature. So I like to use a service called Quay and this screenshot here shows the process of defining a new Docker image in Quay and one of the options is to pull the Docker image from GitHub and the neat thing about it is that if you select this option that says link to a GitHub repository push what that means is anytime you push a new Docker file to your GitHub repository, Quay is gonna grab that repository, it's gonna build the whole image for you and it's gonna publish it. So then when it comes time for you to use the image in for example CircleCI 2.0, you can see in the default section there's a Docker element, it identifies an image. If we were using the Docker service for providing Docker containers, you would just give the last two items here, the organization and the name, but if you're using a different one like Quay, it just turns into a three part designator, very, very easy and when you do this Circle will download the whole container, the last one that was built and other than that it works just like the traditional method where you have to install everything every time except it's much, much faster and it's also more stable because if some of the dependencies that you're installing change, like if you install the latest version of something and a bug comes out in one of the tools that you install then all of your tests break immediately whereas if you've built a Docker container where you've cached all of the tools you need, then your tests are only at risk of breaking due to tool changes when you rebuild the container which you can do at times other than when you're making changes to your project. Finally, you'll notice at the end of this first line I have one point X highlighted in green. A lot of people just say that they want to pull from master so you always get the very, very latest version of your Docker image but I recommend following Assembler semantics for your Docker images as well and make a one dot X branch and a two dot X branch. So if you ever change the way your Docker container initializes the system in a way that's not compatible with your existing scripts, you can bump the major version up and then if you have multiple projects using the same image, the ones you haven't touched in a while can keep using the old image and the ones that you're updating to get the new functionality you can change to pull in two dot X and that'll make your life a lot more sane when you're managing your tests. Testing dependencies, it's really useful to be able to test all of your dependencies. We're getting into this era of composer now where sometimes programs work with more than one version of some of their dependencies. Now like Drupal for example used to ship with symphony two and then it recently upgraded to symphony three much to the dismay of money scripts and composer update processes as composer would get confused by all of the changes that happened all at once. But if you're writing some program that likes to work with multiple versions of Drupal like Rush for example, then sometimes your composer Jason might say that I work with symphony two and symphony three. If you're in a situation like this it's helpful to be able to do permutation testing on your dependencies to prove that the things that you claim you support you really do actually support. If it's not tested, how do you really know that it works? Another really interesting trick to do is when you have a lot of project dependencies where your constraints might take a range of different projects sometimes if you run your composer update command with a different version of PHP you might get different results. For example, if you run a composer update with PHP 7.1 some of the dependencies that you pull in might say that their minimum PHP version is 7.1 whereas if you run the same composer update on a different system using PHP 5.6 that version wouldn't be eligible and you'd get a different set of dependencies. So it's a really good idea inside of your composer JSON to define a configuration section. The configuration section has a lot of different purposes but one of the things you can put it into the platform section and inside of platform there's a place to declare your PHP version and what we're saying here is I want to pretend that I have PHP 5.633 no matter what version of PHP I'm actually running this under. And we'll see in a minute that on Travis we're gonna run our tests on a lot of different versions. So we want to make sure that this composer file has dependencies that are gonna work on all of them. So in order to make it easier to test for mutations of dependencies I wrote a simple project called composer test scenarios. For those of you who are familiar with testing in Drupal Core may be aware that recently Drupal Core had to do magic during composer update time to dynamically upgrade the PHP unit to version six because PHP unit five doesn't work with PHP 7.2 and they wanted to support PHP 7.2 but the downside here is that PHP unit six doesn't support PHP version five. So you can get into this bind where if you want to support both version five and version 7.2 of PHP then you can't use just one version of PHP unit. So Drupal's solution was to write a script that would dynamically alter the way the update was happening which I thought was a little complicated but I have a different tact and what I do instead is I commit multiple composer lock files to my project and each of these composer lock files has a different set of dependencies. I put these composer lock files into a directory called scenarios and then I can install the set of dependencies that I want to test very easily and I'll show you how this works. At composer update time we define another one of these really handy dandy post update commands and the post update command is going to run a number of create scenario commands and all create scenario does is it takes a number of parameters. The first one is the name of your scenario. I'm making a scenario called PHP unit five and then I list the dependencies I want in this composer lock file that are different from my standard composer JSON file. In this case I'm bumping us down to PHP unit five and we can also modify the platform PHP or other things like that. Take a look at the documentation for the project if you want to see how it runs. Using composer scenarios in your tests is very easy. What you see on the slide right now is a Travis test matrix and we're testing multiple times on PHP version 7.2, 7.1, 7.0 and 5.6. For PHP 7.1 and 7.0 we just run unmodified. This is going to use the composer JSON and composer lock at the root of the project. But for PHP 7.2 we're going to do highest lowest testing. I'm setting an environment variable here called dependencies and I'm setting it to highest. And if you look down at the last line where the install command is running composer scenario the last parameters dependencies when the composer scenario script sees the highest parameter it's going to do a composer update to bring all of your dependencies to the highest version. And this is useful so that you can catch breakage when your dependencies come up with new versions that may not be as backward compatible as semver claims they should be. Down at the bottom for the PHP unit 5.6 matrix I set the scenario to PHP unit five and dependencies to lowest and this has two effects. One is it's going to use the composer lock file that I defined previously on the previous slide here named PHP unit five and it's also going to run a composer update with prefer lowest so that we can test to see that in our composer JSON when we claim that we work with version 1.0 of some file that it really does work with 1.0. So for depending on a new feature or a bug fix in 1.0.1 the lowest test will fail and then we can modify our composer JSON so it's accurately describing the minimum versions that we need. You can also use composer scenarios and add a plot to passion just by running composer scenario on the command line you give it the name of the scenario that you want to run and then run your tests and away it goes when you're done you can just run composer install again and that will bring you back to the lock file that's in the root. The interesting thing about this is the way composer scenarios works is it's very compatible with all of the assumptions that composer already makes. So if you run a composer info command to see all of the dependencies and versions that are currently installed that will accurately reflect the last composer scenario that you selected on the command line. So take a look at that project. It's extremely useful if you get into the situation of wanting to test with both PHPnet5 and PHPnet6 or any of the other numerous ways that you might fall into this category. Deployment. I'm gonna show a little bit about how to do Travis release steps and self updates. GitHub has this really neat feature where you can attach files to releases and Travis has a really neat feature where you can add some statements to the end of your Travis YAML file to automatically use this API to attach build results from your test to the release. So we're gonna set this up so this only runs on tags and we'll update the name of the file that we provide. We're using the Travis command line tool. We run Travis set up releases. It prompts you for some credentials, ask you its file to upload and then it modifies your Travis YAML file. You can see here that it's added a section called deploy and it put in an API key which is an encrypted version of the credentials that you provided it. So it now has the access rights to do the upload to GitHub. But there are two lines here in red that are not included by the tool. So when you're doing this manual you have to add skip cleanup to true. That tells Travis to not delete your files before it uploads them and adding on tags true means that we're going to do this deployment whenever we're pushing a tag. If we don't have anything in the on section except for the default repo, it never pushes. So we need at least one rule. The most useful one is to add only the rule of tags true. Also it's very easy to write self updating bars if you use Robo. If you take a look at robo.li slash framework this is a simple wrapper around the symphony console tool and the sample code here in the lower right shows that if you tell Robo the name of your GitHub repository and organization it's going to add a self update command so that any time you've added the far to your GitHub releases, Robo is able to download it with the self update command. So all of the users of your tool will have an easy command line self update and you don't have to write that code. It's all packaged for you. Maintenance task. The world changes. It said that software rots. Sad but true. You would think that it never would. We're going to work on automating composer update with a perpetual motion machine. Nowadays I'm doing this with a really cool project called dependencies.io. Dependencies.io is an online service provider very similar to the other ones like Travis and Circle but this service rather than running tests it checks your composer lock file and if you have anything that's out of date it's going to automatically add a pull request to your project and it can show you one here on the screen that's already been merged that says aha in this particular project I've noticed that one of the dependencies you're using updated from version 2.4.0 to 2.4.1 and then when I saw that the tests were green I just merged it and now my dependencies in my composer lock file are all up to date. So I've now automated this. I didn't have to do it myself. I just clicked through on dependencies.io and boom. If you want to come back and take a look at this slide later I'm not currently using this slide but I used it in the past and what this little ball of bash script does is at the end of every test it checks to see if the only change that was made to the commit or to all of the commits in that pull request were to the composer lock file and nothing but the composer lock file then it automatically merges the pull requests using an authentication token that I applied to the project. So with dependencies.io and this little ball of test I wouldn't even have to go and look at GitHub and merge the pull requests. I would just know that my dependencies were up to date. This might be something good to do for a project that does not auto deploy itself like a library that other projects use to avoid any possible shenanigans. Keeping license info updated. In my talk last year I talked about a whole bunch of interesting services one of which I really liked it was called version I and version I would look at all of the licenses of all of your dependencies and it would make this nice little table that would tell you what the dependencies of all of your licenses were and then you could have a badge on your homepage so the users of your library would be confident that not only did you choose the MIT license but all of the dependencies you're using also had a compatible license. Unfortunately version I closed their doors they couldn't make their business model work. So now I have a new script called dependency licenses and all it does is it uses the composer command there's a built in composer command called composer licenses and the dependency licenses command runs this and appends the output of that command onto the end of your license file and while it's in there it also updates your copy right here if it's out of date and then from this I point the badge on my read me to the license file and then anyone who comes in and sees my project they can just click on that scroll to the bottom and then they will see all of my dependency licenses I've just saved them some time it's nifty pulling it all together so we've got a whole bunch of tools in our tool basket now what can we do with it well actually we can do something really really spiffy first I wanna point out that I have a new GitHub org there's only a few projects in it but my personal GitHub org was getting too full of projects that were created by automation or just scratch project that no one would ever want to see and it was hiding the interesting stuff so inside of g-1-a the org you'll see a project called starter and starter is a neat little project that will help you start a new standalone PHP library if you're writing a Drupal module and you wanna factor some of that code out into a standalone library so you can use it in other places it's a fair bit of work to move that code somewhere else and set up all of these services so what the starter project does is if you go to the effort to define and export a GitHub OAuth token, an AppVare OAuth token and a scrutinizer OAuth token these last two being optional I'll describe them in a minute and then you run composer create project on my starter as usual you give your project a new name and composer create project's gonna do its thing it's gonna download the project and then at the end it's gonna run a post create project script that's where my starter project comes in what does it do? It creates a GitHub repository it enables Travis testing and starts running your first test it enables AppVare testing which is a Windows units testing program it also enables static analysis on the scrutinizer tool and it sets up coveralls, packages and dependencies.io although unfortunately those projects don't have an API to spin them up so you actually have to go and click through to turn them on but they're all set up all you have to do is click you don't have to write your YAML configuration files it also throws a little command line tool with the far builder so if you're building a library and you want to be able to ad hoc use your APIs on the command line and not just test it with your PHP unit tests it's really easy for you to do that I'll show you how that works in a minute and it's hooked into those things I showed you before where it's using Robo so it has a self update command should you decide you want to publish this command line tool and it'll auto deploy the far every time you tag a release assuming you follow the setup instructions speaking of which it makes a readme file for you that has instructions in your new projects readme about the additional steps you should take to finish this setup it has github contributing and issue templates and it's optimized your composer.json it has a data driven unit test example that looks like the previous slide where I showed you how to do good unit tests with data driven data providers and it has a sample test matrix set up to test PHP versions 5.6 through 7.2 it is using the composer scenarios project so it uses PHP 5 for the 5.6 tests and PHP unit 6 for the 7.2 tests it has built-in PSR2 and linting functions it lists the dependency license information automatically updates your copy right here and finally it has a release script where all you have to do is change the version number in a file name version and run composer release and it'll do the tag which ends up in your command line tool being pushed up to github so this slide here shows you the beginning of the readme that's created by this little project and you can see there's a little table there if you defined all of the OAuth tokens that were recommended you'll see that your github repository was configured your Travis testing was configured your AppVare tester was configured your static analysis was configured but then the services below that have no APIs have handy dandy links you just click on that table right in your readme it'll bring you right to the right page in the authentication API for the service you want to configure and you can just click to turn on your new project and get the automation going just like that if you did not provide an authentication token for AppVare or scrutinizer then the Windows testing and static analysis lines won't say done they'll have a link that you can click on to go and just click, click and start your static analysis running and start your Windows testing running the simple command line tool uses Robo and Robo has a very simple expressive way of creating command lines all you do is write simple PHP code you have a normal function with a normal name it takes regular PHP parameters which are the command arguments the command name is declared by an annotation at command in your PHP doc block comment and the first few lines of your doc block comment are the help text this particular example just creates a new example model and it runs the multiply function and prints out the result easy as that so you can see if you're using the starter project to build a PHP library it's easy to just generate the models that you need and you know, run it from the command line finally, I also want to say that if you're not making a PHP library but you want to make an entire Drupal site with the hat tests there is something called the terminus build tools plugin this slide has a link to the documentation this will make a Drupal site for you on Pantheon and set up the hat tests with a free Pantheon for agencies account you can run these tests and you don't have to pay for Pantheon services and the sites that are created with this automation tool can easily be exported to be hosted on any platform that you want to run it you just define your GitHub OF token your Circle OF token and you run one terminus build project create command you'll end up with a simple readme which has a link to your Circle of tests Circle will create a new multi-dev on Pantheon for every pull or twap test run the B-hat tests and when you merge the GitHub PR it will make those code changes end up in the dev environment on Pantheon so this project was sort of the pre-generator for your automation and everything that I've shown here today are the techniques that went into this tool and the starter sample is another example of how we can utilize these techniques in a similar way to do other sorts of projects and speaking of which I forgot to mention if you don't like my starter because it doesn't do quite the right thing just use the GitHub clone repository feature and change it however you want the part that spins up the services is only like 500 lines of sample code it's easy for you to customize to make it do something else so you can easily automate whatever sort of automation you need to write not necessarily what I wrote so with that this session is finished but we're not finished because there's always more things to automate but I hope that by automating your automation it will make it easier for you to do exactly that thanks for coming today like to remind you that we have contribution sprints on Friday there's a mentored core sprint first time sprinters workshop and a general sprint check out the Drupal sprint hashtag if you wanted to know more and finally please remember to visit the evaluation pages for all of the sessions that you attend and fill out some surveys so we know what you thought thanks very much for coming to DrupalCon and I hope you have a great time what was that? what was your short URL again? oh let's go to the beginning it's G1A.io yeah A squared there it is and I tweeted that out too so if you just look at my Twitter feed you should see it right at the bottom appreciate it you're welcome I hope it was suitably named thank you one question I have github.poor github.com ha, ha, ha, it's alright so many domains I would like typing curiously I got the domain wrong it's a github somewhere yeah I made some last minute changes to squeeze some extra things in so clearly not every URL was sanity checked but I can change it after the battle people go back and see it I use it a lot for like circle I don't use it very much just like on my local machine and I love it for circle because like I said I just set it up on play and if I want to make a change I just push it up to github and I run it on circle and by the moon I love it right it's faster and more convenient what about your local what do you mean the difference is there well yeah you can try Lando I'll just answer your direct question about what I do and many years ago not even that many I used to do all of the VM stuff and I didn't do Docker because back then if you wanted to do Docker you would do Docker up for math on top of the VM and it would load on top of the load and that's no longer the case it's just load it's just load instead of load on top of the load but a while ago I gave up all of my VMs because if I'm not running lots of VMs then my disk does not fall and my laptop isn't burning my lap and my RAM isn't full and other than those limitations in the past I've done workloads that use VMs and I was really happy with it and I had a laptop with a terabyte of disk and that was a lot of disk and it was always full and I was always managing which VM am I going to throw away to get rid of another 100 megabytes so that I can get another VM out of my terabyte drive and I've been really happy with just using built-in tool here and speaking stuff in the cloud is much possible but I know a lot of people like you and folks like that


Mr. Gamer, thanks for the host man. Appreciate it. Dude. I'm fighting the elder dragon Think that's how you pronounce his name Something like that Welcome all the mystic gamer viewers. Welcome guys The first elder dragon I should say I am filling up on inventory Yeah, the fan command is not Not enough a minute yet. There's Tim more slicing ammo. I gotta get it off of a Do I not have any That was my last one. Okay Ready set go. I lost them.  Oh, I had a lot of help. That's for sure Oh Give me all the shinies you There's no more. Yeah, I doubled up on the shield too with us. I got two of them. I stacked the twice Wonderful that clears some things up. Yeah, are you a guy or what? No, I'm a woman Until we came to the new world. How could we know? With a pompadour You're looking for a feast is that pompadour a man mess of the local ecosystem in the process Now that the problem child's been put to bed the other elder dragon should revert to their usual behavior I have to have the pompadour man. I It just calls me every time I do character creation. I have to put pompadour I know what I do ready to go on the ps4. I had a male with a pompadour on this one I have a female with pompadour Talk about what this area end up becoming such a hot bed of energy in the first place enough energy to lure in a menace like that And convince it to switch habitats doesn't just naturally happen. It's her fault. She did it. Hmm. You did it One she'll stand One she'll fall You can now upgrade your armor even further Zambi monster Okay This is important information Please listen closely as we explain to you what we're going to do next. This is very very Important important. Yes. We're gonna do the thing that I just said so please listen closely Thank you dismissed Any word on G rank? I don't know you're talking Investigate the awoken elder dragons sub-ghosts Hornet or okay or pace.  Okay, I Don't know how to do this so If I don't see you a guild card, don't I mean, I don't usually I know how to do it, but I don't usually do it So if I don't see your guild card, don't take it personal. I just don't even think about Think about it. Keep it together. Okay? fatty tomato Okay Searching for us for tracks wild spire waste for tracks speak to the third fleet master third fleet master. I Don't know where he is All I see is these symbols on the Thing I'm at the same point as you are. Oh cool millenary carb This guy's giving me some deliveries boy. I might actually have some of these already Four forgotten fossils All right, let me check to see if I have some of these already. Oh That guy. Okay, the research map. Okay. He's an eat. I mean a research base. I got it. He's in the other spot Got it. I've been back there in a while No, can't can't do any of them. Oh, I need to do Bounties I got three two slots honey and I'm about to kill one anyway All right, so I'm searching for all kinds of tracks now, I guess I'll just start with the ancient forest So it looks like we got to do some expeditions cutscene hunting chat How goes the hunting day? We're making good progress. We just beat our first elder dragon. I think I did this I feel like I don't need all these There's nice have flash spots, but I'm gonna use them and ill herbs. I'm not using them I'm not using them. These are nice things to have. I'm just not using them. I'm gonna keep life powder on me for now I think as I get better, I'll use these things more often though My inventory is filling up too much So I got raw meat. I need to cook that I do that here Because I'm out of rations. So I got to like cook stuff So percentage wise how how far am I to the story? Please tell me I'm at least over 50 percent through the story in your chat Because I'm I'm eager to get past the story so I can start playing the game It's true I'm talking about the story not not not the game the game is a thousand plus hour game. I realized that Um burnt it God dang it. I know right when we could compete this fast real life If it was a really hot fire, I would just instantly burn it It'd be seared It's like raw in the middle and like freaking charred on the outside so I've got Nine of them. I just want to see if that worked. I know I just say I'm full You have eaten too much Okay cutscene hunting chat. Let's go Where are we gonna look? I'm just gonna Chart to these bones. I don't think you accepted my friend invite Talk about Talk about esteem Oh, I don't accept anybody's man. I'm lazy. Hold on. I'm really on this thing Don't feel bad. There's a lot of people neglected here I don't know who this is. Wait. No cancel. Okay Like a bunch of numbers Who else do I know here? I don't know. I don't know these people There leave me alone There he is Leave me alone Yeah, I just don't I never look at it, dude because I really log in to steam. I just stay invisible All the time I'm just going for these bones now Because I need a lot of quality bones for my oh god. Who is this studio? Oh boy, what have I done? That's gonna interrupt me every time now Dude, I got the session in a title So if you guys want to join with me, you can just do that. That's what I've been doing to people I hope that session is still legit Look, Paris, I'm giving that Uh, you can't join me yet. I got I got to find the cutscene I have to find the cutscene and then shoot a flare And then you'll be able to join me if I'm not mistaken ancient bone Quality bone I only need 12 more quality bones All right, I'll shoot it now. I mean If it'll let me Man, it's already Old wind swept gashes. I think I need to look at that. Oh, there they are No, y'all ain't Let's track it I was looking for more bones and more blue tracks chat bones Take me to your leader. Wait. This is the ones I just got.  All right. I'm looking for more of blue footprints um Bones over here. I just run over I don't know So they're pretty much scattered everywhere so just gonna Traverse the lands That's the only sticker I have is me crying On the bar. I mean Let's track it. I understand like you don't lose stamina until you're in battle. It's like weird Large doodles These don't have anything to do with the quests But I will take them nonetheless So you do lose stamina outside of battle. The bars just don't show why you're okay Definitely bones here. I think All right, I'm gonna have to look at the map again. See where I'm at Uh, we're having that checked over here Any hints chat? Should I be looking somewhere specific? All these years. I've been jumping off of these cliffs. No, you need to do that You found one in the northwest area Oh, you guys can find them too I thought I just like I can just find them You're on the same quest. Oh, well, I learned from ps4. I don't know if this changes But we have different like instances So you won't like I'll see footprints and you won't because we were doing footprints quest together on ps4 And like I'd be like there's footprints and like I don't see footprints And then they go somewhere and see footprints and I would like I don't see them So it's like they're not synced Up here we go It is lame Well test fainted Good thing it is an expedition Um Scout flies were on it what will happen There we go Blue footprints There we go Get off the rathian footprints So go this way Well, it definitely came up this way, but they were old footprints. So Checked out here Now I'll get these bones while I'm down here Leave me alone. Just gonna take your bones. Don't bother me. It's okay It's safe. You don't need to you don't need to panic. You don't need to panic. I'm good. You're good. We're all good Okay, what's why is everybody dying are you guys encountering big nasties? You can't fail expeditions on things, right? Just So I'm clear. All right. This is the starter area or one of the starter areas Thing is that gets me is that they don't always light up Like I'm looking for blue and they don't light up until you actually get close to them. All right. Well, let's go this way


Welcome folks, we have the Dow Industrial trading up 291, Nasdaq is up 6, S&P is up 15. Gold contract up $13, 80 cents, trading at 22.13 an ounce. We have Silver up 12 cents, $24.74 an ounce, Light Sweet Crude flat, $81.54 a barrel, notes and bonds, a 10 year note, up 7.6, trading 1.10.28, 30 year up 18 ticks at 1.20.06 and $1.50, up 48 ticks trading 1.04, excuse me, 3.46, Euro 1.08, yen 1.51, British pound 1.26 to 1 US dollar. Let's get over and take a look at the S&Ps, we're on Wednesday of a holiday week folks, bottom line. You came down yesterday, you know you had light volume on the way down, we're higher with light volume, bottom line, we're going to be up at these levels man, that's the bottom line, that's my take on this thing. So what you have right now, you got a sideways move, you're up a buck and a half, you're at 5.20 inside the spy, we take a look at the NDX100, and what you're going to have here when we come back, okay, from vacation, three day weekend around the Easter, is that what you're going to have is that you're going to have a winter dressing. So what you get out here in the queues today is that you're coming down with 26 million and that is the contraction of all, and once again man, you're going to get to 78 million, no, 48 million, 43 million, so 26 to 43, well we'll end up doing like 36 out here today. Gold, gold contract continues to one higher price, you get two separate ABC structures inside the gold market folks, bottom line is that right now you're trading at this 2212 level, you got 175,000 contracts out here today which is good contract volume, the gold contract is in a confirmed ABC structure up to 2550, and then we get into the dollar, it's amazing that the market and the commodities are up when the dollar is hanging tough up here, because the dollar had a big counter trend bounce last week, and you're near the top of the range man, the bottom line is that you're in the higher range up for 52 ticks right now, you're trading out the 104349, and then if we go over to the bond market and take a look at bonds, the 10 and the 30, let's see what the volume is here, well it's coming up a little, 1.2 million thus far on the 10, we really need like 2.2, we need another million contracts, what is happening right now though is that it went to the swing point from two days ago, and it does have higher volume, stay right there folks, come right back.


Here's some of the foods that we can start eating. Eat a rainbow. It's a great thing. Everybody is talking about it now, but it just is the best way to try doing this. Within a week, we should be trying to make sure that we're eating all the different colors of the rainbow. And choosing different vegetables, having a wide variety is beneficial too. Sometimes clients say to me, oh, but how am I going to eat a full rainbow of colors in one day? And I say to them, you know what? There's two things here. Number one, it doesn't have to be in one day over a few days. If you have a good variety of types and colors over three or four days, that's brilliant. Also, another thing that I suggest to my clients is what I called a three by three rule. So if you can get three veg in with your breakfast, three with your lunch and three with your dinner, that's nine a day. That's brilliant, guys. So you could be having scrambled eggs in the morning with some sauteed up asparagus and mushrooms and red peppers. Already got three. Add in some lovely herbs. I love to put in a bit of thyme in there or a bit of rosemary, which has antioxidant properties. And have that with your scrambled eggs on some delicious rye bread. Add in a bit of smoked salmon if you want. Delicious. Then for lunch, I mean, if you have a salad or a soup for lunch, you could easily get four or five vegetables in there with your onions and your garlic for your soups and then picking a few different vegetables and some nice organic stock and make a delicious soup. Then going forward to dinnertime and choosing your healthy protein source, which could be some meat or fish or eggs or some beans or lentils or chickpeas and having a good quality carbohydrate. So some quinoa or brown rice and then plenty of vegetables, even if you just put three in, but make up a big stir-fry or roast some vegetables with some turmeric and olive oil and have a delicious warming dinner. I'm starving now after that. So here we go. The vitamin A rich foods would be in dark orange and dark green foods. So things like bottom of squash, which is delicious roasted or in soups, sweet potato, you can make gorgeous sweet potato fries, mangoes and spinach and a smoothie, broccoli and kale. Kale is gorgeous if you just saute some, a little bit of butter with some garlic and some kale and it's really, really tasty. Vitamin C comes from red peppers, kale, strawberries, broccoli, cabbage, asparagus, kiwi and citrus fruits. Vitamin E rich foods then from sunflower seeds, almonds, avocados and cold pressed plant oils. So with plant oils, we need to be careful not to be overheating them or heating them to high temperatures because it can oxidize the fat content of the oil and can be damaging within our bodies. So when we want to choose oils, it's better to drizzle your cold pressed plant oils over your salads and things rather than heating them to high temperatures for stir-fries. Use coconut oil instead for that. So in order to increase all these varieties of vitamins and minerals in the body, we want to be eating loads of these foods, different varieties, trying to get your three by three in nine a day and these vitamins A, C and E are what we call antioxidants. So they have really, really strong powerful capabilities of reducing inflammation in the body and helping the body as anti-inflammatory.


While bad nutrition advice from federal authorities has been chalked up to corporate influence, bad advice from the medical profession more likely arises out of ignorance. What is the status of nutrition education in medical schools? Back in 1980, less than a quarter of medical schools required a single course on nutrition. By 1981, though, we were up to 32% than 37%, then slipping to 35% and back down to 27% by 1984. That was a quarter century ago, though, back in the dark ages. What about 20 years later in 2004? In a survey sent to all U.S. medical schools, we went from 27% in 1984 all the way up to 30%. There was more nutrition education in 1982. On average, out of thousands of hours of preclinical instruction, doctors get about 24 hours of nutrition, with most only getting between 11 to 20. Last year we got an update. Nutrition education in U.S. medical schools latest update of a national survey. In 2004, we were at 30% and now we're at 25%, nearly the lowest ever recorded. Only a quarter of medical schools require a single course on nutrition. They conclude in their 2010 paper, the teaching of nutrition in U.S. medical schools still appears to be in a precarious position lacking a firm secure place in the medical curriculum of most medical schools. They advocate for, at a minimum, the 25 hours of nutrition education needed to properly train physicians. Currently, only a small fraction reach even that trifling standard, and even if they did, that means you could learn everything a properly trained doctor knows about nutrition in one long weekend.


What's going on everyone Sam here with late in sports cards we're up in one box of 22 top star wars chrome galaxy hobby for Kurt S. So good luck here. Kurt. Let's do a buddy that nice and cleaned off Yeah, there you go, honestly What's that? What's a Sean impression?  I Can't do a Sean voice My favorite like Sean is him is when he goes seriously seriously Come on man, I've had it I've had it Had it makes a window Refractor is Lord Vader ready to ship base and base base. There's a Refractor is galaxies greatest scoundrels nice one there.  That's cool, I do that boss on the refractor I mean you wouldn't I don't think you'd get it, but Let me get four times Be a horse or having fun saying the bad-batch characters Nate like so you haven't seen that right? Vintage Star Wars It is a mega place. Yeah, so refractor of the Skywalker legacy God so like The one main characters Omega the way she says like Hunter attack it sounds like I think Like it doesn't sound like how it's fell Because we were having fun fun and that's in quotation marks. There's a Chewbacca's anguish refractor and Lando Calrissian so we kept the same the bad-batch names like that Let's see a sketch out of this one too Sketch card variation Boba Fett There's refractor of life on Tatooine. This is a cool. I like this card too. This one's nice with the speeder in the back The ship or whatever it is airship We've got Star Wars or no the Skywalker's nice one there on the refractor No, there's one that's actually called it's called Star Wars Got baseball Every every break a night breaking is a slow crawl to madness It is a slow to set into into the the unknown. It's very true. There's base card sketch variation. We've got Attack on a hawk on the refractor We can be in force as well as I tell Thursday.  There's a refractor of aboard the bridge Try reading that one upside down once Because I didn't know what it was and I'm like a broad The broad the budge. I was like what and I was like, I'll board She's Star Wars the Jedi Knight nice one there Jedi out jet. Yeah Jedi outcast Jedi Knight to gameplay galaxy Refractor is a dark turn for Anakin Skywalker another nice card in that set Swinging bringing the the the mash pinging Creatures of the cantina base and base We got a look up really good Squidward moments. I'm gonna do that after this next break. Everybody sketch Oh no Thought it was a sketch That is a dark turn for Anakin Skywalker waved in 99 nice one there congrats on that that one's sick That is vintage. I thought I saw that and I thought that was a sketch that is vintage Star Wars or is that salacious B Chrome? What that's a lacious B Chrome No That's Sean Sean is salacious B. No, this is something different. I think it's the same species Got an auto coming up here. That is ooh, that's nasty Darth Vader versus Obi-Wan Kenobi on the mojo to 50 nice one there Kirk congrats buddy.  That's fireman Auto is gonna be fixer. That is Skyler Bible. I thought it was an atomic at first nice one there And Was that entered Darth Vader? There's Toscan Raider sketch variation base card Refractor is wedge until he's in battle base ho dameron For us, yeah, I think you know might need to stay for the best Squidward moments Everyone's an idiot except for me Oh There's a base card sketch variation got a grito nice one there on the refractors one of my I just love Why he's cool You're not cool base that'll do it for your break there Kirk congrats on the nasty Vader versus what was that Obi-Wan, right? Yeah, we're still gonna be that one's awesome. We'll get that right out to you, buddy


Good evening, my name is Nanda Gopal, I am working as a Assum Provisor in the department of automobile engineering at the Institute of Engineering and Technology Technical. I have attended three NPTEL courses till now. Today I have attended Manufacturing and Extension Technology 2. It was very nice when I am attending in the online examination. It was wonderful and all the questions were answered to my expectations. It was very nice, so that's all.


Hello, hey, okay. Everybody's got an Android or an iOS phone. Do you want to take it out? No, or ignore me. It's fun. You'll see why I won't have wasted my whole day Promise If you go to there No, I Don't think that title is relevant anymore. Oh, it is cool Does everyone manage to get there? Does anyone manage to get there on that page? There should be a HTML5 video player and if you're on Android or iOS if you just tap it It should start playing video If it doesn't work, it's gonna be really funny, but I can't fix it because it's over there at Amsterdam here So I don't know if anyone's tried to view the the stream from the conference here But the stream today is an RTSP stream, which is UDP based Almost every player is a flash player and because you're on a mobile phone and Adobe don't package flash You don't get to watch it On that page we have a HTTP live stream, which is an Apple based standard But it is a draft RFC It's real open technology that you can go and look at develop with and play with and it works And it's integrated into iOS and Android But not into any of the mainstream web browsers on a desktop. So there's a 50-50 there But if you have VLC you can pull it up and you can pull this down And then we've got nice open live streaming that dun dun dun uses TCP There's big benefits to using TCP. We all get to go woo We don't have to reinvent the wheel rebuild our transmission layer Rebuild all you know decades of protocol that you have to do with UTP streams We've got a nice smooth TCP stream that should work and look really cool back to that I Proposed coming along doing experimental streaming back in May my boss okayed it last month I chatted to some people and they went. Yeah, it's really cool. And then I had dead silence On Monday, I thought well, maybe I should probably find someone to speak to I emailed the guys I've been talking to but they didn't get back to me for a while and I jumped in IRC and IRC someone went. Oh Why would you duplicate that effort?   You know that was gonna work well and just wasted no power and bandwidth. What's the purpose of you? And we have a culture where reinvent reinventing the wheel is normally not a good thing It normally means you don't understand the problems you're coming up against You don't know why things are done a certain way and genuinely reinventing the wheel most of the time maybe 90% of time is a complete and utter waste but Sometimes we need to start from the bottom and figure out why things work and go through that whole process And we'll come out with something that's a lot better That's why I did that The other thing I did was I made Club Matty And when I told people I made Club Matty yesterday they go Why you doing that? You can buy it There's loads of it. Why would you ever make it? You can just buy it You can buy Club Matty from Club Matty UK 20 bottles is 35 quid with shipping I sell up for two pounds of bottle in my office to feed the junkies Now that's that's not a good use of time and energy because it costs maybe a pound to make 10 litres of it And it's pretty good And to show you how good it is anyone who wants could come and try some adventure Matty 0.5 which is a CC0 license recipe We've got concentrate that we mix with sparkling water so the carbonation is off But if you want to come see me after this or when people are done talking and you go all the way around We'll be filling up bottles in that corner. That's me


When I joined the Army, I wondered, man, I don't even know if I'll make it through basic training. And then went to Airborne School, I thought, man, I don't know if I'll ever jump out of a plane. Went to EOD school, thought, I don't know if I ever wanted to get closer to that sort of explosive stuff. But you learn a lot about yourself throughout the Army. And you realize that things come and go, those fears come and go, but it's your personal choice to say, yeah, I can do this. And you keep proving that to yourself. The best piece of advice I've ever received. And wow, don't limit yourself. Prove yourself wrong. Set goals for yourself that you might think are unattainable. And drown out those voices that people say, hey, I don't know if you could ever do this. Allow that to not crush you, but to lift you up and say, hey, you know, one day I'll be thankful for those people that doubted me. Or I'll be thankful for doubting myself because looking back now, you can see how far you come and you can appreciate those around you that help drive you.


Everybody forced here ripping 2021 select football hobby six box half case number two random T or pick your team style Sorry pick your team style Aaron F Titans Adam P Broncos Ben P. Bills Brian K. Vikings Chiharu Rams Christopher I with the Chiefs Corey W. Panthers Dan M Cardinals and the Chargers David G. Niners David S. Washington David N with the Bucks Eric W. Bengals Hilton Patriots Gerrard S. Falcons Jeff G Eagles Jeffrey H Jets And the Steelers Jim A has the Browns Joe H Ravens Joe C Giants John P bears Where was I John C has the Raiders Kai H Lyons Nicholas U Saints Paul and Cowboys Ryan S. Seahawk Sean M Jags Shad G Packers Simon L. Colts Warren C. Dolphins and Yasuto with the Texans. Good luck everybody. Thank you very much for joining today Let's get rolling here. We're gonna go a little quicker on this half case So we'll make up some time that first half case is pretty nuts. What's up, Bob? But you got both part. Yeah, I mean, it's definitely a good duo. I Mean everybody has Jonathan Taylor like what the top three running backs at least if not number one, you know, so Now what's going on tiktok? Thank you guys for watching God's we got something like a premier level ed read tri-color a Thailand Wallace die-cut tie-dye rookie auto. That is an interesting-looking die-cut Five a 25 for the Ravens. I don't know how to hold it. I Guess like that Nick Chopper me level the tri-color ed read was 73 of 199 We appreciate the follows the likes mills concourse got silver phenomenon down and cook viking silver allinger Colts. I Do not know the lines to cost off the top of my head Silver snapshots Michael Vicks silver swift field level for the Lions read Kitty and Palmer we got premier level purple Shannon sharp for the Broncos 31 of 75 want to say they were 99 or 149 whichever one concourse silver Jets Michael Carter for the half case fields concourse Got sensations Metcalf Silver Club level Rogers rookie Packers Justin Fields on the or not just feel Justin Herbert one of the Justin's field level chargers Collins Bashum Amon Ross St. Brown Lions blue premier level color match Lions 110 of 149 silver concourse Sanders for the Eagles Looks like he avoided major injury at least Yes, thanks for the follow will be live all day today Make sure you click the link in the bio and subscribe to the YouTube channel silver premier level Marshall for the Panthers sermon We've got eagles Kenneth Gainwell rookie Jersey auto 30 of 75 you birds nice hit there blue Richard Felton Come on guys. What do you say we hit a gold here? Gold this half case concourse tri-color Carson Wentz Colts 142 of 249 silver Packers Devonta Adams in premier level Darnold Stevenson Club level Debo concourse red Niners 40 of 99 nice Debo Club level silver MG 3 for the Broncos Anthony Schwartz Appreciate the likes appreciate the follows Vonte Smith concourse trailance phenomenon rookie insert for the Niners silver Elijah more Jets rookie roll the Pearl Was a basketball player 72 of 99 patch guard Niners Debo Samuel What nice Debo is for you Niners Silver Nico Collins nasty Nico as Sam calls him Club level silver and I remember guys Almanac is going up today five first five cases of Almanac will be listed Sometime this afternoon early this afternoon I would think and then we'll think we'll look the other five cases tomorrow Those will break Saturday and Sunday ultra high-end Almanac multi-sport 2500 a spot We're doing half cases all day. We got random styles at night. It's all select football until midnight tonight midnight eastern Silver sensations Josh Allen bills silver concourse Parsons Cowboys rookie and then probably more select with personals later too All selected. Oh, there's a gold. What did I say? What did I say Jake? Is that purple? It looks purple to me What is this? Is the right way? Nope. That's upside down gold non rookie looks like a club level Purple I would think ravens or vikings ice marlin humphrey ravens gold club level Beautiful hit 10 out of 10 on the bookend Silver club level bears Justin Fields very nice And our Lawrence premier level rookie Thank you. Yeah Silver selections Jalen waddle dolphins silver Schwartz field level grounds Aaron Rodgers Uh, yeah, uh, yeah, Callan. Yes. Yes to answer your question Hoco Monde club level blue field level Amon Ross ain't brown It's like a print line going across where his thigh is 17 of 49 very nice card for the lions either way Silver concourse juju for the Steelers Elijah Moore Beautiful almond rocks who blues in the first two boxes for the lions for almond raw The chubb silver club level Josh Palmer chargers rookie Chandler Jones Why they all upside down the other way maroon concourse Zeke for the cowboys 84 of 149 Silver concourse slater chargers rookie set Williams Now you guys still have teams available in half cases today. There's a concourse Lawrence Williams silver field level Corey Davis for the uh jets Kelly There's a parson's concourse blue concourse rookie packers kylan hill Uh 112 of 199 in a devon white six of 49 bucks auto the light blue bucks auto devon white Derek gore These boxes are 1500 Uh late sports cards dot com link is in the bio Yeah, brown patrick my home silver concourse Trevor Lawrence Jags rookie To do at well mac jones concourse. We've got michael pittman jr. 71 and 99 jersey card colts Silver club level bears donal mooney JC horn I would imagine since last year's box prices are up around like 2k ish right now for hobby boxes I imagine these will go up especially considering xrc's are live The redemptions there's no redemptions redemptions for xrc's expire So the 2020 xrc redemptions expire at the end of this month Blue amari rogers packers club level rookie 40 of 99 silver concourse brady for the bucks jalen hurts Bateman gough rothis burger almond ross st. Brown lions having a hell of a break dude 39 and 75 rookie jersey auto now Detroit that's chi h Doing well today. All right. Let's keep it rolling. Let's keep it rolling Before we do Let me see what we're looking like on spots y'all So, yeah, number five has dolphins and vikings Number six, you're looking at jags raiders dolphins vikings And then again number five. That's what we're trying to fill right now Dolphins vikings left link is in the bio Mills concourse jefferson silverson stations nick chub browns silver gronk concourse for the bucks Brett favre I think the doll i'm a patriots fan. I think I expected dolphins be better than the patriots Silver rookie selections broncos davante williams silver club level gragers. So bill's jamar chase premier level rookie They might start a bit slower because they have like much more new pieces in their offense, but we'll see although then again They do have a brand new coach Ian book try color field level saints rookie Number 49 to 75. Maybe i'm just down in the paths this year silver lamar jackson concourse for the ravens tyson cambell I just seem to want to get rid of everybody That's like all they've been doing all off season Justin fields So herbert snapshot silver p. Werner saints rookie field level john baits Ground course. Yeah, we call it a ground course a res little stuff here Oh, I see anything on the back of the bash them It's a brady maroon color. Oh, yeah, there's a little bit of um, I don't know what I'd call that There's like something on the surface there So we're grabbing empty box rapper for the buck spot. It's a nice maroon brady I think that one replaced me at 61 to 149 color matching the brady Yeah, whatever that is Yeah, it might come off Yeah, I don't know though.  So You know, that's how you hit big cards is you rip last stuff essentially try color quity pay concourse for the cults 56 or 249 any silver concourse chase for the bangles Nice one there Trask, I don't think we have spider-man metal pretty sure we don't Adam's sensations silver kyle pits on the Oh, that's his leg. I was like that likes damage to that says leg Club level for the falcons nice pits and a remandre premiere level Pats for the same that we're trying to trade damian harris or should be huge for remandre stevenson Davidson there's a herbert again. What is this? Cadarius tony gold rookie material signatures giants Heck, he adds giants. I was saying gold. I was telling y'all Nice hit for the g-men one out of 10 That is sweet good-looking card man. Congrats giants smart keys brown evans etn try color desvets patcher premiere level for the titans 199 to 199 And pats out of debon mccordy Nice 59 to 75 on the maroon partial color match, I guess Nice mccordy.  That's one second. I'll go back to it monta smith brady try and sure yinca concourse silver christ jones tile trask tie die rookie patch bucks 16 to 25 no bucks Hi lorissa uh club level silver niners fred warner versus my wife she's in tiktok Got to see that he can fold so this uh tylan wallis I thought that was part of the card at first. No, that's a dimple in it It's a dimple in it send an empty box and wrap her for the ravens as well box number four Yeah, there'll be select retail for sure Retail for things like optic and prism and select comes out uh like what a week or two after usually something like that All right.  There's my homes Golliday. What's this this way? No, this way tie die rookie Who's that? Who's that nausea here? No packers.  Yeah, the hobby parallels to hold Better value. I would think a lot of the there's not a lot of numbered in retail trade lance Maroon kyle pants falcons concourse. That's sweet too, man 33 of 149 falcons nice one there and six at ten another gold auto this time gold shimmer alan fanica Steelers And this is the gold half. I will say six at ten the gold half of the case What do I say jake every time Silver phenomenon trail answer rookie for the Niners silver concourse peterson for the vikings eskridge Elijah more fahoko nelson aglore concourse blue for the pats 175 199 silver club level jamar chase. No not club. Oh, sorry. Um premiere level jamar chase bangles Palamalu ellinger zack wilson phenomenon silver concourse granson for the colts Trask field level on the rookie Eskridge gore cadarius tony giants again 46 of 99 rookie jersey silver premiere level aamon rasain brown lions Zach wilson premiere level for the jets Patrick shuster silver snapshots deck for the cowboys silver club level humphrey for the ravens That's what's patrick All these cards are every which way man that's serman blue Premier level matthew for the chiefs 36 of 99 silver concourse chuba for the panthers kittles sensations Trask silver premiere level rookie for the bucks mark andrews What's that matthew perverts romo jamar chapperson lions Uh line green seven to 49 premiere level silver concourse tana hill titans. There's givante there's mills selections Silver field level chris carter vikings and a trade nixon. All right guys two more boxes in the break And guys we are behind we will catch up Definitely we've been quicker this case. I'll just be a little bit of time. Let's get these half cases for daytime filled up A lot of the randoms are full for tonight Mills concourse jefferson silver burrow phenomenon bangles Silver zack davidson vikings rookie concourse ty johnson darnold hendrickson joe burrow concourse blue nice one sincey What's up andrew 167 199 silver club level or premier level berry sanders lions. I'm going to keep messing that up. I think I'll get the levels right lari davante smith fields silver concourse nazi harris rookie for the stealers pat frymuth field level rookie agalore gainwell silver snap uh snapshots erin rodgers packers train the kitty chargers premier level rookie silver tricolor concourse kenneth gainwell eagles Uh 37 of two or one of 249. What am I reading? You got 37 of 249 silver concourse gibson for washington What's up rob? fields concourse base matthew premier level silver chiefs Oh, yeah plenty of spots on the website Mahomes on the field level tricolor 70 of 75 We go chief silver concourse ojolari giants Schwartz gainwell silver on the field level chart or chargers josh palmer rookie Trace serman evans etn trevor lorence premier level tricolor rookie for the jags Congrats jaguars 43 of 149 print line right across his helmet there Very nice hit jags. We'll get that mag for you The charlie joiner 52 is 75 on the chargers auto charlie joiner legend Chub Get your link out for this box for the next break travis etn 87 and 99 rookie patch card jags silver premier level jonathan taylor colts charl Williams Yeah, we had a bunch in the first half case Another gold dude another gold what I say jake another one what I say Who's this gold rookie bills, uh, so one of the d ends I'm guessing Yep boogie bashem concourse gold rookie for buffalo Carlos boogie bashem three out of ten.  I love gold What a great sound effect and I'm glad we put that on the soundboard concourse silver zeke for the cowboys shot bateman Simi fahoko 90 of 199 ricky jersey out of cowboys And meet your felt in one more box. Thanks everyone for joining luck here All right, let me get you guys a link for the next one that has spots again a lot of uh, good amount of pyts with teams still available Uh, dolphin's vikings guys half case number six The first five half cases are sold out Teared random team full cases later on as well have some spots left All the three boxes and all the division's full cases are sold out. Little big cowboys says yeah, there's a chase concourse Silver sensations mac jones ricky insert for the pats Montgomery concourse silver for the bears nasty nico Trian Sriyanka ray lewis tricolor bo jackson premier level for the raiders 32 of 199 silver asante samuel jr Chargers field level Silver selections michael carter jets just in fields on the field level silver bears rookie Go bears smith marcettes waddle concourse red jared goth lions 17 of 99 silver concourse gainwell eagles alvin kimera brand sensation zack wilson club level silver in book sainz rookie Levisca field level Yeah, jirad that happens, man Blue on the field level mohomes chiefs Very nice 32 of 49 numbered mohomes chiefs did well here silver concourse Gonzalez for the chiefs What's up elin nice dean selections silver cleol mac bears field level mixing Wow, we got a green Who do you think it is jake? Name right now Dude, you can't you gotta eat mac jones. Okay. She says mac jones. I hope he's right It's not a rookie Jake's wrong. Oh, it is rookie. It is rookie It is not a patriot Is a raider Trevon more egg. There you go raiders club level rookie green Five of five There we go Yep, greens are rare number to five There we go. Congrats raiders. We'll get that mag for you a silver concourse agolor for the pats Stevenson Not the biggest rookie, but it's a rookie man If you're if you've got the raider squad, you're pretty happy about that for sure telling mom 13 of 99 rookie jersey auto vikings Hot topic these time this is right right around now. This is telling mom, huh? Paris Adrian Peterson concourse maroon rookie seahawks dwayne eskridge Number 47 149 and an icky woods auto Hey, go bangles. We gotta get some cold cuts now mac jones premier level get some cold cuts get some cold cuts Stevenson grunk herbert phenomenon silver concourse palmer for the chargers on the rookie long wu field level Yeah, there will be eric We were taking pictures earlier two two at well 55 to 75 rookie jersey rams silver uh premier level get sticky dolphins Or no, that was club levels and uh etn on the back guys. Give me just a second here Do a quick recap for you Gotta think about my prediction for the next half case I did good on that one Say Or so we had that tie-dye ed read that was cool 2500 eric 2500 ultra high-end multi sports. There's hockey soccer Uh football baseball basketball. I'm not sure if there's any racing or anything else Um, so we had rams jersey two two at well jags travis etn Uh, giants cadarius tony bucks kyle trask tie-dye Colts michael pitman jr. Niners debo samuel Autos now bangles icky woods chargers charlie joiner pat's debon mccordy bucks debon whites Todd wallace on the tie-dye die cut for the ravens gold allen fanica steelers auto rookie jersey auto eagles kenneth gainwell Um vikings kellen mond lions aamon ross saint brown texans niko collins and cowboy semi-pho-hoco We had a Field level silver for the bears justin fields We had tricolor jags uh trevor lorenz Club level 43 of 149 We had gold marlin humphrey raiders uh premier level Or sorry club level 10 at 10 boogie bashum bills concourse gold Three at 10 gold rpa. Uh, giants cadarius tony one of 10 And green 505 rookie, uh, uh club level trevon morgan for the raiders. That'll do it. Thanks again everybody more coming up next