All right, it's time to get started. So we're here today to talk to you about horizon dashboard plugins, kind of give you a deep view of where we're at and where we're headed, some of the things that you can do with them. Agenda, we're going to talk about them. We're going to talk about where we're going, some new stuff in them, and then also a new use case and a demo. So plugins and horizon, just a little timeline. Horizon officially became part of OpenStack way back in Essex. At that time, customizing horizon was essentially either building a custom Django app on top of horizon, hacking directly into the horizon code, or using a customization module, which was basically a glorified tool for doing monkey patching. In the Ice House release, we introduced the first rev of plugins for horizon. It was fairly crude support, but you could support Django content in the plugins. And we've slowly been adding to that since then. You can see in Juneau, we added some support for collecting of static files, CSS, JavaScript, images. Also support for AngularJS modules, as well as including new exception types. So if I'm talking to a different service, it's a returning exception from the API that Horizon currently didn't know about, you could add that as well. In Kilo, we added some testing features. So for Angular code, you could actually write a spec file. So that spec file could be run as part of Horizon's test suite. And then in Liberty, we added some auto-discovery of JavaScript. For a while there, you were having to line item every JavaScript file out in our plugin file. So this was a great simplification. We're collecting CSS now, as well as... We also transitioned to having all of our content being loaded via a plugin, becasism. So we're not only trying to push this on you. This is actually what we're using internally. And that's true for the content. Our API connection is not exactly using the same mechanism, but at least all the content is coming in. So it's our commitment to it. So what can you do with the plugin? We're going to cover a little naming just to make sure we're all on the same page. Horizon has some names here that are not standard, but I hear them referenced differently all the time. So we have some navigation elements that you can see. The top level navigation element is a dashboard. And all that is a container for content, essentially. It's a way of subdividing. Inside of those, you have another level of subdivision, which is a panel group. And then below that, where the content actually lives, are called panels. And so the top two are navigation. And once we start getting down to the panel level, that's where we're starting to talk about actual content. And in the plug-in scope of things, the panel content is fair game. Once you've specified the panel, you can put whatever content on there you want. You can have it be JavaScript-driven. You can have it be Python, Django-driven. You name it. So what can we do with them? Well, you can add dashboards, panel groups, or panels. We're just pointing out I've added a new panel group called tools and a couple panels in there. So we can add content. We can remove content. So if we go back one, there we go. The bottom, there's a whole identity dashboard. Perhaps that doesn't pertain to my deployment. With a very simple edit of an enabled file, we can eliminate that whole dashboard from even loading into the UI. So nice feature. And then you can reorder them. That's one of the features, too, is you can move everything around. So in this example, I've moved the identity dashboard up to the top, and I moved the project dashboard down to the bottom. But you can do that with individual panels or panel groups, or you can even move a panel from one panel group to another panel group. Basically just the way to say, this is how I want my views to be laid out. And then the other thing is, so maybe I created this new panel on the tools panel group. I think this is what everybody should land on when they come in, because it's the most important thing. So I can specify that as the default panel. So when somebody comes and logs in, that's the first panel they see. You can do the same thing with it. Well, you can do it per dashboard, and you can also set a default dashboard. So how do the plugins actually work in Horizon? Well, they're an installable Python module, or Python package. There's a little bit of wiring in a file. It's called an enabled file. It kind of specifies the contents of your plugin. And then that gets tied into Django's applications. So you're basically adding, Django uses the term application to specify content. And so what you're doing is adding content. You're adding a new Python module to the content list. And Horizon's taking care of this behind the scenes. That was bad. Hold on, hold on. Silly Max. All right. There we go. Let's do that. So what's the structure of a plugin? Like I said before, there's an enabled file. We happen to call them enabled files just because they ended up in a directory called enabled. Oh, yes. Yes. So you're going to create... What's that? What's the name of the package? No, you're going to create the package. So you're going to create an installable Python module. So that's what this is. The plugin there is the plugin. So you're going to want to have some packaging information in there so you can create a Python package. You want an enabled file that's going to specify the content. And then basically it's a bunch of links to how Horizon should interpret what you've just presented to it. And then there's actually the content. And so in this example, we have an API... So in Horizon, we have something called the API directory where we handle all the connections to the services. So we just duplicate this in the plugin. You can name it whatever you want. So in there, we have something that would talk to a different service. It's probably not already an open stack. And then we actually have the content below that. It's typical Django content. Again, you can... As long as you're getting to the point where you can render data with it, it doesn't matter if it's pure Django or if it's mostly JavaScript. So that's the typical content. Again, it's just you're taking some content, an enabled file, and packaging it up so you can go install it somewhere in the Python path on your system. So we'll go... There we go. That enabled file. So again, that's how we do all the wiring. So I was going to... There we go. Yep. Ah, yes. Good point. Yes. So I said you could order all the content. That number is basically specifying the ordering. So each of the enabled files has a number, and that tells it how to plug in. There's also a hierarchy of how these files are loaded in. Actually, it's more of a numerical order, so one would load before 2000. And then we have a couple of different directories where those get loaded into. And I'll get to that in just a second. But yeah, the number is significant in the fact that it does specify where. And if I specified that exact same file name in a later loading directory, it will supplant the content. But we'll cover that in just a sec. So some things that we can set up in the plugins. This is actually the entire list of potential settings at this point. The first one is the most important. It's just specifying the application or the actual module that you're loading into Horizon. The exceptions we talked about, some angular stuff we talked about, JavaScript. So we're just specifying content. The auto-discovery one Sean will talk about in just a few minutes. But that's a new thing that kind of gets rid of the ad.js files to a certain degree. And then you can specify whether you want it to be enabled or not, which we oddly named disabled first. But that's it. That's basically all the content you're putting in. So the first one will look like a Python path. Let's see. Let's go back. Yeah. That's basically what I'm telling you about that. And so there's two methods of actually using the plugin. There's a very simple one that is you can copy that file, the enabled file. So in that example, it was underscore 2000 logpanel.py. You can copy that into the local enabled directory inside of Horizon. When you do that, when Horizon boots up or starts up with Apache, it goes and it walks through that folder and it'll see that there's a new file on there and it'll go and try and resolve all the paths and pull that into Horizon. So that's how you get the content in. There's actually a more powerful way to do it. It's a little more cumbersome. But this is all settings based. And so for a lot of deployers, they don't want to have to muck with the file system as much as they want to be able to drive it through settings. And so in the second part, you could edit your local settings file to pull in the plugin itself. And then with this addition, you can actually do use policy files and setting specific to the plugin. That's missing in the other method. So it designates an example here where they do have a policy file and they've built a plugin with it. And so they use the second mechanism so that they can guard actions with policy so the user doesn't see things that they can't actually do. I promise this to say something about. No, it's OK. So where are we? This is where we are at with, so there's a huge family tree of plugins for Horizon. I have all the content that's actually delivered in Horizon in that box. So we're supporting 10 services inside. I went out and actually looked at the OpenStack namespace in GitHub. And there's some names in there I don't honestly recognize. But it's obviously a popular interface. And this is the mechanism they're using to get content in. As we move forward, the Horizon team is actually going to concentrate more on shared componentry inside of Horizon and move some of the content, like Trove and Sahara, outside. Because it's not really a shared resource. And so Trove and Sahara are moving very quickly. And they want a lot of content changes. And that's wonderful. We have a relatively small size team. We can get changes in, but not as fast as they would like them. So they should be in control of their own content a little bit more. So in the next cycle, we'll actually move those out into separated plugins as well. And that's, and that only has to focus on making Horizon a better toolkit to support the plugins even better. So what's new in Liberty? Sean, we'll take it over from here. Static file auto discovery mechanism for the plugins. All the static files that is for the client side, the computing and the rendering, are get discovered automatically and organized in the right order and get populated into the production page and test runner for you. Static files include JavaScript file that is using Angular framework and HTML file that has a Angular templates and SSS files. And all the Angular model names will be added to the system automatically as the dependency. So the only JavaScript get automatically ordered based on naming convention. Now JavaScript files that define Angular module will be named as .module.js. And the files that define unit test will be named as .spec.js. And the files provide mock object for unit test will be named as .mark.object.js. And all the other JavaScript file that defines Angular providers will be named to something else. And the order will be in production models will come first and then providers. In test runner, it is models and providers and mocks and specs. There is no need for manually to maintain a JavaScript list, which is tedious and error prone. To enable or to discover for your plugin, it's simple. You put all the Angular module names in the add Angular modules list and put your SSS files in the add SSS files list. And just put all the discovery static files equals true and the system will do the magic for you. OK. Thank you, Sean. Thank you, David. So, put on the sign, come on. All right. So David talked about how easy it is for you to add your own custom dashboard and your own custom panel. But it leaves a lot more that we desire. And Sean just recently covered his auto discovery stuff, which allows you to basically dynamically locate static resources in your project, right? So when you take these two and you combine them, what you end up with is Jrumroll JavaScript plugin. OK. So how does that work? What we're going to do is we're going to walk over a use case and then we're going to dive into the JavaScript plugin architecture. OK. So keep in mind that this use case here is actually a real world example. This is a problem that a real team is facing. This is not a hypothetical situation. So let's assume that you have team A, I mean, sorry, blue team and red team represented by David and Sean here. And they both want to modify an existing workflow. Blue team wants to add its own custom step and red team wants to add its own custom step. The only way to do that today would be to, one, you have to modify a source. Or two, you have to monkey patch. Now, both of these methods, you have to basically do your own manual resolution, right? And this is not ideal. We want to be in a scenario where blue team can do its own thing, red team can do its own thing. They both do their pip install and everything just magically works. OK. So before we do that, we're going to, again, level set and just cover some common terminologies. Actually, this is the wrong slide. This is the correct one. OK. So what is a wizard? Well, everyone's familiar with a wizard, right?  It's pretty much a step-by-step guide that you have to sort of fill out along the way. And then at the very end, you can take some kind of action. What does the code for that look like? It's actually really simple. The wizard has four properties. It has close, cancel, submit, and workflow. A submit is really just a callback function. So when you click on that submit button, you do something, right? Workflow, that's really just a JavaScript object that tells the wizard how to draw things. So we're going to cover that next. What is a workflow? So a workflow, again, is the thing that you see on the left, whatever the visual manifestation of that. And what does the code for that look like? So workflow is a service. And think of a service as a glorified singleton JavaScript object. And with the JavaScript object, you can easily manipulate that. With a workflow, you have a title. You have some text for your buttons. And most importantly, you have a list of steps that you're going to have in that workflow. And these steps are really just composed of a title and a template URL. So in this case, this step has a controller and an HTML template. We're going to cover what kind of content you should have in that controller. It's really easy. So if you think about it, this is MVC, right, at its basis. The controller is where you can pull in your data and it binds it to the view, which is your HTML page. And in this controller, what we're doing is we're saying, hey, I have a user object that's initially blank. And as I'm filling out the form, this user object is going to get populated with key value pairs. And we also have a watch collection on that user object so that every time this user object changes in property, we are aware of the change. And we broadcast this change to the parent controller. So this is really important. And we'll cover why that is important in a little bit. So again, this is a UML diagram of what we just talked about. At the very top, you have the wizard motor controller, which depends on a workflow service where you would define your workflow with a list of steps. And these steps then point to these individual components that you see here in the green region, OK? So how does that relate to what we have today? Today, we have tables. And at the very top here where it's highlighted in red, you'll see that you can click on this button to basically launch this wizard, OK? This is called a batch action. And again, it follows a similar model where you have a table controller, which has some HTML. The table controller populates data, which then gets shown in that HTML page. And then this table controller depends on this batch action service, which is an object that contains a list of other services, in this case actions, right? We have a create action service and a delete action service that this batch action includes. So when we put it together, what we end up with is this really big diagram. But it's really easy if we take it one step at a time. What we see is all the services here that are marked with a jigsaw puzzle, they're extensible. You can extend them. You can override them. You can manipulate them. And the things that we see in the purple and green regions are additional things that we can add to it. So in this case, you can add additional actions and additional steps, OK? This will be a little bit more clear in a little bit when we go over the demo. So I'm going to hand it over to Cindy to actually show you how to codify this. But keep in mind, in the back of your head, the use case that was covered earlier, because the demo would address that. OK, so before we take a look at the demo, let's look at the create user action which we're going to modify. OK, so this is the same table that Ty showed earlier. So if you click on this batch action, or this action, you'll see that we're using the wizard and the workflow is broken down into two steps. User details and select projects. So user details is the basic bare minimum information that you need to fill out in order to create a user. So if we do that, let's call our user Yoda and then password, enter a password in. So if we enter in a wrong password, it immediately tells us that we entered in a wrong password. Whereas before in our create user modal window, we had to create on the submit button in order to make a roundtrip call to the back end to check that the password was entered correctly. So let's put in a correct password. OK, so once we filled out the bare minimum, we see that the submit button is enabled. But let's take a look at the second step. It's called select projects. So here we can assign our user to multiple projects. So let's assign our user to an admin project and a demo project and change the role to, let's see, change this role to service. And this is a feature that has been in Keystone API, but it was Keystone V3 API. But it was not implemented in Horizon before. But now with Angular, we can enable that. So we filled in all our information and let's create our user. So our user was created instantly. As you can see here, no lag at all. Let's go to the projects panel to make sure that the user was created successfully. Double check. So if we come here, we can check our manage members. And in here, yes, we see Yoda is created successfully and also in admin. Yes, we have our service role for our user. OK, so before we go into the demo, let's recap our use case again. We have the blue team and the red team. And they both want to add a step to the workflow that we looked at earlier. And we don't want them to have to modify source code or have to manually merge conflicts between each other. So I promise that it works. And we will show you in a live demo. Fingers crossed that it works. OK, so we have our blue plugin and red plugin. These are separate from the horizon folder. I've put them on my desktop. So we'll take a look inside. These two are exactly the same except for the name. We have blue and then red. That's the only difference. So if we take a look inside our plugin structure, we see that all our files are under the static folder. This is how our client-side code is organized in Horizon. And this enables us to auto discover all the static files. This is a feature implemented by Sean. So if you write your Angular plugin, make sure to keep all your files under the static folder. So let's take a look at our first file. So in here, our module is referencing the identity user's namespace. And here, on line 26, we inject in the create user workflow that we want to modify. Once all the modules are loaded and all the dependencies are resolved, we will run this block of code down here. So we define our step, as Ty referred to earlier. So this is a new step that we want to inject into our workflow. So we have ID title template URL refers to the HTML content we want to put into our step. And help URL is some content that we want to put into our slide-out panel on our wizard. And once we have this, our create workflow service is making use of Justin Pomeroy's extensibility service, which allows us to append, prepend, replace, remove the steps. And in the future, we want to use this extensibility service for other UI components, like batch actions and actions. So we use workflow, and then we're going to prepend our steps. So we have two steps right now. We want to add a new step to the front. OK, so we're going to take a look at our template HTML file. So let's take a look at that. So here, this is just the content for our blue step. In the first line, we have a reference to our controller. This is where we handle the view model logic. Our second line is just the title of our step. And we use a translate attribute. This attribute was implemented and released in the Liberty cycle. And this allows us to collect and translate all our client-side text. So blue plug-in can be translated. And down below, here's some caption for our step. And we have two input fields, favorite color and favorite food. Very basic. So let's take a look at our help content. So this is just plain HTML. And we're using our translate attribute again, as you can see. And last but not least, the most important file for our step is the controller. So in our controller, we are injecting our wizard event. This allows us to intercept our data. And then we can modify this and or take this data and send it off to our own external service to do something with it. So in our simple example, we are just going to capture the events and just print out some trivial messages on our browser console. So we went through all the files in our plug-in. Red is exactly the same, except for instead of using prepend, we used upend. So it'll be after the steps. So now, OK, to bring these two plug-ins into horizon, we wrote a really short little script and we'll kind of talk about the script before we check out, see everything in action. OK, so this is our short little script. So in here, we are going to go into the blue plug-in and red plug-in. And we're just going to tar up these two files. And then we're going to copy over our enabled file from each of these into horizon. These files are read up at startup. And then that allows us to register the plug-in to horizon. And then we're going to pip install these two tar files and then start up our test server. So if everything goes well, this should work. So we're going to run our short little script. OK, it looks successful. No errors. So let's go to our browser. So we're going to open this up again. OK, ready, everyone? Drumroll, drumroll, please. OK, boom. We have, instead of two steps, we have four steps now. So the blue step was prepended and the red step was appended. So in our blue plug-in, we see the text is blue. And then we have our two input fields that we saw earlier. And then if we go to red step, we see that it's the same except the text is red. And then if we look over here, we have our help text as well. It was just basic HTML. So let's close this up. Also, if we look at our browser console, we'll see our events that we triggered. So we see wizarded switching steps. So we were clicking around so those registered over here. So you can see how powerful the extensibility service is. And now you have finer control over all your HTML components. And if you want to customize anything now that you can, this is a feature that a lot of users wanted before. And now it's possible. And let's hand it over to Ty for a recap. Thank you, Cindy. So a recap. OK, how do I get back? OK, if you want to try out that demo, it's a little complicated. But all these things are in review right now. But you will need to merge these two patches and then download Ty's plug-in example. And then follow the readme to install the plug-in. Thank you. All right, quick recap. All right. So it was obvious from the demo that there were performance improvements. When you click on that user, it was created instantly. Amazing. OK, it addresses the complex use case that we kind of covered earlier. It also allows you more granular control over your content, enables parallel development. So a red team and blue team, they don't have to fight for stuff. As you can see, we have customization hooks. There were a lot of events. So you can register too. And again, this flexible and modular architecture can be extended to other things like table columns in the future, perhaps. Our resources, you can find all four of us on IRC. Here's our IRC channel. We also include our email. And Cindy here is a volunteer to answer all your questions. So just hop on. And lastly, I just wanted to have sort of a leaving note, I guess. Right now is a really good time to be a horizon developer. We have a lot of really exciting things going on.   And if you're an existing plugin developer, consider migrating to this, maybe. And if you're a key decision maker, we really hope that you can continue to enable your folks so that they can contribute upstream to this great success. Thank you. We're going to open up to questions. You can step up to the mic if you have questions. That'd be great. May. So I have some architectural question. These steps in the wizard workflow they seem completely independent. Is there a possibility for one step to rely on some data from the previous steps? I'm curious. So the answer is yes. That's entirely possible. That's why we have that event registration mechanism. So if there's another step that depends on the previous step, you can register to the event. Does that make sense? But yeah, they are completely independent. You can treat them like such. All right, any other questions? Are you all too dazzled? I have one. OK. So let's say that if you want to create a plugin for an external service, can you get some identity information from OpenStack so you can use that as the credentials for the external service or something like that? That's entirely possible. So we have API for Keystone, right? So you can invoke that, and then you can register to certain events so that when you're creating this user, you can hook onto that event and then point that to your external plugin for future processing. Thank you. In a workflow, when I have a step, is there any mechanism wherein I can get the value which is in that step before actually submitting the workflow? Actually, you can, for example, in the launch instance, we have a centralized model for the owner steps. So when you put the submit button there, you will get the data from the model. The model is not specific for each step. It's class owner steps. But if you want, you can also put every step as independent of its own model. It's totally up to you. I do want to be clear. We are supporting two separate frameworks at this point. And that is true for the Angular workflow. There's still a Django workflow that doesn't support any of these new additions. So that's one of the reasons we're really excited about Angular is the ability to do this. Thank you very much, everybody.


