So we learned that if we have a position time graph given, we can find the velocity time graph by looking at the derivative or the slope of the position time graph. But what do we do if you have to go the other way around? If we are given a velocity time graph and we have to find the position time graph. Well, what's the opposite operation for derivations integration? So those of you that know calculus, the position as a function of time is the integration of the velocity as a function of time. Now those that didn't take calculus yet, this corresponds to the area between the x-axis, which is the time axis in our VT graph and the graph itself. So in this example, from zero to one second, the area, if you calculate it, was one meter per second times one second. So we had plus one meter of displacement. That means we know from zero to one seconds, we advanced by one meter. Now the problem is that doesn't tell us anywhere where to start. Those of you that took calculus know if you do an integration. There's always an integration constant plus C that sometimes you forget because it's just plus C in math, but it actually has a meaning in physics. In this case, it is the initial position. So in order to be able to draw the position time graph from the velocity time graph, you need to know the initial position. So let's assume my initial position was at one meter. So that means within one second, I went plus one meter. So at one second, I was at two meters. And I go on from one to two. Well, this is another one meter, one second times one meter per second plus another one meter. So at two, I'm at three. I go to three plus one meter again. So at three, I'm at four. And at four plus one meter again, I'm at five. Then for the next two seconds, absolutely nothing happens. I have no area between my x-axis and the graph. So plus zero meters for the next two seconds. So nothing happens. So five, six, nothing happens. And now it gets interesting. My velocity time graph is below the axis. So what do we do? From six to seven, what is my area? My area is minus two meters per second times one meter. So minus, sorry, times one second. So times, excuse me, minus two meters. So from six to seven, I went down by two meters. So starting at five, going down by two means I'm gonna end up at three from six to seven. So I'm here. Starting at five meters. And then the next square here is another minus two meters. And again, one second times minus two meters per second gives me minus two meters. So I'm going back to one meters per second. Now let's just try to make the best fit graph out of this. So it looks like six. This was our initial position time graph. And if you look at the previous videos, this is the graph that I used to create that BT graph.


I'm Barb Quick from the Tutoring Center, and I'm here to talk to you about GPA. First of all, what does GPA stand for? And do you know how to calculate yours? Finally, why does that one little number seem to matter so much? GPA stands for grade point average, and this can be applied to one academic term, which is your quarterly GPA, or your entire history at Western, which is your cumulative GPA. And there are reasons beyond personal satisfaction of why it's important to get good grades. Do you know what they are? Western requires a 2.0 cumulative GPA, or a C average, to make progress towards a degree, and that's the bare minimum. Many colleges and departments in Western have an even higher GPA requirement just to be admitted. These departments include the College of Business and Economics, the Psychology Department, and the Woodring College of Education. Finally, your Western GPA may affect your opportunities after leaving Western. Most graduate programs and an increasing number of employers look at your undergraduate GPA when making admission or hiring decisions. So where can you find your GPA? And how is it calculated? And what can you do to bring it up if it's low? Here's how to calculate your GPA. First of all, you'll need the number of credit hours and the grade for each class. For example, here's Math 114, 5 credits, and an A. Biology 101, 4 credits, with a B. Intro to Cinema, 3 credits, with a C minus. You'll need to change the letter grades to numbers. So the A equals 4 points, the B equals 3 points, and the C minus is 1.7. You'll multiply that numerical grade times the number of credits for each class to get grade points. Now total up the grade points and the credit hours. Finally, divide the total number of grade points by the total number of credit hours to get your grade point average, or GPA. As a student at Western, you have access to some great online resources that'll help you track your GPA. For example, to get your quarterly and cumulative GPA, use Web4U. After you log in to Web4U, click on Student, then Student Records, and then Academic History. For each quarter, you can find your credit hours, Q points, which equal grade points, and your quarterly GPA. At the bottom of the report, under Academic Summary to Date, you'll find your cumulative GPA. Another great online resource is the Academic Advising Center's GPA Calculator. There's a two-minute how-to video to help you get started, and if you need a little extra help, it also lists the Academic Advising Center's phone number. So to recap, GPA has a big impact on the following. Your academic standing, and that includes financial aid, clubs and varsity sport involvement, getting into any major or certain departments, receiving internships or scholarships, getting into grad school, med school, or law school, and even possible employment, if you don't have the experience to back it up. Thanks for watching our video. For more information about your GPA and how to improve it, please visit the Tutoring Center at Wilson Library 280. You can give us a call at<PHONE_NUMBER>, or check out our website.


