Hey guys, what is up? Welcome to my channel. For today's video, I'm going to be doing a shop or drop where I go through all the new makeup that is featured on trend mode one on Instagram. And I tell you whether I plan on shopping for them or dropping them from my shopping list. So if you want to just to chat about all the new makeup and my thoughts on that, of course originating from the Samantha March Will I Buy series, then just keep watching. Hi guys, if you're new here, my name is Morgan. I am a Parade of Knowledge enthusiast. I just love knowing anything and everything about all the new makeup on the market and sharing my thoughts with you guys. And let's just talk new makeup. Let's get into it. I already talked enough. We're going to start off from a couple weeks ago. I think it's been about almost three weeks since my last shop or drop. I'm going to mention a couple of Morphe launches because a few of them have caught my eye. So we'll start off with the Ashley Strong and Morphe brushes collaboration. Let me actually scoot my boot over here so that you guys can see. So I actually saw this at, not Morphe. I don't have a Morphe near me at Ulta. And this palette is a little bit too grungy for me. I just wasn't into it. It's not my style of tones. I think I'm a little bit too light to pull off too. That's not true. Look at what I'm wearing right now. But I don't know, it's just a little bit too deep for me. I typically prefer lighter, brighter eyeshadows as opposed to these. But congratulations to her. I always love to see a collaboration with a creator, especially of her talent. She is incredible if you haven't checked her out. But I did decide to pass on this. This color story personally isn't for me, but very interesting. There's also a cake liner palette and the lip deals absolutely look beautiful. But you know when it comes to Morphe, the palette really has to blow me away for me to purchase it. I don't dislike Morphe, but I know a lot of you guys do dislike Morphe. But this one personally isn't speaking to me. Liz Beauty, and I know a lot of you love this brand or love yourself. I believe is what the LYS stands for, came out with their Glow Beyond Collection. This is also currently available. It looks like there's a glow oil, there's multi-use liquid highlighters, and then it looks like a pressed highlight. I didn't pick up anything from this launch. I also have never tried anything from this brand at all. So that's why this brand currently isn't on my radar. And what I mean by that is there's specific brands on my channel that you guys know I frequently review products from and that I just like to cover. I haven't done this one yet. I don't know, maybe in the future I will. But as of now, I have so much highlight. I'm just like highlighted out. I don't want to review a whole highlight collection. So that's why this one didn't catch my eye. I do like, you know, a nice shimmery oil or a liquid, you know, something to put on the chest region, but then I think about it and I never even use it. So for me, I'm dropping this one, not interested in this one, but I definitely am not opposed to trying the brand. I'm just waiting for them to come out with something that I'm like, yes, need dying to have. But for now, passing. Colourpop came out with the Plush Like Me Collection. This is already launched, ready to go. Yeah, hi. I've seen this a billion times before. I feel like the palette doesn't really interest me. Everything's a little bit too red-toned in this collection for my preferences. I feel like sometimes the tones in here can make me look a little bit sick. And I mean, you guys know, I am personally a bit fatigued from Colourpop. This collection didn't catch my eye. So dropping this one from my list, this. So, Denessa Myricks is coming out or has already come out with. This was a couple of weeks ago, September 19th is when it launched, the Infinite Chrome Flakes. These look beautiful. However, I will not be purchasing these at full price. While these look beautiful and I love it, individual really shiny products like this, I find that I buy it, I use it once, I say I love it and then it goes in a drawer and I never use it again. And these little guys, the price is at up. When you have one, you want multiple colors and they are quite expensive for just one shade. I just don't find that I reach for them as often as I should and they end up drying out and it's just a huge waste of money. Also, these are kind of like flaky. It's a bit too avant-garde for me, a little bit too editorial. I'm waiting to see the Black Friday sale. If I can get these at a discount, I might pick up one or two because these look stunning. I know a number of you said you didn't like how it looked so textured on the eyelid. I'm just not sure. Like I want to pick up one or two, dropping it for now, but if I feel motivated enough during a Black Friday sale, I definitely want to pick these up because I just, I like shiny things. I do, I haven't talked about this. This is old news at this point, but Becca is going to Smashbox. So at this point, Becca is no longer open and there are two most popular formulations, their pressed highlight and their under-eye corrector are going to be a part of Smashbox now. It's going to be like a collab. I don't think it was a bad business move. It makes sense. They are all under the same umbrella. They want to make money. These products from Becca make money. I'm actually happy to see them under Smashbox. Is it weird? Yeah.  You know, it's not done because of us as consumers and because we love it so much. No, it's done because they want to make money, but nonetheless, I'm very happy about this. I think that's awesome. And I know a lot of you are so happy to get this product, but it is unfortunate because if they were really doing this for the customer, they would have told us way in advance that these products are saying, but of course, you know, they wanted you to stock up on this by as much as you can. Get rid of all that stock before they announced it. So that's that, but I think it's a smart move and I'm happy to see for those of you that love the formula that those are going to still be available to you guys. I've been getting asked questions and I'm really not sure why about these mini eyeshadow palettes from Too Faced. They've come out with a couple. This one is the Forbidden Fruitcake. I have no interest in these whatsoever. I never really have. I don't own any of the eyeshadow palettes of this size. I know a lot of people like them. They're great. They're affordable. They're about the size of a credit card. Too Faced holiday stuff, I just no longer have interest in anyways and color pop hocus pocus collection. I actually really liked this palette, but I did see those photos where it actually had like pretty much all the same colors as the It's a Mood palette and I have the It's a Mood palette. So that backtracked me because I was thinking about picking this collection up, but when I saw that the eyeshadows pretty much were already in the It's a Mood palette, that was my cue to save myself some money. I really liked the packaging of this. In fact, I don't really like hocus pocus. I don't really like Halloween movies or Halloween in general. I don't like being scared. I don't like spooky things, but I still thought this collection was cute. It had cats all over it, but I decided I didn't need it. I don't love hocus pocus enough to justify this purchase. So I dropped this one for my list and I'm sorry, I've been very bad about saying shop or drop. Have I said shop anything? Ooh, this one was really pretty. So Shantikai launched this limited edition collection of like pearl packaging. So beautiful. There's an eye sheen, which is $75. Dang. And the balm, the highlight balm is $110. I'm dropping this. I mean, if you don't know my stands on Shantikai, I think their products are so beautiful. In terms of quality, not just the looks. Like they have beautiful formulations. They are the real deal in terms of formulations, but I think they're a bit too expensive for what you get. Sometimes the quality has never been bad in my opinion. I cannot justify paying that price. You know, Shantikai has been kind to me as a brand. They've sent me stuff, but you won't catch me really paying full price for their stuff and I'm 100% honest about that. But this is beautiful. But again, too expensive, too expensive for me. Maybe in the future, I might change my mind, but I don't need to be spending money like that. I'm moving in three months, I can't. Okay, this is a little bit more old school, urban decay. Not super, super old school, but this is like 2015 urban decay here. They collaborated with Marvel Studios and I don't know, this kind of brings me back a little bit to when urban decay was a little bit more popular. I'm dropping this. I think the palette looks kind of ugly if I'm being honest. I don't have any attachment to Marvel. Anyways, I don't know, this collection is really not attractive to me in any ways. I am being so mean this shopper drop, I'm not into it. I'm gonna just drop it and move on, right? You guys know I do love BH Cosmetics and they collaborated with Doja Cat and I also really love Doja Cat. I think she's so funny. Her TikToks are amazing, but I did decide to drop this. I really only love BH for their square palettes. I guess these are square, but you know with the square eyeshadows, the travel series and I just didn't feel the need to pick this up because I knew it would just be items that I do a review on and then never use again, which is sometimes something that I'm happy to do for you guys, but this collection just wasn't screaming out to me. It seems to be quite inclusive, lots of color. I think it represents Doja Cat very well and you know she always has awesome, awesome makeup by the way. I just didn't feel the need to pick up this collection. It didn't interest me enough. The color stories look a little sporadic for me. It's too much of a collection. It's almost too big. So dropping that. Oh, and I also did want to mention on the day that I'm filming this, this ended up launching. This is the Wayne Goss Termaline eyeshadow palette. Originally, I'm gonna be honest with you guys. I wasn't going to pick this up. Wayne Goss as a brand has been kind of hit or miss for me. I've really liked some things and I've been kind of about other things and his eyeshadows I've felt the same about. I felt like some were nice, some weren't his most recent pearl palette. I ended up really, really liking. At first I was like, it's nice, but then I ended up putting it in my makeup kit and I use it so much that I have to say it's my favorite eyeshadow palette from him. But I just wasn't feeling motivated to pick this one up. But I did end up shopping it mostly because it felt right to me, knowing that this was Mel's last video, unfortunately, and she loved Wayne so much. I'm gonna get sad. It's the last video that we all get from her. I picked this up from Mel. Just felt right to me and it is a beautiful color story. It looks stunning for fall. Mel definitely influenced me to get this one. I want to recreate some of the looks that she did with this. So I did pick this up. Okay, this collection from ColourPop. It's a purple collection, so I'm really into it. This is the Orchid Collection and I'm on the Sometimes ColourPop PR list where they'll send me random collections every now and then. And this isn't a collection that I would have bought for myself, I didn't buy it for myself. I was secretly hoping I would get it in PR. I didn't, and that was a sign that I didn't need it. Perfectly fine, but it's a really gorgeous collection if you feel like you are missing these tones in your collection. I just didn't need it. I wasn't gonna spend my money on it, but I think it is a beautiful collection. So it's a drop. I didn't need it, I'll tell you that. I did get a few questions from you guys asking if I was gonna pick up the Glossier Monochromatic palettes. These look like the Flower Beauty quads to me for some reason, just the way that the pans are in this square. Obviously the Flower Beauty is for shades, but anyways, I'm not picking this up. I've honestly never even tried anything from Glossier.  I mean, look at me right now. So I just don't think I would like these. I'm not going to review these. Definitely dropping these. They look kinda cheap to me. On to the next one. So Huda Beauty, I guess for her little offset of the Glowish collection or brand or whatever it is that she has launched, and these are available now. I'll have them linked down below for you. But they came out with a luminous pressed powder. I ended up picking up the shade Light and Light Medium. Normally in brands, I'm a Light Medium, but I found that with their tinted moisturizer, Light Medium was so dark. So I picked up Light just in case, and I'll let you know I use the, I'm a YouTuber excuse to help you guys to get both shades. And then I also picked up two of these Cheeky Vegan Blush powders. And I've grown to really enjoy the bronzer in the Glowish line. So I'm really excited to see how the formula translates as a blush. I'm really excited for this launch. I think both of these look beautiful. They look innovative. I'm excited to try these out. So I did shop these. They are on their way to me as we speak. All right, so I do have a story about this one for you. The Jacqueline Cosmetics, I guess not Jacqueline Cosmetics. The Jacqueline Hill and Morphe Divine Neutrals palette. So I posted on my community tab, which so many of you were very vocal to my questions. So thank you. Asking you if you wanted me to pick this up.  And then I told you I didn't. So here's what happened, okay? Not that I was dying to have this palette. It just was kind of like I called Ulta just to see if they had it. Like my Ulta locally. And they said that they did. And I asked them if they could put it behind the camera for me and they were like, yeah, sure. And I was like, okay, if I can get this this easy, I will just do a quick review. It's not that expensive, blah, blah, blah. Then they ended up just giving me, they pulled the original Jacqueline Hill Morphe big palette that's been around for years. I guess the person on the phone just misunderstood me or didn't know, I don't know. Anyways, there was a disconnect there. And I was like, by that point, I was like, I don't even want it that much. So didn't end up getting this. I only wanted it really for the convenience. I think it's really pretty. I watched Ally Glyne's reveal on this. She really liked it. It looked beautiful on her. And these are just basic neutrals. I don't, it's a fine palette, but y'all know I don't need this. And I don't think there was enough of an interest from you guys for me to actually review this. So I ended up dropping this for my shopping list. I don't need it. I don't really want it that bad. So yeah. So Tower 28 in a week is coming out with an SPF 30 tinted sunscreen. Kind of odd that it's launching in October now, little out of season, but I really do like Tower 28 as a brand. It's definitely not the vibe of makeup that I wear, but I do think they have some really phenomenal products. I personally, I don't really wear tinted moisturizers or tinted sunscreens like that, to be honest. If I'm aware of makeup, most of the time it's probably just gonna be a regular medium coverage, middle of the road foundation. I don't find myself really wanting to grab for my tinted moisturizers too much. Sometimes I do time in a place, but anyways, really don't have much interest in this. I'm excited to see Tower 28 come out with a new product. That's mostly what I'm excited for just to see the brand grow and expand their line because it is relatively small right now. And I do think they come out with great quality products, but this just, it's not for me. It's not the kind of product that I like. So dropping this from my list. Okay, this is one that I really wanted to talk about and I know you guys wanted to talk about it as well. So just a few days ago, Glam Lights launched their happy hour collection cocktail palettes. And so many of you guys were like, Mori and I know you love the wine palette and I love all of these palettes. Maybe not the colorful one as much is that the margarita palette, but the dirty martini, the wine and the chocolate martini. I have never tried Glam Light before and I've got to give Glam Light credit where credit is due. I used to be so disinterested in their brand. I did not like their designs. I did not really like their color stories. They seemed chaotic to me. This is what I'm talking about. This and the McKayla palette, which I didn't pick up either. I've been eyeing heavily. So I think I kind of regret not picking this up when it originally launched. But to be quite honest, you guys with it being the holiday season, even though it's not right now, in terms of the makeup world, as somebody who works in the makeup world, it's holiday season right now. It's holiday busy for me right now. I just didn't want to add more palettes onto my plate, but I'm regretting it. I might end up with these palettes. I might. I dropped to them. I didn't pick them up, but I have deep, deep, deep regret within my soul. So many of you guys told me that they had a really great formula. Do I need to add Glam Light to my repertoire? Do I? Question mark for that one. Okay, I've also now... I got worked up with that one. I've also never tried Made by Mitchell, but this palette looks really fun. I'm not gonna get it. I'm dropping it again. Same thing. I just don't need to add board to my plate, really. But it looks fun, but I've heard terrible things about his customer service and it is an international brand. And you guys know sometimes international, don't want to deal with the shipping and the long wait times. And no, I don't want it. I'm dropping it, but it looks really pretty. Makeup by Mario launched his Ultra Suede lip collection. I'm not rushing out the door to pick these up, but I think the next for a VIP sale, I do definitely want to pick up a few colors. They look beautiful, great, wearable, everyday colors. Just a great lineup for lipstick range he came out with. I love how he came out with so much. Looks good. I don't doubt that the formula isn't good because Makeup by Mario usually does a pretty good job. So I am gonna shop these, eventually. Not right now, but I will pick them up on sale. They look really nice. I mean, I'm gonna try the lightest color. Oh my gosh, there's a lot that I think I would like. I think I'd really like Brielle, Sierra, Rasta. There's a lot that I would like. So I'll get them eventually. I know I will just to be able to try the formula, you know? Ooh, this one is an exciting one. Lunar Beauty launched the Moonspell Volume Two Palette. Did pick this up. It is on its way to me. How could I not? So you guys know how I feel about purples and I love purple with red. I think it's such a beautiful color story. They go so well together. And this is the perfect Volume Two to the Volume One Moonspell Palette, which I also have from Lunar Beauty, which is actually the only palette that I have from Lunar Beauty. And this is the first time that I picked up a Lunar Beauty Palette on launch date. I've been really enjoying Manny's podcast with Laura Lee lately. And this palette, I'm really excited about it. It's literally putting a smile to my face right now. I did shop this. This is a fun one. I'm really excited about this. It came out the perfect time of year. Fabulous shop, Manny. Very excited. Okay, so Hiendash launched his liquid liner. This is called the Hero Line. Hero Line, excuse me. Listen, the sole reason that I purchased this is because I wish I had Hiendash's eyeliner skills. For real, I have always been so entranced by him applying eyeliner. It's so precise and he's just so talented at what he does. So anyways, he to me is like the king of eyeliner, just precision. It's incredible. So I did pick this up. I think it's gonna get me Hiendash skills apparently. No, but also I want to support him because I think he is so supportive of other creators. He personally took the time to watch all of the reviews everybody posted. Very thoughtful, kind comments. And I mean, I just have so much respect for him. Not only is he talented, but I think he showed that from within. He is also just a great person. So I did shop this on its way to me. He said October 11th, I should receive it. So I'll let you guys know. I love a good liquid liner, so we will see. And I'm not the best liquid liner, believe it or not. So we'll see you guys. I'm excited. Coming soon, I don't think we have a date on this because this was 20 hours ago. But Trend Mood has this mega palette and primer. Partyproof Eye Primer and the Play It Jewel Eyeshadow Palette. I wouldn't, I've been dropping this. I'm not spending my own money on this. This looks like that it's a mood palette, but less pretty. And I actually have the It's a Mood Palette sitting right in front of me because I just mentioned it in a video. Like I love this palette. This is one of my favorite palettes that Colourpop has come out with this year. I feel like if I had this palette, I would like it. I could create really pretty looks with it, but it's not something that I want to spend my own money on because I don't need it. And it just reminds me too much of the It's a Mood Palette, but not as pretty. So it looks like a very wearable palette with some interesting pops in here. But I definitely am dropping this from my list. This is the furthest thing that I need to be honest. Let me pop over to another account really quickly, one of the luxury accounts that I follow just to make sure I'm not missing anything. Okay, see, I'm on Chic Profile Official right now. She does great beauty updates and she mostly focuses on luxury makeup. So a lot of times this stuff isn't featured on trend mood. So if you didn't know the Tom Ford Naked Palette, this is the Soleil Nage 2021 collection launched, I believe on Beauty Lush first. I did not pick up that $60 lip balm or whatever it is. Didn't pick it up, refused to.  Here's the deal, okay. I used to never pay full price for Tom Ford. I'm very, very blessed that because of you guys and your support, I am able to. But I would never tell you to buy Tom Ford full price. I pay full price, so you don't have to. Maybe I might tell you to wait for the CCO and I do recommend if you're into Tom Ford purchase from the CCO. Anyways, I did pick this up. I'm low-key excited about it. I think it looks pretty. I've really enjoyed the Soleil Nage eye shadows in the past. We will see, I'm not sure. I'm not dropping dead from this palette. I don't think there's anything too special about it. But I did shop it. I'm very curious. I want to see it in person. I don't think I've seen in person swatches before, have I? The curiosity got me. I did pick this up to review for you guys to tell you what is up with it to compare it to other palettes. So if there's any comparisons that you want to see, write it in the comments down below. So I think I shopped that. Don't be the first to admit. Finally, there's Charlotte Tilbury palette of pearls. Cosmic Pearl is available. I told you guys a second one was coming. And I loved the first one. And I did not think I was gonna love the first one, which is right in front of me. The Celestial Pearl. I did not think I was gonna like it. Ended up loving it. This one looks a little bit more by speed. There's some more depth to it. There's a really pretty purple shade. So I did shop this. Of course, really, really excited about this one. So it is available if you guys want to have it. And you know what, you guys? I think I am going to end that here. I think I've covered pretty much everything that I've wanted to cover. So thank you guys so much for watching my Shopper Drops. I always have a good time creating them. Let me know your thoughts down below of the new products. What are you planning on picking up and what are you aggressively against? I want to know. Thank you guys so much for being subscribed to my channel and supporting me. It does not go unnoticed. And I will see you all in the next one. I guess have a good one.