Hi everyone, Mary at Espresso Press Design. Welcome. It's time for another create with me and today it is Valentine card kit. Be my Valentine. I'm going to go through the kit, print it on plain paper. This is the card I've already assembled, the horizontal card and there is the hidden pocket and this is the inside of the card and all of this comes in the kit minus the card base. Today I'm going to, here is the design that's in the kit example. Today I'm going to assemble the vertical card and this is the example in the kit. You will need an 8.5 by 11 I printed mine on cream and you will cut this at on the 11 inch side at 5.5 and then you will score it at 4.25 and that will give you your vertical or horizontal card base. So that's not included. That's what you'll need to create the kit. Create the card. This is the last page. You'll need your borders and I used this little one in the horizontal card. These are some free templates. If you don't desire to create a heart to tuck in there you can create a tag and it will fit in that pocket. So that's the last page. This is your sentiment page and by the way this kit has a lot of extras.  I forgot to put it on this page but these are your sentiments that you can use for inside the card and in this one I use the sentiment. I also made these so that if you're not comfortable with fussy cutting a heart you can keep them as a square and they will still tuck in the pocket. In addition if you desire to put on the inside of the card to write a handmade sentiment, handwritten sentiment, there are journal cards and you can just use one of the journal cards in the vertical card. They'll just fit in the horizontal card so that would work better in the vertical card if you use the journal cards to write a handwritten sentiment. So there's journal cards. These are all extras. These are your card bases for inside the card. They are everything is proportional to card design. As you can see I use the blue one inside this card. These are your front card bases. You can barely see it on this one but I use this one for this card base. So you have four choices for your card bases and these are all extras. There's another card base. These are all extras. Here is your horizontal main image. I use this one. This is an extra and here are your vertical card images and I'm going to use this one today because I want to keep it as close to the photo as possible. This tutorial will be going up on Etsy. So I have all of my everything cut out that you will need for the card. Some little extras here.  So I'm just going to keep this here from my reference. These are all the extras. I have those all cut out too. I'll show those at the end. So let me get my base. Which one did I use? My image. Everything to the side here that I'm not going to use. There's another image. I printed these on cream. Card stock by the way. I use that one and for this I'll just be needing a little heart. Now it's here somewhere I hope. I have both those cut out and I think I will use this. This is the one I used and the sentiment I used was this one. I'll keep that out to show you how you can layer that if you desire. And where's my other little heart? I need that. Use this on the inside. Okay I'm missing a heart. I'll just use a circle. Oh there it is. Tucked under there. Okay. And a little snippet of border. Put these to this side so I don't lose them. Okay first I'm going to put down my base and that gets glued completely. The pocket is actually your image. Make sure I'm in. Let me burnish this a little better. I'm going to glue down our base. You can use glue. You can use double-sided tape, whatever you desire. You can hold this up here. Make sure I get everything straight.  So keep your thumb there. Try to stay as close to the edge as possible and then that retains a tiny little border and then I just make a little heart on there but I don't want it to interfere with my pocket so I'm just going to glue it to the card base. Just thought I'd add a little something. Embellishment of course is up to you. Be careful there that I don't cover my my Valentine there. And then for this one I just made a little bow so that you could tell there is something in there to take out. You could write a little note on there if you desire. Okay so I don't know if I'm going to do that part or not. So the inside we have our base. I chose the red and I began using my trimmer to cut these out and then it was just easier just to cut everything out by hand. And I think for Valentine's it's appropriate to cut everything out by hand. Makes it look more handmade. That was in the center and here is an example if you want to use the journal card instead. If you want to layer more on top of your journal card you can. If you want to take, let me see if I have an appropriate little cut-apart here. Probably don't have a small enough one in here. I want to take one of those little cut-aparts and layer it even further. Make some little design like that. You can do that as well. It's up to you. But I'm just going to go by the design that will be on Etsy. This tutorial will be on Etsy. However it's, this kit is free to everyone who watches the video. I don't think I said that and it's a lot of fun. It's pretty large for a free kit but Valentine's Day is kind of like Christmas. You can use your lines on the base. Keep everything nice and straight if you're not comfortable doing things like that. This I think, I think I'd like to turn that into a little fishtail and then let me make sure my heart is going to get to there. Of all the fair and fragrant flowers that in Life's Garden grow, there is none that's half so sweet as you and I like you ever so. Very cute. I thought this, I thought this little design was so whimsical and cute and it had so much possibility. That's why I chose it as my starting point for this kit and it gave me a chance to work with red. I love red. Okay, there is card number two. I guess I'll just pop a little, where are we? 18. 18. Pop a little hole in there. I'll close it. It'll work. I'll just create a little hang tank here. So of course embellishing how you embellish is up to you. Let's see if I have enough room to tie a little bow. Enough string I mean. Tie a little bow there and then that is going to tuck in and there is card number two and there is the horizontal. Okay, whatever else you desire to put on there. I thought if I had to use the little circle I might need another little heart but I don't. So there's the vertical, there's the horizontal, there's the inside with the sentiment and there is the inside with the sentiment. Maybe I forgot to put something on there. Let's see where my design go. No, that's how it is. Okay, so these are all, these are everything that's in the kit. I didn't cut apart everything. Journal cards, all bases. You have several choices for your bases. You have more than one choice for your image.  So again if you would just like to take that tag, use it as a template, use one of your designs, it will fit. If you want to make additional hearts, it will fit. So it's a lot of fun. All kinds of little things. I didn't cut apart all my borders. A lot of fun and it's free just for hopefully liking, subscribing, and sharing my YouTube channel.  These are all extras. You can use however you desire. Okay, 23. I think that was, I hope that tutorial was self-explanatory enough. But if you have any minimal experience with card making, I'm sure you can do it. It's very easy and you saw how fast it actually was. And again if you're not comfortable cutting out fussy cutting the heart, you can just tuck it in there as a square. And it should still fit. I'm sure it will fit. And if you prefer to use a tag, make a tag instead. You can make a tag. Okay, thank you for stopping by. Don't forget the download link will be as a PDF in the description. And have a fun day making your little valentines. Talk to you soon. Bye!