Hey guys, what is up? Welcome to my channel. For today's video, I'm going to try and make it pretty quick. But I'm going to be going over the Muse Beauty Pro by this get that sale this year. So if you want to see some of my pics, kind of talk you through some of the things that you might want to pick up and just keep watching. Full transparency, I do want to start this video off with. I am an affiliate for Muse Beauty Pro. I've been for a couple years now. For the past couple of years that they've had this sale, I have made dedicated videos on it and just the feedback that I get. You guys really love this sale as well. So I will continue to do the sale video for as long as they have it. This video is not sponsored by Muse Beauty Pro. However, they do let me pick one or two sets that catch my eye from this sale that I can kind of share with you. So I did pick up one deal that I will share with you guys. Also, this is Muse's biggest sale of the year. Annually, they really have some kick butt deals. So I'm always excited to share this sale with you. I even shopped it myself the last couple of years even though they've gifted me some things. Some of the deals are really great deals or great bargains. So I find myself shopping this sale a lot as well. And I know you guys do too. So this sale is running from August 10th to August 21st. I would suggest ordering as soon as you know what you want just to make sure you get exactly what you want because this is their biggest sale. They have the biggest amount of traffic from this sale. And every year these are the number one deals that I always recommend from this sale. If you are interested in buying any Vizier palettes, this is the time to do it. They have the best deal on Vizier palettes. So we're going to start off with the first deal which is buy any two Vizier Pro Shadow palettes.  This by far kind of looking down the list is the best deal in my opinion. And if I didn't have basically every single Vizier Pro palette, I would have purchased from this also. I do have a Vizier Rankings video. So if you are curious about what I think the best palettes to get, I would check that video out. I will link it down below just to kind of guide you. That's why I do these ranking videos. But if you've been eyeing these, one of the Vizier Pro palettes itself is $80. So the fact that you can get two and then two Esum brushes and an eyeliner pencil for $128 is a phenomenal deal.  I can speak on the Esum brushes. They really are professional grade. They are beautiful quality. They are so sturdy. They're not going to fall apart. They're going to last you a really long time. And I find the shape of Esum brushes to be very unique. They fulfill a lot of artistry needs and I really think you will love the quality. I use them consistently in my makeup routine every day. And then I do also really like their eye pencils. They are dual sided.  These are the eye pencils that I actually use in my kit. So this is kind of the ultimate deal in my opinion that I would highly recommend. It's really fantastic. But looking at the other deals, you can get the Vizier Grande Pro Volume 3 palette and an Esum dual eye pencil for $140. Sorry, not just the pencil, but the brushes as well. So that's going to be $140 and this is a $255 value. Now the Grande Pro 3, it's not my favorite of the big palettes. I wish they had other options because I think the one and two are absolutely amazing. I prefer those, especially the one. The one is my all time favorite. But if you're into color and you think you have a need for this extremely colorful palette, this is a great deal for this palette. And again, same thing. Eye pencil is great and the brushes, I know you guys are going to love as well. So if you have a need for that palette, that's one to look into. Another one that they have is by any two Vizier Art Petite Pro palettes. You get a free medium shadow brush. This is such a good deal, you guys. $48 is a $96 value. But I believe you actually can choose the newer palettes that came out. So Vizier Art actually came out with two mini Petite Pro palettes recently. So this is the perfect opportunity for you to get those at a more reduced price. So that's a really good deal. I believe it's the Midsummer Palette and the Solstice Palette, yes. So that's a really awesome deal for those two new Petite Pro palettes. After filming this, I actually received them in PR. So I'm going to do a dedicated review on both of those palettes. So this deal might be something you want to come back to after I review it if you decide that it's for you. So just keep an eye out for that. And then the last Vizier Art deal that we have is by any two Vizier Art Edit palettes.  This is a $102 value. These Edit palettes are some of my favorite from Vizier Art because I feel like you get a lot of different variety and colors in a small palette. So they're perfect for travel. They're a fabulous formula. The Dark Edit is my absolute favorite. I recommend you get that one if you don't have it yet. And then also the Paris Edit. So I highly recommend the Dark Edit and the Paris Edit. Those are my two favorite Edit palettes but anything you need. Great time to get these. And then next, let's get into the brushes they have. If you buy any Isam brush set, you get a free brush book. Like I said, I absolutely love the Isam brushes. I just think they're so unique. I don't have another brush band like the brushes that they provide and they are really great quality. They have amazing shapes and they have a lot of different brush sets for you to choose from. That's something that you're going to have to go to the website and take a look at. I would say the Everyday Eye Brush Set is a great one to start off with or any starter kit. I just love them. And then the Brush Book is another item that I love to use for travel. It's really fantastic. It's a sturdy little book and then you'll unzip it and you have spots for your makeup and your brushes. It's really, really awesome. So this is a decent set. Like I said, the Vizier is definitely what excites me the most but if you are in need of brushes, this is a great way to go. And the price is just going to depend on whatever brush set that you decide on. And then if you love makeup bags, if you buy the Isam makeup kit bag, you get a free Isam brush book as well. Right now, mine is not filled because I'm not currently doing makeup right now on clients. But it's huge. It has a nice strap and it holds a lot of makeup very well. Or even if I'm going on vacation that doesn't require me to be on a plane. I'll carry all my stuff in here and I'm so sorry mine. It's all messed up because of how I have my makeup kit organized currently. But you can see it's huge and these Velcro spots, they have amazing little square bags that fit in here perfect. I love this makeup kit. If you are a huge makeup lover, I do recommend this. You can fit so much of your makeup when you're going on vacation. It's not small. It's not compact at all. But you can hold the makeup that you want to bring in there if you're like me and the makeup that you bring on vacation with you is very important. And that's going to be $112. This is a $240 value. I think it's worth every penny. I love my makeup bag so much. And let me share with you the deal that I personally picked out. And this one I wouldn't necessarily recommend to everyone. But if you do makeup artistry, I'm really excited to try this out. So I can't speak on the quality of this quite yet, but this is something that has been catching my eye forever. So it's by any Kit Fix Powder Foundation Pro Palette. You get a free Esum X57. So what this is, it's a foundation palette and look at all of these different undertones. I chose the light one. I do want to get the darker one eventually, but I just love all of the different tones here. And like I said, I haven't tried the product itself, but I'm really excited to put this in my kit to add a little bit of extra coverage and powder. Ooh, then you get the Esum X57. So this is my personal one that I've had for a while. I use this every day when I was going to work because I applied powder foundation every day. So this is a perfect tiny little dense kabuki brush. It spreads the powder foundation out beautifully. You get so much coverage with this brush. It's one of my all-time favorites. I want to put this in a giveaway for you guys because it's an amazing brush. It's very pricey, but I also want to keep it because it's my favorite brush for powder foundation. I don't know, but this is like worth every penny even if you just buy it for price. And then a couple other deals that might be worth looking into. I use these Luxe Cream Palettes in my makeup kit. This is the Dynasta Myricks Luxe Cream Palette and it also comes with a W19 Philber lip brush and it is $35, a $62 value. I don't think that this palette or these lip palettes are amazing as a makeup artist for bridal. I really do enjoy the colors in here. I think they're a bit brighter than what most of my brides prefer and these aren't long-lasting colors. So just keep that in mind that it's not an actual lipstick palette. I would say it's a lip cream. So it's a hybrid between it's a little bit lip glossy and a little bit lipsticky but not too far on either end. So I don't love these and they're also, they have very cheap packaging, which I don't love, but I do like having these in my kit for options. So that's something that you might want to look into. $35 for both of those is a really good bargain. So if this is something you are interested in, that's a very good deal. Okay, and then the last set that really caught my eye to recommend to you guys is if you buy the Isam Eye Pencil Trio, you get a free pair of lashes in a box. I just really love the dual eye pencils, you guys. I think they're awesome. Like I said, the metallic side doesn't get as used from me, but they are useful to highlight the inner corner or brighten up the waterline. But the matte side, they have a plum one, a brown one and a black one and they are really a great pencil. I use them regularly in my routine, in my makeup artistry kit. They're one of my favorites. They apply just so good to the eye. And then I do like lashes in a box. I don't think they're anything different from like our Dell lashes. I do have a few styles that I do really enjoy and it's just a nice natural pair of lashes that you can get for $33. I think that's a really good deal, especially for those eye pencils and then you get a nice pair of lashes added onto that. All right, you guys. So those are kind of my top picks, my recommendations for this year's news by this Get That Sale. Again, great time to support a smaller company during these times. And if I were you, I would definitely try to get your hands on some of Vizzy Art Palettes. Seriously, I think these are the best deals that you can get on Vizzy Art Palettes in general, no matter the sale. If you're looking for some very nice high grade brushes, look into a brush set because they do have really nice makeup bags as well. So that is all I have for today's video. I hope you guys enjoyed it. If you aren't subscribed to my channel already, I would absolutely love it if you would consider taking the time to do so. And I will see you guys in the next one. Bye, guys. Have a good one.