So many thanks to the organizers here at RailsConf. This is my first time talking at RailsConf. It's frankly kind of intimidating to be up here and see so many people out there. My name is Mark Menard. I'm going to be talking about small code today. And I've got a lot of code, about 79 slides, 137 transitions, not quite as much as Sandy had, but it's a lot to get through. So, okay, let's get going. So I'm just going to let this quote up there sink in. So, all of us have that file filled with code that you just don't want to open. As you heard earlier, maybe it's your user class. That class that has comments like, woe to ye who edit here. The problem with this code is that it does live forever. It encapsulates business logic that ends up getting duplicated elsewhere because no one wants to go in there and look at that code. It's also very hard to understand. I'm going to be talking about ways to avoid this situation. I'm going to be talking about code, code at the class level and the method level. Having small code at the class and method level is fundamental to being able to create systems that are composed of small, understandable parts. I'm going to add a few base concepts so we can start with a clean sheet and on the same page. I think there's a lot of problems with what people conceive of as small or well-designed code. It's not about the actual amount of code you write, but how the code is organized and the size of the units of code. Fundamentally, writing small code is really a design discipline because the only way you can write small code is use good design and refactoring. Design and refactoring the way we write small code. You can't just sit down and write small code perfectly well-designed code on the first draft. It doesn't work that way. It's an iterative process. So what do I mean by small? It's not about total line count. Well-designed code will typically have more lines of code than bad code. Just the overhead of declaring methods in classes is going to increase your line count. It's not about method count. Well-factor code is going to have more smaller methods. It's not about class count. Well-designed code is almost definitely going to have more classes than what I call undesigned code. Although I've seen some cases of over-obstraction, I find that's pretty rare unless someone goes pattern crazy. So small code is definitely not about decreasing the number of classes in your system. It's about well-designed classes that aren't poorly designed. So what do I mean by small? Small methods, small classes.  We cannot write small code. And without small methods, we can't raise the level of abstraction. To write small code, we have to be able to decompose large classes into smaller classes and extract responsibilities out of them and separate them on a higher level and base them on higher level abstractions. It's important that our classes are small because small classes are what lead to re-usability and composability. So why should we strive for small code? Why is it important? We don't know what the future is going to bring. Your software requirements are going to change. Software must be amenable to change. Any system of software that's going to have a long, successful life is going to change significantly. Small code is simply easier to work with than large, complex code. If the requirements of your software are never going to change, you can ignore everything that I have to say here. But I doubt that that's the case. We should write small code because it helps us raise the level of abstraction in our code. It's one of the most important things we do to create readable, understandable code. All good design is really driving toward expressing the ubiquitous language of our problem domain in our code. The combination of small methods and small classes is going to help us raise that level of abstraction and express those higher level domain concepts. We should also write small code so we can effectively use composition. Small classes and small methods compose together well. As we compose instances of small objects together, our systems will become message-based. In order to build systems that are message-based, we have to use delegation and small composable parts. Small code makes small composable parts. It's going to help our software have flexibility and lead to a supplement over time and allow us to follow those messages and eventually we're going to see find our duct types. And all this is about enabling future change and accommodate the future requirements without a forklift replacement. So the goal, small units of understandable code that are amenable to change. Our primary tools are extract method and extract class. Longer methods are harder to understand than short methods. And most of the time we can shorten a method simply by using the extract method refactoring. I use this thing all the time when I'm coding. And once we have a set of methods that are coherent around a concept, then we can look to extract those into a separate class and move the methods to that new class. So I'm going to be using the example of a command line option parser that handles Booleans to start with and then we're going to see where the future takes us. So the command line, I want to be able to run some Ruby program dash v and handle Boolean options. That's where we're going to start. In my Ruby program, I want to define what options I'm looking for using this simple DSL. And then I want to be able to consume it like this. If options has and then a particular option, I do something, putting it all together. The DSL, the program at the top, the DSL and then how we actually consume that options object. Pretty simple. Here's my spec. It's pretty simple. It's true if the option is defined and it's present on the command line and it's false if it's not. So I run my specs and I get two failures. Yes, I used TDD. So here's my implementation that fits on one slide. Pretty simply, I store the defined options in an array and I store the arguments, the argv for later reference. Then I have a has method that checks to see if the options define if it's present in the argv. Then I've got my option method which implements my simple DSL. Nice and readable, fits on one slide, probably very comprehensible. So I run my tests, zero failures, they pass. I'm done. I get to go home until the future comes along. My workmate comes along and says, hey, I really like that library, but can we handle string options? Sounds pretty simple, pretty straightforward. So I think about that and I come up with a small extension to the DSL to just pass the second argument to option with a simple representation of the option type, string in this case. I also default to being a Boolean but I don't have to change the code that other people have done. So a string option, it's a little different than a Boolean. It actually requires content. So now I need the concept of validation. If a string option is missing the content, it's not valid, there's no string there. So then I'm going to normalize how I get the values out of both those string options and those Boolean options. You know that value, this is a change of the API but sometimes you actually need to break the API to enable the future. I'm doing it pretty early. I've only got one guy in my office using the library at the moment. So again, putting it all together, I can pass the options on the command line, I define the options with the DSL and here's how I use my valid and my value methods to find out if it's valued and get my values out. So now here's the class that implements it. Again on one slide, probably not as readable, probably not as comprehensible. We're going down what I call kind of the undesigned path. It's not too big, 31 lines, but it's got issues. It's got a method that's definitely large, one that's looking on the verge of being large. It's got for only handling Booleans and strings, it has quite a bit of conditional complexity in it already. And as we're soon going to see, it's not very amenable to change. So we're going to look at the pieces and how they work, just so you understand it. This might initialize method and create a hash to store the options because we have to store the type now, not just that we have an option, it's either Boolean or string. And the rest of the initialization is the same as it was before. And the valid method, we've got to iterate over the options looking to see which ones are strings. So we're doing checking on type here and checking to see whether they're present and they actually have content. Currently the string options are the only ones that need to validate. Boolean options, there's nothing really to validate. Either it's there or it's not, no validation, but strings we have to. And the value method, it does a lot of stuff. Just pretend for a moment this method is a black box. We're going to come back to it later because this is by far the worst code in this current example. But everything is specced and all my specs are green. So let's talk about methods because we've got some big ones and we need to clean them up. I call it the first rule of methods. Do one thing, do it well, do only one thing. Harkens back to that Unix philosophy of tools that you string together with standard in and standard out. But how do we determine if a method is actually only doing one thing? This is where your level of abstraction and the abstractions in your code come into play. You need to develop a feel for this over time that you want one level of abstraction per method. If all of our statements are the same level of extraction and they're coherent around a purpose, then I consider that to be doing one thing. Doesn't mean it has to be one line in a method. I can't tell you how many times I've looked at code and seen a comment on a method that was an excellent description of what the method did. If you just took those words, banged them together, they'd make a fantastic method name, but yet the method is named something else that isn't that descriptive. So use descriptive names. It's really critical. And the fewer arguments, the better. My personal goal is zero arguments on methods. One is okay, two or three. That's when I start to think I've probably missed an abstraction in my code and I should go back and look at it. Separate queries from commands. If a query is something and it looks like a query method and it changes the state of your object, it's hard to reason about. And people who consume your library will be confused by that. So separate those. And don't repeat yourself. I know Sandy talked about this earlier and it does take some judgment to know when it is time to remove the repetition, but you don't want to leave repetition over the long term because it will come back to bite you. So let's look at our methods. We've got repetition here. Both valid and value are digging through the argv array to find the options from the command line. This is a perfect candidate for an extract method extraction, refactoring. We have magic constants scattered around and those are a strong indication that we've missed something, an abstraction. We're violating some other rules. It's hard to say either of these methods is really doing one thing. The code is definitely not at the same level of abstraction. Valid is digging into the argv array and value is figuring out different divergent types and how to return their values. So now we're going to eliminate some of the repetition with an extract method refactoring. Extract method refactoring entails moving a part of a method into a new method with a descriptive name that's the naming part and then calling the new method. This refactoring helps us keep the level of abstraction consistent in the method we're extracting from. Here we have one expression and a method that's a high level of abstraction and two statements that are a low level of abstraction. So we move the less abstract code to a new method with a descriptive name and then we call the new method. This results in the old method having a consistent level of abstraction. So back to our command line options class. Both valid and value are digging through the argv collection to find the option value. So we're going to extract that code and get the raw value out of argv. Then we call the method from where the original logic was extracted. Pretty simple, but now the code left behind and valid in value says what I want, not how to do it. The how has been moved to the extracted method raising the level of abstraction just a little bit and valid and value. I'm going to do two more extractions. I've extracted the string option value method and the extract content method. The naming of the extracted methods is very important. They say what they do. But overall, I'm not happy with this code. It is more explanatory, but it's fairly complex and hard to understand. It's also not as small as it could be. The methods are large because I missed an abstraction. We're going to go find that now. I'm referencing the option type symbol to see if it's a string, which that's a big smell. Then there are the magic constants used to dig into the argv element to find the content within that particular string, the substring. If I was confident that I'd have no future added requirements for this class, I might leave this alone. It works. It's tested until my buddy comes to me and says, hey, I really like that library, but could we handle integers now? I could keep driving down this undesigned path I've been following and complicate the valid and value methods by switching on the type of the option and digging into those argv elements to find the value. But this is our chance to make a break and make our code more amenable to change. But to illustrate the point, I'm going to show you that undesigned method to show you the OO design actually matters. So we're going to look at that. This is the undesigned non-OO version of this code. Is it horrible? I'll leave that to you to decide. Is it small? In my opinion, definitely not. It is not small by any measure. The class is growing due to changes in specification. The valid and value methods are being changed in lockstep. That's a sure sign we've missed an abstraction or a duct type. And those methods are getting big and complicated, and now they're doing even more things. And we're just doing booleans, strings, and integers. Not that much. The code has tests. They all pass. That's good. But it's not satisfying. We've got those large methods and complex conditional logic. It's time to refactor now to make the change easy. And now we've got the tests that are back so we can do it without fear. And I want to call your attention to a pattern that clearly emerges when we go down the non-OO path here. We see checking the option type and divergent behavior based on the type. Don't reinvent the type system. If you have ducts, let them quack. In this example, the option types of boolean, string, and integer, those are our ducts. And I'll bet there's ducts in your code yearning to be free. And just to further confirmation that we're dealing with an abstraction or a duct, we see the testing of option type again in the value method. Hidden inside the valid and value method, there's a case statement here. It just didn't evolve that way as I was writing the code. I'm going to show you that. You're going to see that it's really clear now. Now it should be really obvious what the duct type is. If you have case statements like this in your code, you've missed an abstraction. Here again, we clearly see the duct type. Now, I would guess if I was writing this, as soon as I had the string type, I would have gone down the OO path. I just want to illustrate to you what an undesigned non-OO mess you can get yourself into. If you keep writing the horse until it's dead, my dad had a saying hanging on his wall in his office, when the horse is dead, get off. But sometimes we don't realize the horse is dead and we just keep trying to go. Now it's time to take a fresh look at this. So since classes are the fundamental organizational unit we have to work with, it's time to look at what constitutes a good class. Which principles are going to lead us to be able to write small classes? So how do we write small classes? To make small classes, I think, and it's not just my opinion, it's a lot of people's opinion, the most important thing we should assure is that our class has one responsibility and that it has small methods. All of the properties of a class should be cohesive to the abstraction that the class is modeling. If you have properties that you only use in one or two methods, that's probably something else that shouldn't be in there. Finding a good name for a class will also help us keep it focused on a single responsibility. I sometimes talk to the class. If you ever hear the concept of talking to the rubber duck or just explaining your problem to someone they don't even have to respond and he helps you figure it out, sometimes you just ask my class, hey class, what do you do? And if it comes out with a long list, you've got a problem. So the main tools we're going to use to create new classes from existing code, not from scratch, but from existing code is the extract class and move method refactorings which we're going to go through here. So those characteristics of a well-designed class, single responsibility, cohesive around a set of properties, additionally it has a small public interface that preferably handles a handful of methods at the most, that it implements a single use case if possible and that the primary logic is expressed in a composed method. That last one, I'm not going to be covering the composed method, that's a whole other talk, but you should check that practice out. It can really clarify code and make it much, much more understandable. So let's look at the code we should have been driving towards as soon as the string option type showed up. We're going to imagine right now that we have a clean sheet and we can write command line options the way we would have with the knowledge that we have now that needs to support Boolean, string and integer options. And remember, we have our tests at our back making sure that we don't break anything. And here was my first take at it on what I'd write. The class is 28 lines long. It is cohesive around the properties and we're done, most of the methods are going to deal with the hash of options and the array of args. It has a single primary responsibility. Manage a collection of option objects. So now we've introduced a collaborator. It also manufactures the option objects which I could extract to another class, but for the moment I'm going to leave it. If I find it hurts in the future, then I'll change it. That's my general rule, my guideline is I refactor when it hurts. When making a change hurts, that's the time to refactor. My command line option class has a small public interface. Just two methods, valid and value. And it has no hard-coded external dependencies yet. I could mess that up and introduce those, but we're going to avoid that. Another interesting characteristic of it is that there are no conditional statements in this class and we're going to keep it that way. In Sandy Metz's 2009 Garouko talk on the solid principles, she said something along the lines of a conditional in an OO language is a smell. And that's a really powerful statement. I don't think Sandy's saying that we can't use conditionals in our code, but that we use conditionals to hide abstractions, to hide our ducks. The first time I saw that talk, I don't even know if I heard her say it. It was when I went back and re-watched it. I thought, really? Then as the years have gone on and I've been working, I've gotten to the point where I agree with her. If you have a lot of conditionals in a class, you have probably missed a concept that should be extracted out of it. So the initialize and option method from our previous implementation carry over unchanged, except they're going to store the options in a hash instead of just the type. My valid method now simply asks all the options if they're valid, and the value method simply looks up the option, the hash, and asks it for its value. So now we need to build the options. We have to implement this. And this is where we're going to instantiate the objects that represent the Boolean string and integer options. So now we have the command-line-option class. We need collaborators. In order to get anything done, command-line-option needs option classes to manage. It's got to have those objects. So this is creating a dependency. And if we're going to create a dependency in our code, we can do it in a way that's amenable to change, or we can do it in a way that's going to make it hurt in the future. You don't want to depend, or excuse me, you want to depend on abstractions, not concretions. Depend on the duct type, not the concrete type. In our case, depend on the concept of an option, not on the concrete types that implement that abstraction. In our case, option is the duct type. This is the abstraction that I missed earlier when I just kept going down the conditional logic path. It's really simple. It has a valid method and a value method. String option, integer option, and Boolean option, those are the concrete implementation of the option abstraction. All they need is a valid and a value method and a consistent method of construction. And I can depend on the abstraction, not on the concretions. So how do I do that? I could go down the case statement road again and check the option type, instantiating the correct type of the option based upon the symbol. But I'm not going to do that, because that would tie our command line class to those concrete types, which we're trying to avoid. That creates a hard dependency between command line options class and those various classes. Instead, I'm going to use the dynamic capabilities of Ruby to instantiate those objects for us using naming conventions. For string, we're going to have a string option. For Boolean's Boolean option, et cetera. I can do this even in many static languages, so this isn't something that's specific to Ruby. And this very simple change takes our command line option class from depending on those concrete implementations and flips it to depending on the abstraction. This is dependency inversion from the solid principles in practice. Alternately, some other people have suggested you could use a hash and map from the string Boolean and integer symbols to the concrete classes, kind of like what Sandy did in her Gilded Rose Cotta solution earlier. That's okay, but it is an additional thing that I have to maintain over time. It's a reason to open the command line options file and change it if I have to add a new type of option. If using the dynamic ability of Ruby bothers you, then make a hash. Personally, I'm fine with using the dynamic capabilities of my language. So in my case, I've inoculated command line option class from needing to change to support new option types. At this point, this class should be closed for modification, but open for extension. So now we need to move the logic for the various option types to the appropriate option classes. I decided to make a base class of option for my concrete types to inherit from because the manner of the initialization needs to be the same for all of them. No sense of repeating that code. And the subtypes have a cohesion around the flag attribute and the wrong, excuse me, the flag and the raw value properties that are in the code. Here's the Boolean option. This one I just wrote because the requirements are so simple. Booleans are always valid, and they just return the raw value from the command line. If it's present, it's truthy. If it's nil, it's falsy. Very simple. But now we need to implement string option and integer option. And the logic for the validation and value extraction is in the old command line options class. So on the left are the original command line options, valid and value methods. On the right are those new string option and integer option classes. As you can see, the process of creating the option classes was simply picking apart and disassembling the old command line option class, moving the logic to where it belongs, using a combination of extract class and move method refactorings. We've really cleaned up the command line options. Frankly, there's not much code left there anymore. So now we can replace that nasty, hard-to-understand valid method with this and the large value method with this. To create the specs for the various option classes, I move the corresponding section from the command line option spec to the corresponding area for the particular type of option. And then lightly rework them, and then I work them from red to green as I went through the process of extracting those classes and moving the code to those methods. We've isolated abstractions here, and how do we do that? We separate the what from the how, like we've done in command line options. We want to move from code that looks like this to code that looks like this. The original command line options valid method contained all of the how. The refactored valid method says what we want done for us. That's it. All of the how has moved to the collaborators of our main class, in this case string option, Boolean option, and integer option. We want to move from code that looks like this to code that looks like this. Move the nitty-gritty details of your code out to the leaves of your system, and let the center be a coordinator. So, when we're done with this, this is what our command line options class looks like. These are our public methods. It provides a very small surface, and it fulfills the use case. And these are the private implementation crufts. It's necessary, but no one really needs to go poking around in here, just by declaring these methods private. They're for me, not for you. So, in the end, the sum total of the implementation of the public interface, and it's all delegated. All delegated. So, in the process of making the specs pass, I commented out that dreamed up code as I went through the process. And then one by one, I wrote the examples and uncommented the code, and made them pass working from red to green. Then, because nothing is ever really done, my buddy says, hey, any chance you could add the ability for me to pass an array of values for an option? So, to implement this new requirement, I only need the new array option class. So, I write a spec example, make it fail, then create the array option class, and I'm done. In this particular example, my option class is inheriting from the option with content superclass. And because I actually went through this and realized that strings, integers, and arrays all have content, so I extracted that superclass. And in this case, all I have to do is write the value method of that particular type, and I'm done. And it works. So, we now have a command line option class that's closed for modification, but open for extension. I could add float types, decimal types, other types of options, and I don't have to go back and touch that class again. We have small, easy-to-understand option classes that have a single responsibility. Oops, excuse me. We can... So, we have easy-to-understand option classes that have a single responsibility and easy-to-compose together with that command line option class. And we can simply create new option types and have them instantiate it by convention. My name is Mark Menard. My company's Enable Labs. We do full lifecycle business productivity and SaaS app development from napkin to production, as I say. And I'm gonna be around the conference, so let's gather and talk about some code. And we can do some questions.