Hello and welcome to CMC Markets on Friday the 16th of February and this quick look at the week ahead beginning the 19th of February and it's been a much more positive week for not only European equity markets but US equity markets as well and a large part of the rebound that we've seen this week has been driven largely by US equity markets and we can see that being played out on the S&P 500 right now. This time last week I talked about the fact that I was a little bit reluctant to call for further declines in the S&P because of the fact we were above the 200-day moving average and we can see quite clearly here that it has held quite nicely. What we're now doing is looking to rebound back through the 50-day moving average and we've done that but at the moment we're looking to test the 61.8 Fibonacci retracement level of the entire down move of the last two weeks. So I think how the S&P reacts around 2745 is going to be quite important in the context of where we go to next and what is surprising is that even though we've undergone a significant rebound in equity markets, bond yields still remain pretty much where they were a week ago. In fact, they've gone quite a bit higher so I think the inflation scare that we were worried about a week ago, equity investors appear to be less concerned about it and maybe that's maybe one of the reasons behind that is the fact that the perception is the global economy will continue to grow in a way that sort of compensates for higher rates but I'm not totally convinced by that because if we look at this week's inflation data out of the UK and the United States, both numbers came in above expectations, UK inflation came to 3%, we're expecting a minor decline to 2.9%, more importantly US CPI stayed where it was at 2.1% and markets were looking for a decline to 1.9% and what was notable was that while inflation stayed fairly hot, retail sales did not because the UK retail sales came at 0.1% which was significantly below expectations and more importantly US retail sales came in short in January but also the December numbers were revised lower so maybe higher prices are starting to impact consumer spending in a significantly adverse way. That being said, we've seen a nice little rebound in US markets led by US markets pushing against resistance at 27.45 on the S&P 500. If we look at a similar pullback in the DAX we can see that the higher euro has taken some of the edge off the rebound in the DAX as shown by the Fibonacci retracement levels that I've drawn on this particular chart here. At the moment we're really struggling to gain traction above the 38.2% retracement level from the highs in January to the lows that we saw earlier this month so I think at most we could probably move back to around about 12,648 and that would be the 50% level on these two peaks here if we can sustain the move beyond 12,430 which is the 38.2% retracement level. Now last week I talked about a potential reversal pattern on the euro-dollar evening star that transpired that didn't particularly transpire particularly well but as I said at the time candlestick patterns really need confirmation to play out so even though on the weekly candlestick chart the evening star reversal has been negated if we look at the daily chart we still have struggled to take out the previous high at 125.40. More importantly and I think this is important we still have the 61.8 Fibonacci retracement level of the entire down move from the 2014 peaks to the lows that we saw in 2016-2017 at 126 acting as a much bigger resistance level in the longer term. So while we have seen marginally higher three-year highs on euro-dollar what's significant about this particular candle is we've made a new high but we're currently now trading in negative territory for euro-dollar. If we translate that across to the dollar index again we've made a slightly lower low but again on this candle chart here we haven't been able to sustain the move lower so what's probably happened here is we've taken out a few dollar long stop losses and are now squeezing back higher again. What is also significant is the fact that dollar yen has broken out to the downside as well and that could augur in a significantly stronger yen which could act as a bit of a drag on the rebound that we're seeing in the Nikkei 225. So we've looked at the events of the last week or so now let's look at the week ahead because there's a couple of items that I will be paying particular attention to this week one of which is UK wages UK inflation is at 3% there is an expectation that wages here in the UK are likely to continue to accelerate from the current 2.5% level that they're growing at in the three months to the end of November in the numbers that are out this week unemployment is expected to remain at 4.3% at 42 yellow but also wages are expected to continue to rise from the current 2.5% and head towards 3% if they do that then ultimately expectations of a May rate rise from the Bank of England are likely to gain traction even more than they already are. We also have 4th quarter GDP the second iteration of UK 4th quarter GDP that's expected to remain unchanged around about 0.5% might see adjusted slightly higher to 0.6 but nonetheless it's expected to show despite the fact that consumer spending remains fairly lacklustre at the moment the UK economy grew fairly decently in the fourth quarter we also have the latest Fed minutes now the Fed minutes aren't really going to tell us too much with respect to how the Fed views the overall economy and more broadly the stock market because of the fact that we've had a significant amount of volatility since that meeting took place but the Fed did upgrade its outlook for inflation on a 12 month basis we're seeing that play out in now the headline numbers and we're also seeing US data come in fairly mixed some good some bad but overall plain painting a picture of a US economy that is fairly resilient and where inflation is now starting to gain traction as a result expectations for a March rate rise from the Fed are now at 100% so really it's a question of not whether they raise rates in March but how many more rate rises come after that and I think that's what markets will be predominantly focused on with respect to the minutes also coming out next week is a big week it's a big week for bank four year results from HSBC Lloyds RBS and Barclays so that's going to be a big story for next week and also the latest German IFO survey what I'll finish off now with is a little quick look at the cable chart once again the rally that we've seen this week is starting to run into a little bit of a wall just below that 142 level well I think what is important with respect to this cable chart given all the Brexit uncertainty and everything else is how resilient it continues to be but we are still well short of that really big resistance line that I've drawn on my weekly chart from quite some time ago now 2015 peaks at around about 143 so if we do get some further dollar weakness which looks increasingly likely the pound I think will continue to struggle and trade in a range between 138 and 142 so that's it for this week once again thank you very much for listening this is Michael Houston talking to you from CMC Markets