So we're here with Alman. Yes. Hi, please introduce yourself Who are you? My name is Dongni. All right. Welcome to our boys. So what do you do here? You have some Wireless charger super fast charger. Yes, and a super fast charging cable power band and wireless chargers What is this? Power band.  Yes. That's cool Yes, so cool. This one how much the price may be around is about 15 for how many pieces 500 500 pieces. Yes. It's high quality. What is here? What is this about on this side here with just a Some transformer system, but you have transfer here. Yes. Yes. Transparent here. Yes And this people can see you how it is inside. It's very cool. Yes. Yes You have other things like this or this is the only product to do like that And this one is so cool. This one is Google G Like a mini Power on this. Maybe you can use another power bank. Yes. Oh, oh, yeah speaking. Yes What is Charon and speaker and the clock?  Yes, or Gain some other name with G They will have a lot of fun with this. This has speakers under here. Yes We can put your phone there to charge. Yes. Yes, and what else will do with the light? We can we can use the phone to control that the light and the RGB light Wow, cool. Yes What what do you show here in the front? What is this cables? The special cables or? This is the special cables for the USA market. Why? What's special about it? Long and stronger and fast charger. Long, strong, fast. 10 feet. Yeah, you would say they love extra extra large. Yes. Cool. Yes. Strong cable. Yes. Fast charger. Lighting. Yes. Type-C to Type-C. Type-C to lightning. Nice. You sell many cables? Yes. How many? You make millions cables? Of course. Really? Yes. And you have all these different designs for your cables, huh? And do all of them support 100 watt charge? 80 gigabits per second. What is the limit? How much data? How fast can the data go? How much power it can go through? You mean the cable? Yeah, it's a kind of charge fast. Yes. Because here you have a 140 watt. Which one is this? This one? Yes. So which cable to use with this? Which cable? Which cable will work for this? The 100 watt. 100 watt. Yes. So there's a 100 watt on one plug and there's a 20-20 or something like that? No, no, no. If you use the same goal, it's the 140 watt. And if you use the satire, it will be 120 and an adapter is 20. But don't you need a cable that has 140 watt then? Yeah, of course. Not the 100 watt, right? 140 is a different cable? Yes. And but you have them? For example. So these are certified for 60 watt? Yeah, yes. We got the 100. 100 somewhere. But you don't have the 140, right? Yes. But all these cables, do you certify them? Do you put the logo about watts? Of course. Okay, you put the customer logo on it. Yes, yes. All right. Cool. How much the price for this maybe? $27 for 500 piece? Yes, about. All right. Cool. And how about this? This charger? This charger is about $22. All right. Yes. And it's very safe. Good quality. It will not break. Of course. It will not start a fire? No, no, no. Okay. No fire.


Hello. This is a video about conducting a goodness-of-fit hypothesis test. You're conducting a multinomial hypothesis test with a significance level of 0.05 for the claim that all five categories are equally likely to be selected. So let's complete the table. So I have five outcomes or five categories. And when I actually counted those outcomes in the categories, I'll have the observed frequency. But then we have our expected frequency, what we were expecting to get. So what you do is you take your total outcomes here. We'll add up this entire column to get 67. And then you want to find out what does the expected frequency have to be in order to be the same for every category. So you take those 67 outcomes and you split them up evenly among five categories. And it looks like you get an expected frequency of 13.4. So 13.4 would be your expected frequency for all the categories. And then once again, that's because it said in the question that the claim was that all five categories are equally likely to be selected. So they're all equal. Now to calculate the test statistic degrees of freedom and P value, we go to Google Sheets. Google Sheets for goodness of fit. You are going to go to the Chi Square tab. You're going to choose goodness of fit from the drop down menu. And then you will type in your rows and columns of data. So column D, type your categories, your column categories. The labels for each row A, B, C, D and E. And then do your column headings you have observed. You have expected you don't actually have to write out the full title if you don't want to. So observe was the following numbers 22, 17, 5, 13, 10. Expected frequency would be all 13.4. Now, give your Google Sheets some time to calculate. Takes a little while to get the test statistic. Chi Square is your test statistic. The reason why is because anytime you do a goodness of fit test, it uses the Chi Square distribution. So it looks like the Chi Square test statistic is going to be about to three decimal places, 12.627 degrees of freedom or four. And the P value is about 0.0132.0132. So let's jot down that information. So my Chi squared, that's what a Chi squared symbol looks like. Test statistic is going to be 12.627. Degrees of freedom is going to be four. And then your P value is 0.0132. Now, to come to a conclusion about our claim, we need to compare the P value to alpha. So let's compare our P value to alpha. And the goodness of fit test, your null hypothesis is always that the frequency counts agree with the claim distribution. And then the alternative hypothesis is frequency counts do not agree with the claim distribution. Since the P value is less than alpha, we do reject the null hypothesis. Remember the null hypothesis was our claim here. We claim that the frequencies occurred all with the same frequency in each category. So we rejected the null hypothesis. It's rejected. It's gone. We need to write a conclusion statement about our claim. Well, we rejected our claim. So we say there is sufficient evidence to warrant rejection of the claim that all five categories are equally likely to be selected. And that's how you conduct a goodness of fit test.