What is good Marvel Squad? And welcome back to our channel. If you guys are new, make sure to go out and hit that subscribe button and join the Marvel family and make sure to give this video a big thumbs up if you're a Team Mariah. I try to get this video of 5,000 likes to prove to Bill that Team Mariah is the best team, whether he thinks so or not. Let's prove that to him by giving it to 5,000 likes. So Bill is currently in the shower right now and I'm all the way in my vanity room. So I don't have to be super quiet but I still gotta be quiet just in case. This man sometimes takes 30 minute showers. Well, actually he's gotten a lot better with the showers. I'm not gonna diss on him, but he's in the shower right now. So I'm like, okay, this is going to have to do my intro, get everything on the line. If you guys ever write today's title, you already know what's gonna go down. But I wanna tell you how I plotted this, okay? So yesterday we got a couple's massage. I haven't had a couple's massage with Bill since Hawaii when he proposed, he looked like a whole cute on massage day before he proposed to me, which was super sweet. Hawaii massages, mwah, chef's kiss. But also yesterday's massage was really nice. So that was like our second massage together. And while I was getting this massage, I was laying there plotting, I'm like, hmm. I'm like, what can Team Mariah come back with? What is something fire that I can pull on him? And as I was laying there, I thought I could say that this is so bad. I'm gonna be telling him that the girl who gave me massage also gave me a happy ending. Oh, it's so bad. It's so bad. We both had girls, which honestly won't make him as mad and I'm gonna say that she whispered in my ear and asked if I wanted a happy ending. And I was like, heck yes, I'll get a happy ending. But in reality, it never happened. But I'm gonna tell him that and I'm gonna say babe, I was super nervous to tell you yesterday. I didn't want you to be mad at me. And I honestly didn't think you would care because it was a girl and it wasn't like a guy was massaging me and gave me a happy ending. It was just a girl. So he really can't be that mad, right? You guys, I was laying there and I'm like, bro, this is gonna make a good video. I feel like that is so freaking funny. But yeah, I'm super nervous. I don't know if he's gonna be mad, but I think he's gonna be mad. I think this is gonna make him be like, what the heck, Mai? Like, why didn't you tell me yesterday? Like, and we booked another spa next month and I'm gonna tell him that I also told her I wouldn't want a happy ending again that next month too, but I didn't want to tell him because I didn't want him to be mad at me. Team Araya comes up and plots the best pranks. Whether Team Bill thinks so or not, this is fire. I'm super nervous. I'm gonna go out there after he gets out of the shower and just confess that I got a happy ending yesterday after my massage. So we're gonna see how he reacts.  He's gonna be put to the test today. We're gonna see how he reacts.  Give me prayers in the comments because I'm throwing this on him in a minute. He is about to be mind blown and confused and questioning me because we were in the same room and why didn't he hear me? I don't know. Ew, that's so gross. But anyway, so let's go prank him and wish me luck seriously. I'm gonna eat it. All right. Sorry, I ate your other case of ea. Because you were taken too. What? I had, I need two. I need two. Yeah. And then I ate the other ones. I was so... Wow. So I didn't realize how hungry I actually was. That's phobias. I know. Smell good. All right, here's that. We're gonna do a scented, we can start plugging in the little scented, little things. Yeah. Ah. Yeah, the pillows. I don't want to put on any spiderwebs yet though because I want it to be like September. Well, I don't really want, I don't know if I want any spiderwebs this year. I'm excited for our massages again. Oh, yeah. Was it awesome yesterday? Did you like that massage? A lot. A lot? I think my back fell or something. Probably she was going at it. Yeah, my lady was really good. Like, she put in the worm. I know, I was like... But she like did it lightly. It was like the perfect amount of pressure. I like because when they were doing the massage, they would have one elbow going like this. No, no, no. But they would go out your spine, but then they would come with their other hand and do something at the same time. They didn't do that in Hawaii. That would have been a good one. That was better than Hawaii. I have something to tell you though. What? You're kind of nervous. Why?  Why? What are you doing? Spread it out. What you do? Why are you staring at me? Actually, I don't even know how you're gonna react to this. I don't think you should be mad because we had two girls yesterday, so I know you're not gonna be super mad, but... I don't know if there's something I wanna tell you, but I think you're gonna freak out. I don't know how you're gonna react.  What happened? What, did you fart when she was massaging you? Did you fart? Nope. I was thinking about it. I was like, what about... You had to use the restroom so bad, and you just like... Ew. I thought about it. I was like, what do you do? You just hit the level of the river. Like, I bet you it's happened before. Okay. I was thinking that when I was laying there, I was like, huh. So what did you do? Why are you like... There's something I wanna tell you. Spit it out. Okay, so after she was like... What, did you forget to tip her or something? No, she was massaging my head, you know? Yeah. And she whispers in my ear, and she was like, are you comfortable with happy ending? And I was like... She did not. Okay, she did. She said that. And I was like, I mean... You're lying. I said, yeah. Because I was nervous to say no. I didn't wanna say no to her because I'm new there. I didn't wanna... Why would she ask you that? She was like, it didn't even have the ending.  No, she did not. Yes. Babe. You mean she did. You mean like a... She like, gave me a massage down there. It was really good. No, she did not. I'm like, a lot. I was right next to you. There was no damn way that she did it. She did that next time. It was pretty good. But listen, I forgot. It was like a joke. People don't actually do that. There's a case that I've had the endings. Yes, there is. You're lying. I'm not lying. She asked me. I'm surprised she... I thought it was a routine. I was just here to say no, babe. What are you doing? You're going from A to Z. What happened? She asked you, are you okay with it? And then she continued to do it in the same... She asked me, I was okay with it. It's a joke. Please tell me this is a joke. There is no way. I was in the room with you. I said yes. Because I was too nervous to say no. Babe, I'm not gonna lie. Pinky promise. Pinky promise. Pinky promise? No, I can't promise you that. What are you... Okay, so she did it. No, she did. Babe, I'm so confused right now. And then she asked me when I come back if I would like the same thing again. I said yes. That's why I was so happy with it. I'm making it next to my name because it was so good. Just to get this straight. You mean it a happy and nice... Yes, like she massaged me down there. Are you mad? I didn't think he'd be upset because it's a girl. She was just looking at me on the side. She said, I look tense down there. There's no... And you like this? I look tense down. She gave me a massage and... Okay, okay. She's pretty far. Did she like around your abdomen? Oh, like actually touch... This is a joke. There's no f***ing way she did. Okay babe, are you mad? Are you like disgusted? I'm a little annoyed that you didn't tell me yesterday. Are you disgusted with me? That's kind of weird. Don't you think? Especially being the room next to you. The starting massage might be every other part of my body. What's the difference of massaging there? I didn't see the difference. This is your life. I want you to be 100%. And it was the way she was massaging. I'm like, oh, that's really good. Yeah. You liked it? And you liked it? Yes, I liked it. It was really good. What do you mean? Bro, you're on. This is a joke. It's not a joke. I'm telling you. There is... Look at that, that noise. Oh my God.  That is nasty. She just...  She don't feel good. You should get it next time. I don't even know what to say. She didn't ask you for one? I don't even know. She asked me for one because she was a different girl. And it's different because... You're tweeting. Our body parts. I'm not being for real. I'm just telling you that's straight. I feel like it's a sell-out. That's why after the appointment, you were like, is everything okay? And I was like... What? You were like, what? I was like, so dead. Because I was nervous to tell you what happened. Really? Yes. You're being dead-ass serious. I'm my grave. No. I can't promise you that. She's lying. No, I'm not. What are you looking at? No, I'm just...  I wish you could have done that to me then, if I knew. You saw the camera. No. Yes, you did. I wish she... I wish I could have gotten happy at the end. You saw.    I was pranking you. You said this wasn't a joke. That's all I was thinking about all the time. She didn't give me a happy ending. The whole time, I was like, oh my God, I wish... No, you saw it in the camera. What camera? Yeah, now you're trying to say that you wanted a happy ending. What are you talking about? What are you talking about? You didn't even hide? Like, I can see it from here. Bill! I thought he would be better. If this was America Got Talent, I'd be hitting that buzzard right now. You'd be hitting that buzzard? Yeah. The buzzard. You get the red X. The buzzard is not being hit, babe.  I got you. I know what you're doing. Honestly though, would you have been actually mad if that happened? Not if it happened to me. Bam! I was with my girl, so I feel like it's not as bad if it was a guy, because a guy was doing a happy ending to do it. It's the same thing if you liked it, it's weird. No, because it's a massage. You like massages, right? Okay, did you want one? No. Because bye. No. Can you give me a massage? I can give you. Happy ending massage? Oh my God. Okay, enough. Enough. Keep doing it in here, come on. Guys, I can't believe I pulled this through. Babe, I was laying in there and I'm like, I was trying to think of a really good prank. You thought of this? I thought of it while I was in there. That's weird. No, it wasn't weird. I was sad. What were you thinking about? I was planning, I was like, what could make a good prank? And I was like, So you were telling me. Massages, I'm like, all we could do is add. This girl thought of this while she was getting the massage. No, it's like the Brazilian wax from the guy. Oh my God. I was like, hmm, that would be a good idea to do it saying I got a happy ending. That's terrible. I really thought, I really thought you were serious in this. You know what, you can't pull a prank like that. You can't think like that. I gotta create a mind. You don't gotta create a mind like me. No big deal. Like it's okay. Okay. Wait, hold up. Watch our last video and then come back and tell me. Tell me I'm wrong. Guys, be quiet. T-Mari came back. Like I said, gives video to 5,000 likes if you're on T-Mariah. No, none of the factors that you came back from me. No, I plotted a good prank that was original in my thought. My bro. I think I'm still here in the prank board. That's full facts. Guys, it's kind of down below-ish, T-Mari. Let's settle this debate. Guys, we're gonna end the video right here. Make sure to give this video a big thumbs up. If you guys haven't, make sure to go hit that subscribe button and stay tuned for more T-Mariah pranks because this is always the beginning of Christmas.  Anyways, guys, we'll see you in the next video. Our house will be decorated for Halloween too, probably. No, I just finished my KCD and I like to talk more. No, we're done. We're done. We will see you guys in the next video, but until then- Peace. Love you guys. Also stay tuned for our TikTok on me nose plucking his nose right now. Let's go. Your nose plucking? You mean waxing? No, you stick a thing or waxing and you yank it out. I don't wanna do that. That's what-