This is actually a wire a wacky and Crazy stream. There's the next matrix barcode. This one isn't going to be so simple What the heck? Oh, I got to come at it from a certain angle. Oh My goodness this girl is nuts. Oh Am a goodness Okay, this is this is gonna be annoying. I thought I was just taking some pictures, but I I mean they kind of give you a clue here with this green box, I guess There we go. Let's try this and lost their mind too bad guys.  That's honestly almost as bad as the kidnappers. Okay, so remember I said I had nothing That I didn't like about this game. Let's correct that statement. This is it This is why this game will not be a perfect tip from Buona Hashtag blessed you heard it or is it photograph code? I don't even see the code That's big. Oh Wait, what the heck? I see it. There's the other code Split across two buildings. Oh She's forgiving. Yeah, this is a new villain Screwball, I've never heard a screwball chat anybody ever heard of screwball before I've never heard Gosh, I need to hurry You're gonna give somebody some white job streamer some some ideas They're like, I didn't know that you could be insane in the streamer at the same time.  Hmm. I wonder if there's one out there I'm gonna try a twitch verse Can you hear me? Hold on? I'm gonna rip the door down Okay, that's green made up for it that screams just made up for it so many choices Yeah That line. Oh, that's a courtable. Well done for a spider-based hero. I'm really starting to hate the web. Oh Okay, that was good that was going Broke my hand hitting spider-man's face. How are we doing? So we got still got stuff locked. I guess if you do all the crimes and do all do all the crime areas Maybe something else will unlock, but I still got side missions in Harlem to do That was both that laugh made up for it. Okay. That laugh was a redeeming quality because that That was the ultimate like that was hilarious Oh Gosh Yes, I love the fast travel cutscenes man So we're gonna head over to do this next thing Head to this tower towers One how dare you use fast travel a game that makes travel so awesome Napping Solidated shipping Jeff. I'm here. What do you see? Find the rest boss wasn't dead Looks like the demons are moving in on Fisk's territory. You got this. I got this Stealth chat. I got his danger. He's safe. You hate to see it. So here's what I'll do over here We're gonna try boy. He's safe. Never mind I See nobody else Not today well there went the stealth got them all You love to see it chat you love to see it Chill behind there for a little bit. Wait, okay. There he is Alright, okay This is gonna be easy ha Didn't work kind of funny day Okay Ghosts, what's up, man? Nice jumpsuit slimming wait the demons. Who's their leader? Ghosts in the button five months in a row. Everybody's throwing some love in the chat. I never changed that one Saving bad guys from other bad guys not okay and I smile Thank you so much for the five months in a row. Are they alerted? No, they can't be alerted. They're not You know these guys don't know it. Okay, maybe they are Danger that's not where I want to go, but it's cool. It's cool. I can make this work. I Just alerted that guy But now he's coming down. Okay, this whole area is just All right, so what we'll do is we'll get a grenade and we're gonna throw it on that you Oh You'll love to see it chat. I got spider drone use it. Use it. Use it. Use it.  All right.  Goodbye Shoot you in the face and then we're gonna web you guess the wall And then we're gonna okay, and we're gonna get this guy. We're gonna do some couple spiders here and we're gonna go over here but like I'm gonna hit this guy. We're gonna grab this we're gonna jump up in the air grab that and then we're gonna swing it and Hit you and we're gonna hit this and we're gonna go. Okay. Then we're gonna. Okay. I don't know what we're gonna do I don't know what we're gonna do.  Wait for the police.  I try to shoot him. Oh, that was lame. I shot him That's boo. That's other boo Dude these spider drones are still here. That's kind of cool. Um, I guess I can reach in my head Okay, this is that this and off they go All right, where's your boy? Where's your boy? Where's your boy? Where'd you go? All right Gotta find the survivors fast Am I supposed to do anything with them?  All right, that's fine Okay, anybody else I hear the gunshot. Oh, there they are So if I were to grab this grenade and toss it on set individual like this. Oh Man, I can't shoot the guy in the helicopter. That's kind of messed up I thought shock would help but all right drone to the wall. There we go You go there. All right, so we got to get back up here. Don't see anybody yet. Are they below me or Above looks like they're above. I don't see any dudes Must be above again, dude Is it just a helicopter? Yes, oh hi, what would I do to you? What am I gonna do to you? Wait a minute, I think he's going further in Okay Okay, oh My gosh, we're expecting that one all that pigeon chasing this train me Yuri crap. I messed up Yuri I'm not I'm not fit for this city Where'd he go? Okay. I did Pigeon training failed me chat. Have I beat this? Nah, dude. No, I Haven't beat this that just happened That little part right there sucks, okay, that's what threw me off last time It was this I know working on it Yuri Oh, I know what this was in the trailer. I Knew I seen this somewhere and I didn't remember where This was in the gameplay trailer that I played right before we went live yesterday Or right before we start crap right before we started playing this I remember I said I hated her and I hadn't even played the game yet She's like could you superhero a little faster? Oh gosh, okay?  Where are you gonna put me? Where are they gonna put me? Where are they gonna put me? Okay, it's not too bad not too bad. I Actually didn't know that was coming so Now that do Hey, hey, I Don't know what's coming next Hey Yuri, I caught the bad guys, but fight what you might want to bring a ladder Hey, fanboy. All right, I get the city hall from my dad's ceremony. All right, so he pops a second grass OMW what does that mean one must wait so he told his dad that he must wait MJ