Thank you. My opening line was going to be, I guarantee that the rest of the presentation isn't going to be as entertaining as what Adam just did, but hopefully it's more informative. So the original title of this was Advanced Architectural Patterns. And as the conference has been going on, I've been watching speaker after speaker come up and talk about these great patterns. And I've been very psyched. On the one hand, on the other hand, I'm like, what am I going to talk about in my presentation? Because I'm going to be talking about a lot of the same things. But my approach is going to be a little bit different because I'm actually going to be showing a lot of code. And so actually just recently I went through the exercise of trying to take a classic backbone application and refactor it to use some of these patterns that I've come to learn and love. So with that, slide number one, I'm going to get right into code already. And yes, I'm using to do MBC, yes, that is. I think it's a good app to show. I know we've all seen it before, but we all know the code intimately. And so I don't have to spend a lot of time telling you what the code does and what everything is, I hope anyway. So if you're not familiar with to do MBC, it's fairly simple. I need to do a task. You can add tasks. You can mark them as complete. I think I can bring the font size down a bit. I can clear the completed ones. I can filter just to see the active or completed ones. Let me complete one so you can see it gets the idea. Okay, so let's take a look at the code. HTML5, we'll see that. We've got some interesting things. I'm just going to point out some interesting things. And the reason I'm pointing them out is because I'm going to be refactoring this code over and over again. Actually, there's seven versions of this. I thought my teammate, Brian Cavalier, often he does his presentations this way. We generate, you know, seven versions of code and demonstrate each one. I thought I could beat them with eight versions, but I'm the biggest match. Anyways, I'm going to point out some things here. We've got a style sheet in the head and we've got some interesting things here. We've got some IDs that point at interesting things in the body. We've got these embedded templates in the popular fake script style.  You know, pretty, pretty classic. Here we've got a JS folder and we've got some modules here. This is using the module pattern. The first thing we see is the classic example of using the module pattern. Ensuring that we have a global. We ensure that our global exists and we proceed to use it as a namespace. And start decorating it. You know, the classic pattern here. You can see some other examples here. We use this app variable in the things we've decorated all throughout our code. So what's wrong with this situation? I don't know what's wrong with this guy, but what's wrong with this code? First thing is there's lots of script and link tags. It's actually only one link tag. I just was looking at an app the other day and had seven links and then 26 script tags in it. You know, these are blocking. So basically Chrome does a good job of trying to make them as synchronous as possible. But you can actually watch the waterfall in the network tab and you can see that there's actually some blocking going on. So even in the fastest of browsers, all these script elements and links are slowing things down. And how do you do dependency management? In a reasonable size app, how do you manage this stuff here? How can you reasonably call this? Basically, you're manually ordering these script elements here. And the other problem is, of course, global. We've heard time and time again, goals are bad. Identifier conflicts is just the beginning of it. The real problem was what I showed before, and that is that I have to read this entire file here in order to see where the dependencies are because browser globals are way too easy to use, even when you've namespaced them. So now there's dependency here on this to-dos thing. And I have to read the code to know it. So module systems will help us out here. And actually ES6 does a really good job of doing that. And like I said, because it's so easy, it's an exercise in self-control. There's nothing we can do really. I don't even know if the linting tool will help us out enough in order to stop creating this massive dependency graph. I think it was one of the guys yesterday showed a dependency graph. And that's a typical dependency graph, I think, that you get just from using globals and not thinking about, very carefully thinking about your architecture. So yes, a great solution is to use JavaScript models. And let's take a look. I did a refactor on that. Okay. So the first thing I did is let's take a look at index.html. See that the style sheet's gone. Let's show you where that goes in a minute. And again, these are my patterns. These are my favorite patterns. And there are many ways to do this right. So I'm not going to get up here and start stomping and say, this is always the right thing. But you guys will notice that there's no more script elements in the bottom. And there's just one in the head. We can put this at the top and we can put it at the bottom. It really depends on your overall strategy. If you're going to try to get some content up to the user first or if the content's really described in your application, your application is going to build the content, then you can put the script text anywhere.  The HTML is that it really doesn't matter too much what the script element goes. So you can see that this script is actually going to pull in. It's going to pull in curl.js, which is a module loader. And let's take a look quick here. So before, the way this was structured was a JS folder and all the JavaScript was just showed in this one folder. And Tim was making me feel really nice when he showed basically this component-driven structure for the application. This is my favorite way to do it. So I created, I didn't want to break this up into too many small components because it just would have been a myriad of files. But I wanted to break it up into at least some components. So this is to-dos folder where I put all the to-do-ish stuff. You can see we've got, we've got a view here for to-dos. I'm using common JS modules here. You can see that the typical common JS, we're going to require a few essential things. We're going to require a few application-level things. And then eventually we're going to export something. This is going to get configured. I agree with Tim. Config step and application launch should be separate processes. So I just split them up here. And this is just a typical, you know, require JS slash AMD config. All right. So what's the advantages here for modules? The module loaders are obviously non-blocking. This is going to go fast. You can better organize your code. The appendage management is all built in because of these requires. You're being explicit about your dependencies. Namespacing is actually configurable. I can change this namespace and all the dependency management is to work. And most importantly, the dependencies are explicit. There's nothing stopping me from taking this require, though, and embedding it somewhere down in the code. So there is a certain level of discipline that needs to happen with common JS. With ES6, that's actually fixed because you can no longer embed the import statements or the export statements down somewhere in code. They have to be at the top level. So they're always, they're much more visible. So the problem of visualizing the map by looking at the source code gets a lot easier. So yes, thank you, Tim, for going over all this stuff for me. So let's take a look at this. I just did look at that. But what's the problem with this? There's still a lot of dependencies. If I go back in here, look at this module right here. It has six dependencies just to get started. I don't like that. I am actually anti-dependency. I will get rid of every single dependency I can. And that seems like a really strange thing to say because you need things to come together in order to make your application work. I'm going to show you a few strategies here. One of the reasons I do not like dependencies is because when I go to write my tests, now I've got to figure out how to mock or stub those dependencies so that I can isolate the thing that I'm testing. And when you're pulling them in with require, that means you have to mock, require somehow or circumvent it because now it's a system that's actually bringing in your dependencies. So one solution to deal with this is inversion of control. And in a very quick summary, inversion of control is strategies and patterns where instead of trying to grab resources from within your code, the code, the resources and dependencies are injected in. They come from outside. And so this actually gives you a lot of flexibility. And we're going to go over three of these very quickly. We're going to go over dependency injection, AOP and this composition plans. So dependency injection is, oh, we saw it yesterday. So that's great. I don't need to really go over into much detail. But as we saw presentation yesterday, you can inject dependencies into the constructor. There are other ways to inject dependencies too. You can inject them as properties. But the way the backbone models and views work, they really need to go into the constructor because you're going to be working with them pretty much during the construction phase of the model of the view. And this prevents you from having to mock the environment because programmatically we're going to be inserting things rather than allowing the system to give us the things we want. And this also makes it easy for the implementation of that thing that's injected. The dependency can change from moment to moment. So you can start up your app in a different environment and inject other things, whereas with require, you have to go through this mapping configuration to get things to switch around. And you can actually make runtime a thing inside what to inject if you're injecting rather than requiring. So let's take a look at an early version of that. So with this version, all I did was change some things around. You can see there used to be six dependencies here. Now there are only three. And instead, I'm doing something very similar to what we saw the other day, and that is using the options of the initialized method to inject some of the dependencies. So specifically here, I'm injecting to-do filter and to-do template. So I'm injecting this to-do filter here, which is an embarrassingly small module. Let me back up a second. When I first just converted over from globals to modules, that's all I did is took every single global, everything that's hanging off the global, and turned it into a module, so that's why I ended up with this one here. Don't worry, we're going to get rid of this module later. I'll show you. The other thing I'm doing here that Tim showed as well is using text templates as modules as well. So these get pulled in as requirements. Just thinking I should have showed what that looked like before we went with dependency inversion. Just to show you one step at a time. So let's take a look at what this looks like now. So view, like I said, now only has what I'm calling infrastructure or essential required now. So what's nice about these is, obviously, we're going to be coding against these. So it's great to have them there available to us while we're defining, while we're authoring this here. To inject these would be just kind of weird. The other thing is that during testing, you kind of need to trust something somewhere. So in tests, can you trust these things? And I think the general answer is yes, you need to trust your third party libraries. And so I'm not worried about the required here or not having to stub these because I'm going to just trust that they work. So again, here's another view. All that requires here are the three essentials. Injected are the other things that it uses. If you remember, this deduce was app.deduce before and it was just streamed throughout the app now. I'm making it a property and referring to it as a local property. Let's take a look at main.js, which I'm going to show you what the difference is here or your .js branch. Okay, so main.js was pretty simple before. Main.js basically just to get the application running. There's this little work around here that I was having some issues with backbone, not automatically adding the jQuery. I don't know if it's supposed to do that automatically in common.js or not, but it didn't seem to link that. And then our application is really simple. We create a view, create a router, and then just start up the view. And actually the router code itself would actually start the history. Now our code in main is a little more interesting. We're pulling in all of the components that were interested to get the application started, requiring them here rather than all over the code. We're bringing them into one location. And we're creating some interesting things here as well. One problem with the original source code was that some of the modules defined instances in some of the defined classes. And I switched it over to all defined classes. So that now it's doList, actually defines a toDoList instead of a toDo's. And we create the toDo's here and then inject it into our application view as an option. Similar with the filter, the filter. We require it in our main and then inject it in the places that it was needed. So what have we done here? We've moved all those dependencies that were in each of those files into one central location. And the central location now is in charge of creating all of these modules that we're using and making sure each one gets a reference to the dependencies it needs. So why? What does that do for us? And the answer is not a lot holds so far. The first thing that it does is to eliminate some of these dependencies so now I don't have to mock them at the require level, at the environment level. Instead I can just inject something. And that thing I inject, obviously, is going to be a mock our stuff. So like I said, this is just a halfway point. This doesn't feel compelling to me. This all that dependency injection was, I would be like, okay, but don't worry, this is the halfway point. You'll get all the way through and you won't have cows laughing at you. So there's a problem here, though, and that main module went from a couple of lines of code to all this. That feels kind of big. But what can we do about that? So let's break it up a little bit. Rather than have one big, you can imagine in a larger application, this doesn't make any sense. You can require all these modules all over the place. You can have this huge long list and then try to figure out how to push everything in the right place. So what we're going to do is I'm going to introduce a concept called composition plan. And to do that, I'm going to switch over to the D92 branch. Okay, and let's see. What's different now? This does look a little bit smaller. At least in terms of requires here, but something changed down here. I'm going to make this font. This is font just right, or can I make this smaller? Okay, so before we had everything in the entire app coming in, and now we've got a much smaller subset. And down here, we've got a whole bunch of extra stuff going on, and I'll explain that in a second. Excellent, explain it right now. Globals are bad. In the DOM world, an ID is basically the same thing as a global. And it's also a resource. It's a dependency. We have a dependency on something. It doesn't have to be JavaScript code. It can be a text template. It can be a CSS file. It can be a DOM node. So in this case, I've gone the extra step, and not only am I removing the dependencies from within the view of knowing exactly how to select things out of the DOM, I've moved that out into the... Move that out into this main already. And this main application has... is what is going to turn into my composition plan. So the other thing I did here is to create another main inside the to-do folder itself. So this main is itself also a module that has a little bit of a composition plan. And composition plans are basically more modules that describe how to put modules together. It's more than that. You describe the entire life cycle of these modules. So it describes how to create them, how to initialize them, how to connect them, and ultimately how to destroy them. And if we create them right, if we have some structure of how we can create them, we can actually make them so they're composable. And so that's what I did here. So here's a composition plan to use section of the application. And you can see that here's the create part of the life cycle. And we actually have a destroyed part of the life cycle as well. The main module pulls that to do composition plan and actually uses it as part of this composition plan to compose the entire application. So you can visualize as you're breaking your application up into these feature areas, these components as multiple people shown on the screens, they like to take the parts of the application that you see on the screen and break them up into various components on the screen, each one with its own view, its own model, its own controller in a pure MVC. But each one also has its own HTML and potentially its own CSS as well. And if I broke up the CSS in this app, that's exactly where it would go to go along right alongside this HTML. So one of the other things that I was able to do was to remove the router.js altogether. Realistically, in an app, router would be more involved, but this router got so so simple that I removed it as a module and brought it right into the composition plan. So now this is starting to feel like, okay, we've got these things here, these composition plans, they're kind of like their own component that's in charge of creating and destroying and initializing and bringing together other components. So this is starting to feel like some sort of pattern, some sort of strategy. And the end result is that the components in here have less dependencies and therefore are a little bit easier to test. And the fact that I have removed the hard dependencies on DOM nodes that are exist in the DOM, then these could also be shimmed. We could load a slightly different environment in the test for our test harness than in production so that we could inject these nodes and then no longer have to set up an exact copy so we can test in whatever environment we see fit, including being able to do something in PhantomJS or a server-side DOM engine. So, again this pattern it's still feeling like am I really getting the benefit I want out of this? When is this going to feel like the right tool? And what's the problem the problem here? There's still some big problems in this code in my opinion and one of them is that we're abusing the model to send events. So one of the things that a user can do in the app is to use this filter down here to decide which of these to-do items are visible and which ones aren't. So here the current app does that is by iterating through all of the models and sending an event on them whether or not it should be visible or not and then doing some calculations by comparing to its state versus this list of hard-coded states to decide when it should be visible and when it shouldn't. So it's iterating through this entire list every time you hit one of these it iterates through all these lists and decides to render or not render a particular item. So that's a lot of code to do that. And why are we using data events for doing view type things? Because this really is a view thing the data itself has to do it to-do tasks that doesn't have anything to do with what you're filtering on the screen. So what can we do about that? One way to solve this problem is through AOP. I'm familiar with AOP you already know that it's a way to provide additional behavior to a component. So and it's done through through decorating the methods on that component. So you've got a component A and you want to add additional behavior you can decorate its methods to give it the additional behavior. What's nice about that is that it's not invasive. So if you change the code of this thing at runtime or at compile time you actually add the additional behavior so that the code stays the same, the code stays you don't have to do any additional tests you actually only have to test the additional behavior independently from the component that's being decorated. And what we call these things that this behavior that's added aspects are basically two things one is the behavior itself which we call advice and then how that's applied. And in the simplest case that advice can be applied either before or after the function runs. So if we want to decorate this object here but before this method runs here we want some other thing to happen we would give before advice to this method if we want something to happen after this method runs we give this method after advice. And what's really really nice about this is that the decoration itself is not embedded in the code somewhere it's on the surface area of this object and because it's on the surface area number one this object doesn't need to change directly the code stays the same the second thing is that it's easy to see that because of the way it needs to be applied it's easy to see it's easy to see the dependency or actually I'll show you there's actually no dependency but it's easy to see that something's been added instead of having to read every single line of source code. And of course this helps you follow the single responsibility rule of a module modules should have one responsibility and this behavior is wildly different some sort of side effect then you're not breaking that rule of that solid rule of single responsibility. So I'm going to show this now switch over to p branch see what changed here so number of things changed here first thing that changed is we got rid of this event on the model that we were using we were using this data level event to describe what really is a view level event and then get rid of all this code in here that dealt with toggling x when we just changed it I'll get rid of it I promise so we changed that around a bit so that we made it a little easier for us to refactor and call it I'll show you that in a second so in the main here I added this library called meld meld.js it's part of the Kujo library and it is an AOP tool it lets us add this advice to before and after the advice is around after returning and if you only want to add this behavior to happen when something throws or after it doesn't throw it's got all these built in and I also created this mediator and this mediator is going to embody this additional behavior so I'm going to take the behavior that was inside that view and I'm going to pull it out to this mediator and then we'll apply it and I'll show you how that works here's the mediator I added another part of the life cycle of this this composition plan here and during the initialization phase of this composition plan I'm going to be connecting things together so I'm going to take the application the main view when the filter all method is called on and filter all is the method that gets invoked when you click those click these guys at the bottom here these links down here when that gets called it's going to call mediators set filter method before that it gets called and after it gets called it's going to call the mediators refresh views so before filter all you used to listen for these change events the important part is when you clicked on that like I said you used to loop through the to-dos and for each one you used to call the filter one and trigger this visible event which of course went back to the to-do view and performed this calculation to see if it should be visible or not and then hit or show it in the render method so we're doing all this stuff and now all that is pretty much gone all we're doing now is calling the render method which is actually just redrawing these guys at the bottom here to keep those up to date and that's it that's all that filter all does now is just save a value so that the render method can use that to decide which these should be showing now I love that I'm going to get rid of that too I promise so this behavior is now in this mediator let me show you a little bit more of main and then we added some more after-advice to connect up more things in the mediator and so when the application creates a new to-do item we're going to save that to-do item because remember now that in view before we used to have to loop through all these to-do items and decide which ones were hidden which ones are shown and I've moved all this over to the mediator so now when we create a new to-do item we need to keep track of that and when we destroy one we need to keep track of that and etc so this create to-do view I've added three new behaviors to it and after it executes we save it to do a view we advise it to do a view and then we run this toggle hidden hidden because the initialization of this to-do item we need to decide whether or not that's hidden when it's first created so let's take a look at the mediator so save to-do item we're just going to keep track of these to-do views in a in a hash there's all sorts of ways to save this advise it to do view once we've gotten a new to-do view we can also add some behavior to that and I could take this and put it into a different mediator but I just put it here to keep it all together so every time one of those little to-do views renders we also toggle it to see if it's hidden or not so we do it right during the render there so each to-do view is in charge of toggling itself and then when that to-do view is removed we just remove it from our global list so we're sure that this hash is always up to date so all of that specific logic that was embedded in the view about deciding when to hide our show is now in our mediator here so this mediator its sole purpose is to hold on to these little views and decide whether or not they're going to hide our show so we took that out of the view whose job was to manage the overall view and we took it and we moved it over here what's nice about this is this is extremely easy to test these these functions are seriously easy to test and now because we took all that behavior out of our view that view is also now even easier to test so there's still a major problem here and that is why are we looping through all these things to do something that seems like should be really simple all this DOM manipulation at least the beginning has been bugging me I'd like to get rid of that because DOM manipulation code is code you've got to test and DOM-oriented code just by its very nature at least to me is a lot harder to test than just pure JavaScript so I really, really want to get rid of that so one way to get rid of it is with OOCSS states and so if you're familiar with OOCSS or other structured ways to write CSS the main principles are to separate the the presentation from the structure you know the theme from the way it's laid out on the page as as stubborn Ella Nicole likes to say you know separate the structure from the skin and OOCSS states adds third dimension to that and that is you can actually describe in control application state in terms of the DOM using CSS and so we'll take a look at that here there's a new file here called states.css made some minor changes in these files here there's a new option I'm going to be injecting something called filter classes here and as I promised I'm going to be destroying this ugly mess over here and replacing them with something a little bit nicer and there's a new method called set state classes which is a way that we're going to you'll see that we're going to translate from what the designer because we're pushing some of this job onto the designer what the designer is defining for classes versus what the engineer is defining for classes and we're getting rid of that mediator because I really didn't like that mediator it was a great concept but as soon as I wrote it out I was like this needs to go away because all this DOM manipulation code so we got rid of it in the view the view now does purely what the view is supposed to do and then we're going to get rid of it in the mediator here and move it all over to css so let's take a look at this css really quick so just a couple of rules here that define whether or not something displays or not so we've got basically some display nuns and display blocks and also some other things here that we're going to change the font weight onto things and so if you use your mind a little bit you can figure out that these are the filters down at the bottom that we're going to change and then here we're going to change some to-do list items so what we've done here is we've defined some css classes that define the visual state of the things on a screen are basically our views or pieces within the views so these guys here are to-do items and these filters down here we're going to define those the states of them whether they're hidden or shown or selected or not selected by these css rules and when you use these we're going to apply these instead of all of our DOM manipulation code in order to change the state of the app and the huge benefit there is basically moving all this JavaScript over to css and css is really I mean that's what this job is for is to manipulate the DOM or not manipulate the DOM but change the state of the DOM so let's take a look at that real quick okay it told me I had 35 minutes left and I was expecting that that was not correct so I guess I have 2 minutes left so let's do this real quick I didn't want to pop up on the screen I didn't bother doing some css okay yes let's take a look at this so let's just verify that this still works let me reload this so here's the to-do list itself the to-do app so here's the to-do app and you can see it has a class called all on it and so basically I'm going to set these states on the top level of this view so run out says all now let me do something interesting now I'm going to click on active that one goes away and we can see up here now the class is active can you guys see that now the class was set to active let me go back just in case you missed it so all completed so what's happening here is the css rules are now being applied and all that we needed to do was to change we didn't do really any DOM manipulation except to change an attribute so all of that the looping code that we had in there to loop through all these guys or keep track of them or do whatever it's all gone all we do now is change one attribute and then these styles kick in and let me just show you one real quick here it is right here here's the class that we had defined in our css file these conditions are satisfied so basically what I've done is that completed class right there describes an application state so if the state of the app is completed and the state of this particular to-do item is completed then you can see that display is blocked but by the way we set up these classes the application state is completed but the list item itself to-do item is not completed then display none so bang so we got rid of all that code and so I love that that made me happy when I did that so time warp just in time because I'm out of time you can imagine that eventually we were going to refactor more and more pieces and more and more pieces and we only really get about into the immersion of control principle here and then I threw in the OOCSS just to help get rid of some code but what I want to show you next is a little bit about data binding I'm going to do this really quick and I know data binding is one of those ferocious topics and everybody can do you love it or you hate it again I think it's just one of those tools that you should use if you want to rendering is great and data binding works really quick and one of the reasons I love data binding is that we all worry about instantiating and destroying our JavaScript objects but the DOM itself is a way bigger hog of RAM than our JavaScript objects in many cases so that's not universally true and just in this to-do MVC app itself every time you added a new to-do item the main view was re-rendered five times and so basically it was re-rendered and let go five times in a row and garbage collection in the browser is not very good because the browser will basically not do it as much as it can and just keep grabbing more RAM off the operating system as much as it can until the operating system pushes back and that's why you have to restart Chrome or Safari or whatever every couple of days because it ate everything up so we're going to look at this a little bit anyways so anyways I do think that there are solutions that you can can do with your rendered views to try to bring them as small as possible but data binding solves a lot of the same things and I'm actually going to show you a version of data binding that has clean templates and there's a nice benefit to that and that benefit is because you've got these clean templates that are pure HTML and pure CSS you can actually get really good separation and that allows parallel iterative development between the design team and engineering team let me show you just that really really quick so I am going to totally cheat and rather than totally keep refactoring and factoring we started with a pure Kujo app this is the Kujo reference app and we went back and we put in back bone here here are the different components of the app we broke up the control section where the filters are the create section which is the part of the to do let me see up here this is the create section up here to create a new to do we have the footer section which is the part down here at the bottom and we have a list section which is this entire part in the middle so we broke this up into tiny components each one has its own HTML template and and then we have got some top level application things here so let's look at this controls for the quick here is the HTML template itself one thing you might notice that is missing is you know the familiar if statements and other things that you would find in you know mustache or templates instead this is really pure HTML and with these other kinds of tags in here and actually I'd love to show you one that this tag is missing because you can actually build this without any tags at all in here what's nice about this is this real HTML here this will actually run in a browser so what that will allow us to do is to actually create a design harness and so I did that I created this design harness called controls what controls does is loads just that piece of the app and put it up on the screen and I'll show you so this is just the control section and I can play with how it's supposed to behave in the real app real app and with one of these left this is supposed to go away this is not going away there it goes okay so it goes away so I want to just test that behavior here me the designer want to make sure it works correctly I can test to see if there are zero or many to do items and I can test to see if other things happen as expected so for instance if there's only one item left I want this to read item left I can test this so I'm testing this component in isolation and what's really really nice about this is I don't even need any kind of back end system to do this because these are standalone unit all these guys here they don't rely on any kind of back end system all they need is some way to load them and so if we look at this controls harness here all it consists of is CSS that we need a couple of buttons that we saw at the top and this is DOM zero type stuff on click then handle as any designer can deal with this stuff and then this boilerplate script that the designer just needs to sorry this one down here to make sure the designer cuts and pastes that in there and then this is pretty much done so anyways I hope that gives you a couple ideas about some alternative designs design patterns and if you want to find out more about some of the tools we didn't get to look at many of them today but we've got a lot of tools in the Kujo Toolkit now and you can go do that and here's some resources we've got some great tutorials out there I really encourage everybody who thinks they want to learn a little bit more about some of the things we have in our toolkit to go and take a look at them and if you're interested in a more thorough investigation of IOC this is one of the best articles on the web thank you very much