Today, we're planting a spring wonder sergeant cherry, which shouldn't grow into this building right next to us. The other thing we have to worry about is underground utilities. In North Dakota, dial 811 before digging or go to nd1call.com. In this location, we've already done that. Actually, we did it a year ago. The tree that was planted unfortunately didn't take. So today we're going to plant into this old spot. This type of planting stock is called bear root. And it's bear root, as you can see, because the roots have no soil on them or very little. One thing about a bear root tree and advantage is you can see what you have for a root system. And what we want to do before planting is get rid of any broken or damaged roots, such as this one right here. There's another one over on this side. I'm going to trim back. It's been skinned a little bit. Otherwise, this is a pretty healthy root system. Now we know how big the root system is.  Well, as we can see, this hole from the previous tree is not big enough. You know, here in North Dakota, a lot of people think about planting the tree deep because of our high winds. And actually, that's not correct. We should plant it at the root collar or root flare where the stem transitions to become roots. This is the depth that the tree should be planted. That's the depth that roots are naturally in the wild. So we're going to have to dig this one a little bit deeper and wider, this hole. But that's the depth that we'll plant this tree at. That's pretty good. OK, we've got the depth set. And one of the things I want to point out is there is a little bit of airspace underneath this. We're going to backfill with soil and then water it in. Let the soil and water kind of fill in those airspaces. We're not going to fill them in beforehand. The other thing is, if the roots are too long, you know what? You can trim them back just a little bit. That one and this one. OK, you want to start and I'll... Couple other things to point out. We still have to stake and strap this tree. I also want to trim any broken or dying branches. Actually, there are none on this tree. This tree's in really good shape. But a lot of people think they have to cut back the top because the root system's been cut back. Well, a lot of research has been done on that and we've found that actually leaving the top in place is really important. The other thing is, in terms of packing the soil and the roots, we don't need to pack the soil very hard. When we water this tree in, which we'll do in a few moments, that should carry the soil down into those air pockets and firm it up as well as hold it in place. And of course, strapping will hold it in place. And we don't want to choke the tree with the straps. Cradle it so it doesn't blow over in a high wind. Last thing you want to do is water the tree in, which we're doing right now. A good soak will do it. We'll do a good job. We'll carry the soil back around those roots and help keep that root system from drying out. I like to water at planting pretty quickly right after planting and then maybe two weeks later if there's been no rain. For the rest of the summer, maybe once a week, once every two weeks, depending on how much rain there's been. The best time to plant a tree was 20 years ago. The second best time is today. Have fun.