Welcome folks, we are the Dow Industrials finished up $268, NASDAQ up $279, S&Ps up $52, Gold down $23, trading out at $19.19 an ounce, yet Silver down $0.56 cents, at $25.05, LightSweep crewed up $179.1047 notes and bonds. The 10-year note, up 8 ticks, trading $124.19, the 30-year up a full point, plus 3 ticks, at $152.17. Now both of those are basically hardly moved at all when you really look at the chart and they have light volume. Bonds, notes, they want lower price, high yield. King dollar, King dollar up $233, trading out at $98.207, Euro 110, yen is out here at $113.13 and the British pound is at $131 to one U.S. dollar. We get over and take a look at the spy we have out here folks is that you're finishing at the highs of the day and we want to take a look at this volume and with the quad-witching and with the indice rebalancing, we'll get a little bit more volume. So the spies end up, we've got $91 million, the swing point has $105, you're over the swing, the swing's $441, that's telling me this S&P wants to run up to this $458. We go into the NDX 100, we take a look at the NDX. Now the 3Qs had the volume as I started my show and the bottom line is that they got it. They basically took out a swing and they took it out with volume. They took out the swing of, we had $71 million, they did $79 million, you had $350 was the swing, you had $351. Man, this is going to be so deviant folks, okay? Because my take is that this is still a bear market, but this is how they work, man. The bottom line, next to the area up, and this is the first time we did take out swings since the highs that were established in January. Bottom line, I see the Qs, 370 is game, so we get some action out here. Gold, gold contract, pullback with light volume, you know we went through the XAU, the HUI, they both won higher price, they both came into their swings last week, monster volume, you take a look at the gold contract, pullback with light volume out here today. We go look at the dollar, the dollar looks to me like it is going higher, okay? The bottom line up 234, it's been solidating out here, it's having a hard time holding price. That being said, in order for the dollar to really get a lot lower, it has to go under 96, 938, and right now you're basically 17 ticks, 1700 ticks above it. Have a great weekend folks, have a safe weekend, come back and visit Tommy Monday morning, kicks us off 9 a.m. Have a great one folks.