My name is Tim Hunt. I'm here to talk about the future of science education. How do we encourage the next generation of young scientists? How can we get out the best, find the brightest, best young minds? I think in many ways they don't need much encouragement. I think the young scientists will encourage themselves. But we shouldn't put obstacles in their way. That's really important. And we should also encourage sort of romance and fun and playing around. There's a little bit of a problem with current education methods. They tend to be a little bit serious. Most of real creativity comes from playing around with things, you know. Playing, seeing what works, seeing what doesn't work. That kind of curiosity and playfulness desperately needs encouragement in my view. I can, you know, only speak from my own experience. I wanted to be a scientist from a young age because of a wonderful teacher. And that remains an excellent model. And one of the problems we face is how to get specialist people with the knowledge required to go into the teaching profession. It's not clear, for example, how to make the teaching profession more attractive to people who really know what they're talking about. And this is perhaps one where, you know, governments have a role because they mostly pay the teachers. And the question is, you know, should there be special incentives for highly qualified teachers? We need to encourage at least one generation of discoverers, people who are able to recognize the unusual, the unexpected, and then to make sense of it in a totally honest, truthful way and to communicate that to their peers and to the rest of the world.


And get a second Quicksilver It's going to be a rough few months call-duty battlefield red-dead redemption fallout Mario Party And that's just a start of December anthem and days gone in February who needs money or sleep Too many games We have too much choice I'm just waiting for this bubble to burst man. It hasn't burst yet. It's surprisingly I mean it kind of has burst a lot of companies have gone on there Like the the days of a gaming startup are kind of harder a lot harder these days So I guess the bubble has kind of popped especially in the MMO space If you wonder why I'm coming here. I'm coming here to get my trial of ascendancy out of the way I know there's nothing here nothing progression wise. I just come here to get this crypt out of the way fallen to desecration up to precision Cry armor notes Well, hmm overall the league has been pretty fun. I mean I'm liking the The dungeon thing I think once I get into the crafting part of it I'll probably have a better sense of what this means Because right now it just seems like another cool Way to get XP because I haven't really done any crafting with it So I think once I get crafting and getting some stuff done and getting really deep into the delves and probably things will Start to open up. I just think the twitch API went nuts because now all of a sudden getting loots Don't apologize blood miss That wasn't meant to make people feel guilty Open this Explodes no I don't explode. I don't know which ones I need or don't need I'm just gonna grab them all The way through the dark Hey blubbers, how's that um? How's that monster hunter treating you that generations on? Mother power. What am I doing? I'm done here. I have seen what he is in black. What troubles you bring now? Playing it right now Just trying to upgrade my weapon and armor right now the monster fights are intense. The game is tough man I guess it's just learning How to adapt I think I might have been It probably would have been easier for me if I didn't play world honestly, I Think world kind of spoiled me. All right chat. I use the restroom real quick. I don't know if it's been an hour I don't think it has well I have to use the restroom. Thanks for watching. I'll be back in less than three minutes Feel free to follow the stream if you enjoy yourself. Follow me on Twitter at Twitter comm slash one I'll be right back. I'm back guys. Thanks for waiting speaking of Marvel Marvel heroes So we get the most on the world a blood damaged bros want to help me getting an older garrom plus Bangs I refuse to make a hammer When I set my alarm this time so Be sure here when it's time for another time for another break Whatever rakes Why that's the first time I've ever seen that Another It's not this level though. I got do know the trial Where can I do how many zombies kind off? Still three. Alright, I think I may be able to get a new skill soon I'm coming up on 20 19 so we're going to the armor notes radio About a poison here. Dude, I desperately need Jim's and I'm on Saturday like I Gotta start doing tempered mobs though. I I attempted it after the stream last night I kept playing by the way not too much not too much longer but I played a little bit I tried to do some some public group tempered stuff ooh just people running and die I'm just like what are you doing it's like one guy died twice before I even got to the monster and then we got the fight another monster was there so I pooped it I slung some poop on it and he goes to start attacking that one keeping it there I'm like dude stop attacking it and he died again and we lost and that that that whole theme was like present like I don't know people just don't know how to deal with multiple monsters I'm like these are tempered we don't want two of them here you know we need one to leave or we got a retreat or something we can't handle two and they're getting one shot by the tempered mobs I was like forget this I'll just farm something else so I want to try to do the event again the farm that we did good good good good good good get around and same thing what's happened there two of the two of the roly-poly's run around right and I pooped one of them to try to get them away and he just kept attacking I'm like stop for the love of please what are you doing I went Jerry Seinfeld I'm like what are you doing are you supposed to not attack the one I'm pooping but oh well why is everybody attacking the one I'm pooping and it's just it just kept happening and we had to fight to it was chaos I wasted so much life power trying to keep people alive I was like man this feels like a typical multiplayer public group session this is why you need to find friends to play monster cuz I mean there was like HR what it was like H I don't know how they were like in their 40s I think HR 40 something I'm just like you are not ready for this I mean Lisa learn how to stay alive hey but it was it was some it was some rough matches man I was I was like wow how am I gonna do this I know I'm not gonna be able to do it all online so I'm like maybe I just break out the bow and solo I'll get a palico build or something I don't know it's trying to solo everything cuz it's like it's almost impossible a certain times a night like every single one I join a solo is definitely easier than having like two or three bad people you know cuz they they're a liability that's the way I feel about it at least but I was gonna heavy bow gun solo or boat or bow solo heavy bow gun would probably be easier cuz I deal I know how to deal a lot more damage with that weapon than I do with bow and I got blocked so I was just like the monster goes crazy I just sit there and hold right click until he calms down I really find the trial probably gonna yep here we found the boss before we found the trial oh well Helena I'm in wrong buttons oh he killed the oh yeah that's how that thing dies he killed my my relic all right we got to find the thing go right back down to the entrance I found it I felt good I locked the door haha your's your's your's slicing up my Zambies wait how they go in here I won't go in here I'll go over here that feels good there we go gather round neat hell of thunder chat I think oh purity this is the one oh my gosh this is gonna be ridiculous oh this is going to be stupid stupid all right we're gonna put it okay oh my shield I still have anything on my right click this is going to be as you say Ohio say dumb make it fast make it fast going going excise okay the ah yeah we didn't get the Chamber of Sins thing and it'll be fine it'll be fine I don't have to get it it'll be fine chat it'll be fine what are you worried about it'll be fine hey chat guess what it'll be fine be fine it'll be fine nothing to worry about let's put it on oh mouse five oh last shoot you'll ever wear we've got a Harold chat and it's a hell of a purity everybody all shiny now but what's all these days 20% chance to summon a sentinel of purity when you hit a unique enemy did you see all the morsels just come out of nowhere chat all the minions all them delicious chocolate nuggets drop bears oh I've already got a little baby miniature army but some of them disappear so but they're there in the fight that's all that metal that's all that metal that's all that mellow this portal I need that look at it go roll out the barrel I feel it in your bones oh yeah roll out the barrel feel it in your bones oh yeah look at it go roll out the barrel feel it in your bones Elvis folks singing the witch doctor song ho ho yeah ho ho yeah ho ho yeah ho ho yeah ho yeah oh look at it go roll out the barrel feel it in your bones oh yeah look at it go I'm sorry I got into it oh let's see if he pops up right next to him he's not in both places at the same time I am disappoint oh invalid file name chat that's a boog I sense the crash coming on I since crash coming on chat since the crash coming on like this oh yeah look at it go oh no it's the devil there it goes it has an invalid file name and I have crashed to desktop but it way oh yeah look at it go roll out the barrel feel it in your bones oh yeah look at it go roll out the barrel feel it in your bones when I'm actually level 20 let me see what skills I can get let's try this again if I get invalid file name one more game okay there we go what's that well it said entering as the right mind and it disappeared let's try again okay that time I went in I need zombies my army is not complete one two three let us go forth and make merry huh huh huh huh moving forward huh give me the stuff ooh those rings are all abandoned and I know exactly why because they all suck let's go here please let's do it oh look at it go let's do the thing where I hold down Q and occasionally press four and five my first you naked oh I didn't see the shiny oh I should have waited for the shiny light to shine bright starlight stop right yeah oh it's comb sign I don't know that's good or bad be honest okay we're gonna go to the next one oh yeah oh look at it go roll out my role mmm feel it in your bones added lightning damage or melee splash added lightning damage I think is on this build out to check in on path of building once I get to the spot and I am leveling up one Jim on my alternate stuff but I don't think melee splash is part of this