What's up everybody? It's Jason here with jasby's casebricks.com just sold out 1920 Panini National Treasures basketball It is a four box case break picking number 16 We did have Team random and of course a 14 team random number block here So here are the customer names that are part of the random number block And then here are the teams a part of that from the Lakers all the way down to the Nets And then we got the customer names that are part of the break itself And if you have a little character sign you want that in a team So Steven got the Grizzlies and the pelicans in the team random, so I'm hopefully trying to reward him Having really hit his iron or jot it is so pretty much do it is pretty much my last opportunity so We'll see and I don't know if this is our last case. I don't really see much back there. So We'll see. Good luck guys. This is the break. This is the break Well, let's see if this is the break honestly because you think about at least I don't have to feel so bad that if The pelicans hit the Grizzlies don't hit, you know, he has both. So As long as I hit one of them I'm still gonna make him happy. He has one of the other So good luck Try not to do any tells this time like Because this actually kind of confuses me. I might see a pelican's logo at the bottom of that Right start freaking out, but it could just be a relic. I Won't know until a couple cards in if it's gonna be a relic or not All right, TJ Warren for the Pacers 33 out of 49 Indiana Pacers going to Brandon and the printing plate is for the Cavs Delhi Matthew Della dope Cavaliers, that's a random number block and I'm gonna go to the one spot going to Joe I dare gross 37 out of 49 Detroit Pistons Random number block 37 out of 49 7 going to Steven. You got another Detroit piston 24 out of 25 spot 4 Going to Steven as well. All right, we got Pidge Pajas Doryakovic 17 out of 99 Kings That is going to Joshua. I think the bottom card is gonna be a relic It is the bottom two are going to relics Romeo Langford to 99 Boston Celtics Going to run a number block three Good horn, and we got PJ Washington Jr. to 99 93 Charlotte going to Mike straight up Is that right David? Is that what everybody's supposed to look like? I don't remember if I look like that It's just so excited like my heart attack Badi is young 9 out of 99 It's got the shakes Couldn't handle it Chicago Bulls random number block nine Going to Steven last Bob Mojo, and then we got treasures of the hall George McGinnis Indiana Pacers 21 out of 25 And that is Indiana Pacers Winner Brandon There you go And we have a rookie autograph and it is Chuma O'Keeke 24 out of 99 Apprentice And that is Orlando magic going to Steven All right, Zach Lamine 89 for the Bulls Steven Terrio's here for the Boston Celtics printing plate 101 It's another R&B going to Joe Miles Turner's in 99 Indiana Pacers going to Brandon. Oh, is it Hornets? No, it's a Boston Celtics printing plate, so It's gonna go to what it is and this was from 1819. So that's why As it says Boston Celtics doesn't matter what team is currently on Kevin Love to 25 Cavaliers Going around a number block and that is eight Going to Warren Brogolopas Number 18 out of 99 Eight going to Warren Jeff T 70 out of 99. I Hope so. I I don't know but we have plenty of time to fill it though We need to do a couple of cell packs and sell some spots straight up, but if we can sell spots straight up I think we can Jeff T 70 out of 99 Hawks going to Matthew And we got Rodney Hood number to 25 24 to 25 Portland going to Warren. Dave Cohen Nine out of 99 A lot of nines in this one Yeah, I think it's sold for like I think it's sold for 115 or 113 But with the buyer premium fee they charged I think the total sale ended up being like 135 or something So the buyer has to pay 135 so they said that it adjusted it to that's the price is sold for and we got 45 out of 49 Zach Levine five for the bulls It's going to Robert. Oh, look at this. Well, I know someone's gonna like this. I think he's in the chat right now Don't look Kevin 45 out of 49.  Thank you All right, we got Jonas volunteers 33 for Memphis going to Steven printing plate is looks like sabonis Yes, I read us sabonis Portland Trailblazers Portland Trailblazers that is going to orange got that last Bob Mulder and the team And we got Qundari with a spoon colossal jerseys 72 out of 99 for the San Antonio spurs around a number block 72 that's going to Brandon and we got not see your little 65 out of 99 Portland going to orange We got James Harden for the Houston Rockets Houston Rockets going to Steve Locke and we got the Mantis of onus For the Indiana Pacers We got treasures of the Hall of Sam Jones 43 out of 49 Boston Celtics 3 That is going to Oran and we got horse grants 90 out of 99 ice autograph magic edition Going to Steve and the magic team in the 90s with Penny Hardaway Shaq horse pretty strong We got a redemption And it is Johan Howard National Archives, Inc. Platinum Let's take a look at that really quick Is that a one-on-one? Well, that should be one of the Clippers in right? Is that the Clippers? Johan are my thinking with different one Let's take a look National Archives, Inc. Yes. No, actually Washington Wizards, actually Card number 11 and there you go. Yes, Platinum is one-on-one And it is Washington Wizards And this is a perfect example guys This is going to go to the redemption spot because the Wizards are part of the random number block And even though it is a one-of-one for the Washington Wizards, it's going to go to Stephen K With the redemption slot spot zero So there you go, man. Very nice. The last one we have here. Ooh, very nice We have a vertical RPA and it is for the Miami heat 70 out of 99 and that's another hit for Stephen K in the random number block Getting spot zero. Wow. There you go, man. They couldn't get better of these Black Porter mags So cool. Makes it look much better That's a good one to keep though, man. Honestly, I mean You can get good money for it now, but I really think that he's going to be a stud So for you to get these two hits in a random number block and You got it in mosaic fast break with one spot or two spots. How many spots you had, Stephen K? I hold on to this because you pretty much got this for a super small fraction of the price That's a nice one, man. All right. Good luck everybody. Yeah, all NT cars this year are all one size, which is great They're all 130s block chain at the bottom. It's Nicolo Melly rookie patch autographs gold Which I don't know what the gold is What is this out of town?  All right, Julius Randall To 99 that's 51 for the New York Knicks little running play for the Suns. That's Tom Chambers 101 It's another one for the R&B one splot Or spots are I said splot? Joe I'm mad, but I I feel like I've been cursed Or not mad as much fire as I wanted to for NT, but maybe the NT basketball is my kryptonite the Marder Ozen for the Spurs, that's 65 R&B Five going to Robert. We got Romeo Lanker 20 out of 25 Boston Celtics Zero going to Stephen K. We got John Starks for the New York Knicks We got Malcolm Brogdon 674 out of 99 for the Indiana Pacers Leonard Brandon And we got Jackson Hayes. What a tease 26 out of 99 Pelicans that is going to Stephen we did get another true RPA. It is Admiral Schofield 20 out of 99 for the Washington Wizards and wow Stephen have yourself a break Another RPA ending with zero that is going to you Jeez and these two are relics Jason Tatum for One of Stephen did off with a Damian Lillard Relic 49 out of 99 Or I'm going to the Blazers And there you go, guys That was the break Unfortunately, no sign or job, but we did get a really really nice RPA of Tyler Hero 70 out of 99 and another vertical here with a Cody Martin. That was pretty nice As well, and we did get a one-on-one though. Although it was a reduction Put a one-on-one there And then the other RPA that we got out of here was Cody Martin A little horizontal Appreciate it guys. Jasper's casebricks.com