Hey, this is Brett and this 2016 Ford F350 Crew Cab Long Box Dual Rear Wheel Lariat FX4 is stock number 12526Z. We are here at Summit Automotive in Fond du Lac, Wisconsin, near New and used heavy duty truck headquarters. This 2016 Ford F350 has the 6.7 liter Power Stroke diesel engine. This truck has been fully safety and inspected by our service shop, has a fresh oil and filter change, all the fluids have been checked and topped off, and this truck is 100% ready to go. We're going to go all the way around inside, under the hood, started up in this video. Platinum Tri-Coat Metallic is the color and we shoot all of our videos in 1080p, 60 frames per second. So if you have HD capabilities on your computer, tablet, smartphone, or television, I highly recommend turning them on right now because it is your best way to check out the quality, condition, options, and cleanliness of the truck before seeing it in person. And if you like the video and how we do things here at Summit Automotive in the upper right hand part of the screen is a link to subscribe to our YouTube channel, click that, and then click the bell notifications and you'll get updates on the videos we do each and every day here at Summit Auto of our new and used inventory. It comes with the polished aluminum rims in it. In the front here we have BF Goodrich Rugged Trail TA tires. These are LT24575R17s and they have, I'd say, probably 60% of the tread left on them. Comes with the Rancho Shocks. Even underbody is exceptionally clean. This truck lived its entire life down south between Mississippi, South Carolina, and Texas. Front fender is in excellent shape. No dents or dings on there. It does have crystal clear headlights, factory fog lights. Front bumper and lower valence are in nice shape. Comes with a Trail FX chrome grille guard. No dents or dings on that front bumper. Looks really good. And you do get the chrome trimmed grille. The hood is in excellent condition. Didn't see any dents or dings in there. And we do have cab lights up top. Passenger side front fender, no dents or dings on that. And the passenger side rim, no major scuffs or scrapes. As you go down this side of the truck, take note of how clean the body is, how reflective and mirror-like that paint is. We take these HD videos, so if you are far away or even if you're close by and just cannot make the trip down but you're still interested in purchasing the vehicle, you can see the truck, hear the truck, and have confidence in the vehicle that you're looking at before you even get here. So when you do get here, there's absolutely no surprises and you can make a smart and informed buying decision from wherever you're at. And if this video helps you make that buying decision, let your salesman know that you saw the video, that it was helpful, and that Brett sent you. On the back, we have Corsa, all-terrain XL tires. These are LT24575R17s. You get the polished aluminum rims back here, they're in very nice shape. And these tires are very new as well. I would say probably 80 to 90% of the tread on that outside tire, and the inside tire is the BF Goodrich Rugged Trails as well. The frame and underbody, like I said, absolutely perfect. Has the camper package with the anti-sway bar right there. Very little to no corrosion on this frame. Has all the remaining factory exhaust. You can see just how clean that body is. Wow. It's like a brand new truck under here. Lower rockers and cab corners all look really good and it does come with the nice factory chrome step bars. The dually tub is in nice shape, FX4 off-road suspension package coming around to the back. Rear bumper is in nice shape, you do get the backup parking sensors. Full towing package, of course, with the receiver hitch, 4-pin and 7-pin wiring. The tailgate is in nice shape, I didn't see any major dents or dings on there. It does have the tailgate step assist. Comes with a rugged cover, fold-up tonneau cover. That's in pretty nice shape. And this one comes with a pro series, 16,000 pound fifth wheel with it. So that is included with the truck. You get a spraying bed liner, the bed is in really nice shape, and you do get 7-pin wiring back here. Tailgate shuts nice and solidly. And as you go down the driver's side, just as clean as that passenger's side, no major dents or dings in the box. Beautiful full disclosure of this back rim. Excellent shape as well. Down the rest of the side of the truck looks really good. You get the driver's side door code entry. We do have the code for this truck, and if you ever wanted to find out what your door code is for your 2011 to 2016 Super Duty in the upper right-hand part of the screen, we got a video showing you how to do that. This one does have the telescopic tow mirrors built in directional signals. They power scope in. Power scope out. I'll show you that in just a second. Inside the Lariat package gives you the tan leather interior. There are no rips or tears on the seats. They're in very nice shape. Factory all-weather floor mats, power pedals, auto headlamps, power windows, power locks, power mirrors, memory driver's seat. These mirrors do power fold in like so. I always like showing both sides so that you know that both sides are working properly. And this one does have the Sony premium sound system. We'll hop inside, check out the miles, radio, and everything that this truck has to offer on the interior. I do want to show you those mirrors do power scope out and in like so. And once again, both sides. All right, we'll dim it down here. 25,670 miles on this truck. Instrument cluster is very nice and clean. Comes with the leather-wrapped steering wheel, Bluetooth and audio controls on the right, cruise controls on the left, and information center controls. This one comes with the six-speed automatic transmission with the optional tap shift. Turn dial four-wheel drive does have the traction control system. Factory exhaust break. Here is your My Ford Touch radio. It does come with the factory navigation system. This is a Lariat Ultimate so you get the nav and the power sunroof CD player. You can do your climate controls here as well, including your heated and cooled seat buttons. And then your radio controls are right here, AM FM and Sirius XM radio capabilities. This is also where your backup camera shows up and you can see that that is working nicely. Down here your more tactile radio and climate controls, factory brake controller, four upfitter switches, and then a 110 volt, 150 watt plug-in as well as a 12-volt power point. Pass and recide format and seat are in excellent condition as well, no rips or tears. The headliner is in really nice condition too, and you do get the power sunroof. Hold link buttons for your garage drawer security systems and lighting systems, as well as map lights and power sliding rear window controls and power sunroof controls. We'll take a quick look at the back seats and then we'll start it up and take a look under the hood. Back seats are just as clean as the front seats. These back seats are heated as well on the outboard side. No rips or tears on the seats. Power sliding rear window with the built-in rear defrost. These seats do lock with the ignition key right there to have a storage area that locks. The all-weather floor mat back here is in nice shape, 110 volt, 150 watt plug-in, 12-volt power point, and this truck does come with side current and airbags. So the seats go up like that, and then you get a little bit of storage behind here. You also get the factory subwoofer and the latch tether anchors. There are your buttons for your heated seats, child safety locks on the back doors, and check out how nice and clean the bottoms of these doors all are. It's a nice part about getting a Southern truck with no corrosion. Very nice. We'll start that up and take a look under the hood. Get the built forward tough animation. No check engine lights or anything like that. And I would personally like to thank you for checking out the video today, and hopefully from this HD video you will have been able to verify the quality and condition of this truck all the way around, inside, and out. Under the hood we have the 6.7 liter power stroke diesel engine. Engine bay is very clean, runs very smooth. Once again, this truck has been fully safe and inspected by our server shop, has a fresh oil and filter change, all the fluids have been tracked and topped off, and this truck is 100% ready to go. Shocks are doing a nice job holding the hood up, and there is your emissions sticker. I would highly recommend this truck from a quality and condition standpoint. Really nice condition, no rust, no corrosion. This is the one. And to see more pictures of this truck, or one of rather 450 new and used cars, trucks, SUVs, minivans, Wranglers, halftones, three-quarter tons, one tons, you name it, we got to go to that website right there, www.summitauto.com, full pictures and descriptions of every single vehicle from two locations all at www.summitauto.com. And if you'd like to check out more HD videos you can go to www.youtube.com. Remember to like, subscribe, and share on this video and all the videos that you see there, click the bell notifications. You get updates on the videos we do each and every day here at Summit Automotive. In fact, in a second you will see a link to subscribe to our YouTube channel in the upper left. A link to more F350 videos like this one in the upper right, a link to this vehicle on our website in the lower left, and a link to one of our latest YouTube videos in the lower right. Click those, check us out. And we're super excited to help you with this Ultra Clean 2016 Ford F350 Crew Cab Long Box Dually, Lariat Ultimate FX4, and White Platinum Tri-Coat Metallic. Thanks again for checking out the video, remember to like, subscribe, and share.


Are you tired of feeling like improving your mental health is an uphill battle with no end in sight? It can be daunting, but the good news is that you might be in a much better place than you think. Sometimes the signs of mental well-being are so subtle that you may not even notice them, but trust us, they are there and they're worth celebrating. In this video, we'll explore these powerful yet understated things that you're on the right track to a healthier, happier you. Emotional Stability Stability is a magic word and often taken for granted when you're experiencing it. However, maintaining stability in your daily life is a huge sign that your mental health is in better shape, according to therapist Theodora Blanchfield. Being stable in regard to your mental health is much more than just psychological. Of course, being able to regulate your emotions and prevent outbursts are wonderful signs of this, but there's more to it. On the physical side of this, stability looks like regular and consistent sleeping patterns, eating habits, and an ability to handle your work-life balance. Struggling with mental health can make all of these difficult. You're overwhelmed by all that you have to do. Your eating significantly less or more and you may oversleep or undersleep. Seeing a reduction in these issues is a great sign that you're on the right track. Dealing with challenges We touched on emotional stability earlier. The big part of this is being able to take on challenges without getting overwhelmed. An article on mentalhealth.org explains that having good mental health doesn't mean feeling good all the time and that life is full of unavoidable risks, worries, and losses that affect everyone. Having strong mental health means that you're emotionally equipped to handle these challenges. When these inevitable hardships come up, you're able to validate your emotions and deal with them in a healthy manner. Of course, this varies from individual to individual and your specific situation. It's also important to know that some of these situations are best handled with a mental health professional, especially based on your individual case. Seeing a therapist doesn't indicate weakness and can be an important component to getting through a hard time. When life gets hard, knowing who to turn to, what strategies you can employ, and how to manage your emotions are all indicative of strong mental health. Feeling joyous and confident. Clinical psychologist Dr. Carlos Schumann, PhD, discusses traits of a mentally healthy individual. These traits include being able to maintain healthy relationships, a sense of purpose, resilience, and of course feeling joyous and confident. According to the World Health Organization, if you have good mental health, you're able to fully experience emotions of happiness, love, joy, and compassion. These are all wonderful things, but sometimes we get in spots where all of these feel impossible. When you're operating at your best, you'll likely feel your best as well. You're able to tackle your life's responsibilities and feel confident in yourself. Talking with a qualified mental health professional can be a great resource here if you find you struggle in these areas, or perhaps you want to strengthen them further. Everyone's unique, so working to find out what best benefits you is something that a professional can help you navigate. Boundaries Healthy boundaries are important. They show that you give your needs priority and express what you're okay with and not okay with. The Banyan Treatment Center explains that improvement in your boundaries is a great sign that your mental health is getting better. When people are constantly demanding your time, being able to put your foot down and assert yourself is a great skill to maintain balance and control in your life. This is difficult work though. Being able to say no to people that may become upset with you for doing so isn't fun. However, having the confidence to know that it's the best route for you is a sign of strong mental health. Self-acceptance The Banyan Treatment Center also talks about the importance of acceptance. They state that mental illness often comes with a lot of shame, self-consciousness, self-doubt, and lack of self-confidence. People often respond to these feelings by seeking validation and acceptance from others. Being able to shift your mode of acceptance from others to yourself is a sign that your mental health is improving. You can seek validation in yourself and you don't need someone to do that for you. You're able to truly trust yourself and thus are more self-reliant. Of course, this takes work to build and isn't something that happens overnight. However, slowly building up this skill will show its benefits long-term. Increased Passion for Living One of the signs of improving mental health is something you may not immediately be aware of. Over time and with work, you may gradually start to feel that your life is more exciting. You have reasons to get up in the morning. People you're looking forward to see and brought a purpose. These things take a lot of time to achieve and you may not realize them right away. However, by working on your mental health through a therapist and medication or taking several steps to improve different areas you're struggling in will gradually show. On top of this, you're better equipped to handle difficulties and know that when things get bad, it will pass. Strong mental health can look different for everyone. It can also be difficult to tell if you're making progress as the signs may be subtle. Mental health is never one size fits all and improving it will look different for each individual. If you are struggling or looking for ways to improve your wellness, getting in touch with a mental health professional can help you see what you can do to get started. Let us know your thoughts on this topic. What are some ways you can tell that you've improved mentally? What advice would you give to others? Let us know in the comment section. Be sure to like the video and share it. Remember to subscribe to Psych2Cup.


Oh, everyone, good morning. Welcome. You guys are getting a special treat. I am fairly certain this is the longest title for a talk I have ever given. So my name is Michael Snoyman. I'm the VP of Engineering at FP Complete. Happy to be talking to you guys today about why and what. And actually, that's going to be the first important thing. Why why? Most people have no idea how to pronounce W-A-I. We pronounce it why because we like to confuse people. All right. So why is the web application interface pronounced why? This started many years ago, and I'm not going to tell you. I actually should have looked up how long ago I started working on why, but it's years and many years ago. And I did it because I wanted to do web development in Haskell, but I didn't want to have to actually maintain my own web server. That turned out to be a joke because I do actually now maintain my own web server.  This is an unique Haskell concept. It's not like Haskell invented a new thing that didn't exist in the world. Who here has ever heard of Rack in Ruby? So if you've heard of Rack in Ruby, then why is the same thing for Haskell? You may ask, why didn't you call it hack? Someone else did. OK. Why is an interface? It's shared by multiple frameworks. So I wrote a framework called usode. There's another framework, servant, Scotty Spock. Probably a few others I'm not remembering right now. All of them target why. So it works as this underline interface that lots of different things are able to use. As a result of this, not only can you have these different, let's call them front ends, these different frameworks or applications, you can also swap out backends. So you can use a real web server. Warp is the one that we use most often. But you can also have this testing backend. So you're able to go ahead and write tests for your application without ever actually doing any kind of network traffic. Who here knows that you don't have to test Haskell applications? That's a lie. You must test your Haskell applications. Don't? Thank you. Who here knows what CGI is? Now put your hand down if you think it has something to do with movies. CGI is this old thing that only dinosaurs like me actually remember. Anyway, why has support for it? Because why not? It's still there. The other thing that we've got is middlewares. We'll get into what all these different things are. But middlewares do kind of what they sound like.  Jump right in, because everyone likes looking at code. This is a Hello World application in why. We have imports. We've got three import lines, which is pretty benign for a Haskell application. We've got a language extension. Usually there are at least 20 of those. We've got some stack stuff at the top to tell which version of GHC in the library is to use. And then we've got this thing. We're going to run something listening on port 3000. There's some weirdness about lambda and request and something about send. And we're going to make a builder response. We don't know what a builder is. But it's going to have status code 200. It's going to be text plain content type. And it's going to say Hello World from why. All the things that don't really make sense right now will make sense by the end of this talk. So what are the goals of why? How is it designed? What is the motivation behind it? So the high level motivation is we want an interface, but how do you design that interface? One of them is minimal overhead. It should not be, there should not be a situation where you say, hey, I'm writing this web application, but I need to get a little bit of extra performance. I better stop using why and use something else instead. We want to make this as minimal as possible. And that includes things like not doing unnecessary parsing. That will come up later when we talk about, say, post request bodies. To be unopinionated, I told you four web frameworks that all work using why. At least three of them are very different from each other. Scotty and Spock are kind of similar. But Servant and Yusod and Scotty Spock, they all work in very different ways. Yet they're all on top of the same kind of framework. There's an application, at least one very popular application, Google, doesn't use a framework at all and targets why directly. And yet somehow this one framework, this one interface is able to work for all these different kinds of cases. Should be extensible. There's no way that I'm going to design why with the ability to handle every single use case that anyone could ever possibly think of. So we have some options built into it for extending it. There's a vault inside of it where you can stick arbitrary key value data and things along those lines. And if that sounds weird in a statically typed language, it is. But it does work. It's stable. I think it's been about four years since the last breaking change in why. At this point, we don't want to change why. We want it to stay the way it is. We want people to be able to write an application and have it continue working for a long time. And finally, batteries are not included. So this phrase means all these cool things that you want to do. You want to run a web server. You want to do logging. You want to do gzip compression or anything else. That is not included with the why package. The why package is tiny. It defines a few basic things that I'm going to explain. But instead of including all of that in the base, the idea is that the batteries should be available. Which brings us to the common packages that we would use with why. The why package itself includes the core data types and a few tiny utility functions. Warp is a package which provides what we'd call the de facto standard server. I don't know if anyone else has written any other web server for why. But at least 99 out of 100 times, if someone says why web server, they're talking about warp. Why extra is kind of where the batteries get thrown. It's got a whole bunch of different middlewares. It's got some helpers. It's got some parsing stuff going on in there. And we're going to use it by the end of this talk. Why conduit is, so conduit is a streaming data library that I wrote. Why conduit is an interface to let why and streaming data tie in together. And this ties in with this idea of it being unopinionated. We're not telling you which streaming data library you should use, but there is one available. And to prove the point, pipes why, pipes is another streaming data library that's also available. And why web sockets you can probably guess that that lets you work with web sockets in why. Okay, this is the basics of the entire interface of why. We've got a data type called request. As a user of why, and I'm going to assume most people here are going to be users of why, you're never going to create this. You're going to be handed this by some kind of a backend. So warp will parse a request body and generate a request. The testing backend will generate a request based off of some information that you provided and so on. Response is the thing you're going to make. You're going to take the request, you're going to do something and you're going to generate a response. What's included in the response? The status code, the headers, and the body. And we'll show a few different ways that you can create those. We would love to have SimpleApp. SimpleApp, even for people who have never seen Haskell, I can explain it to them pretty easily. An application is something that takes a request. It does some IO and it gives you a response. It's a nice story. It sounds great and it doesn't work. The most complicated part of the talk is going to be understanding why SimpleApp is insufficient for writing a real application. You can write a lot of applications with SimpleApp, but you can't write some advanced ones with it. Since we want why to work for all use cases, we don't want it to be unopinionated and universal, we have to do something a little bit smarter than this. So therefore we do have this application type, which I'm going to get to and we will explain later. And finally, a middleware, and this is a really cool one. A middleware is something that just transforms an application. It takes the original application and it does something. So a logging middleware transforms an application into an application that also does logging. And we'll see how to write some of these later. Use them also. So what kind of fields exist in this request? Well, we've got the raw path info and the raw query string. These are byte strings. These are actual raw bytes that were sent over the network. We also have the parsed version of these. We've got path info and we've got query string. So this is parsed out and it's quite a bit easier to work with. It's usually the thing at your application or in your framework that you actually want to be working with. This covers the get parameters. So if you're talking like the PHP world where they talk about get and post, the get parameters are handled by the query string. Post parameters are not anywhere to be found in this request type. And the reason is in order to parse post parameters, you have to parse the request body of the HTTP request. And in order to do that, you have to do additional IO. You have to do additional parsing. And if you don't actually need that information, it's a waste of time. Also, it's a very opinionated way of doing the parsing. We're gonna check the request headers and then we're gonna make a decision. But maybe you have your own special application that has its own way of parsing these things. Why shouldn't it get in the way? So why extra provides some kind of functions which we're gonna use later to parse this, but it doesn't do the parsing for you. Who here has ever heard the term smart constructor in Haskell? So smart constructor in Haskell is saying we are going to hide away the real constructor, the real data constructor, so that we can make things more extensible in the future. And instead, we're gonna provide some functions that use those behind the scenes, that have access to the hidden stuff. This means that it's easier to extend things in the future and we've actually used that in the case of Y. When we added WebSock and support, we had to add a new kind of response raw, which I'm not gonna talk about here, but those kinds of things do play in. So, probably the simplest, most commonly used response constructor in Y is response LBS.  Lazy means it can take up a bunch of memory and it can be generated on the fly. You should never use them but we use them here. Don't ask me later why I say you should never use them. That's a different topic. All you give it is the status, a list of the headers, and the body itself, and that generates a response. We also have this thing called response builder. And a builder is a byte string builder and it's this thing that will fill up buffers efficiently. And this is also where we get into this minimal overhead. Y under the surface is able to use these builders in order to specify the response bodies. And that means that when Y goes ahead and generates a response, it's able to go ahead and open up a, well this is warp actually, not Y. Warp is able to say open up a single buffer. It's able to write all of this different bit of information directly into that memory buffer without having to do additional memory buffer copies. And then with a single system call if your response is small enough, it's able to send the whole thing over the network. So that's a really nice optimization. Builders are a great thing. They're actually underused in Haskell as far as I'm concerned and this is the way we do a lot of the response building in Y. You can also generate a response from a file. Warp has built in support for this. Why do I say warp has built in support? We'll get to that in a sec. Anyone who's ever used the send file system call or heard of the send file system call, this is a cool optimization on most Unix systems, maybe all Unix systems, that allows you to bypass going through user space for copying data from a file directly over to a socket. And that's nice because we like to do things more efficiently and not do things in user space. But there are some cases where you're not able to use this. Let's say that you have work TLS. Let's say you're going to actually encrypt the data. You can't copy unencrypted data directly over to the network socket. You have to encrypt it first. So some backends do not actually have support for this. And those backends will have to go ahead and do some kind of a fallback themselves. You as the user of Y don't have to worry about that. That's the backends concerned. You get to just say, I want a file. Take the file, serve the file. Also, if you're using a web framework like you sowed, if you're using something like YAP static, which is a static file server written on top of warp, if you're using any of those things, it handles all this for you and therefore you're going to get this more efficient way of doing things right out of the box. Generating a non-streaming response is really easy. That's the response builder stuff that I showed you. You've gone out and you figured out all the data that you need and then you go ahead and you build up in memory or representation of what you want to serve.  That's nice, but that's not always the case. Let's say that you're going to be generating a CSV file and you're going to generate it by reading a million rows out of a database. You don't want to have to read all one million rows into memory, generate the response and then send it off. You'd rather be able to do this in a streaming fashion. And this is where the most complicated part of the talk is going to pop up. So everyone get ready, it's not that bad. Let's say that instead of reading the data out of the database we're going to read the CSV data out of the file. I'm just using a file instead of the database because it's easier to demonstrate this. And let's say that I have this simple app type that I told you guys about before and I've got simple run. A function which is able to take a port, a simple application and run a web server. I'm going to now run this thing, that's my main function. It is going to ignore the request body and it's going to open up this binary file in read mode, get the file handle. It's going to lazily read out everything from the file and then return a response body. There's a very big bug in this and it's a very subtle and hard to find bug. I'll give everyone 30 seconds or so if anyone wants to try to find it. Anyone have a guess? Okay. The problem, actually I'll show you the problem first. The problem is with binary file, open the file handle and when it's done, it closes the file handle. That file handle, once it's closed, cannot be read from. But this lazy read, this is lazy IO, it's evil, it's horrible, but we're using it to prove a point. This lazy IO that's going on where we read out the lazy byte string, that thing is assuming that the file is going to stay open until the lazy byte string has been fully processed. Where does the lazy byte string get processed here? It gets processed after with binary file completes. We're taking the whole byte string, we're putting it into a response and now we have this thing that's still hoping that the file is open and it's going to return it. This thing's going to generate an exception at runtime because it's going to try to read out of a file handle that's already been closed and that's the problem. In order to fix this, what we need to be able to do is we need to put the with binary file completely outside of the part of our application that's going to send the file, that's going to send the data over the network. In order to make that happen, what we do is we modify the application type so that now, instead of just receiving the request, it also receives this helper callback function called send and send is able to send the response body inside our with binary file. This is also known as a CPS transform if you want to get geeky, but I hate using those terms. So here's the two different things side by side. The bad version is on top and we have with binary file on the outside and we return a response body outside of with binary file which is still pointing to the file handle and then the file handle gets closed. In the second case, we open up the file handle, we generate the response body and we immediately send it before we close the file handle. So the second version is exactly what we want to have. The second version is the way that Y is actually designed and in fact, that's the more complicated type that we're now going to see. In order to make this thing more type friendly, to make it so that the compiler is able to help you write your code correctly, we have this thing called response received. When you send a response, when you send that call that send function, it gives you back a response received and every application is required to return a response received at the end.  So now we have this type send which takes a response and gives you back a response received and our application is now just a little more complicated. It takes a request, it takes the send function and then it gives you back a response received. Warp and other backends use an internal module that provide this response received type. You're never gonna get to make one of these yourself.  So this is called continuation passing style and it means you stuck a function inside your function. I guess people don't like memes as much as I do. Okay. All right, that's the end of the hard part. Now we're gonna get into, let's just actually use this thing to write stuff. You can do routing in y really easily. You remember that path info that I showed you before? It's a list of texts. So here we go. We have, I've defined a helper function, okay helper, which is going to just send a response builder. And now I'm just using normal pattern matching. And this is going to serve slash when you, for a slash it's gonna return homepage. If you ask for slash foo, it's gonna give you slash foo, foobar works that way. And then we just generate a 404 not found response if it is anything else. If you look at this, you could squint a little bit and you could realize if you wanted to, you could do pattern matching on the query string just as easily as you could do pattern matching on the path info. You could do lookups. You could do whatever you want. You have a lot of flexibility in what you do because you're actually using the full power of Haskell at this point. Let's say that we wanna log. We want to log every incoming request and the outgoing response to our application. So I have my hello world application. I then have the logged version of hello world. All I've done is I've applied the function log std out on top of the function hello and that's it. We now have the ability to run the exact same application before except now we're gonna get log output to go along with it. The logging module request logger in yextra has a huge number of functions and configuration things because everyone needs to log their applications a different way or talk to different systems. So you can configure it a lot but the default, the way that I did it right here, I think it uses Apache style logging right out of the box. We can also just as easily write our own middleware. Harry Potter fans can pay attention to the words here. Okay, so we can also write our own middlewares. So I told you that a middleware is a function that takes an application and gives you back an application and an application is a function that takes a request and a send function. So a middleware turns into a function that takes an application, a request and a send function and then you can do whatever you want. So you can perform actions before the application runs. So I can, for example, print out I'm up to no good. I can modify the request so that the path info looks different than the original incoming request. I can take that modified request and pass that off to the application. I can then perform other actions afterwards and I can just return the output at the end like this. You can do lots of other things with middlewares. You can do basically whatever you want. Again, because it's just a normal Haskell function during normal Haskell things. Oh, also the last bullet there. You can also layer these as many layers deep as you want. So as you can see here, the logged hello is a middleware on top of an application but as far as the types are concerned, it's just an application. So if you took the gzip middleware and stuck it on top, that's fine. There's no problem at the type level at all. All right, let's try another example. Who here has ever done virtual host configuration in nginx or Apache? I do not ever remember how to do that. Every single time I need to configure virtual hosts, I go, I think I wrote a chapter in the USODE book on it and I think that's where I go and I copy the example I wrote last time. I can't remember them. It's not that difficult to do it and why though? Because the request headers are just data. Inside the request value, you can do use lookup and then you can go ahead and you can do whatever you want based off of the virtual host. So in this case, I'm either telling someone what the host is that they requested or I'm telling them there was no host header present. But if you wanna get real, what you're probably gonna wanna do is have different applications on different domain names and you can do that just as easily. So what we're doing here is we're looking up the host and now we're pattern matching because we love pattern matching in Haskell. So we're going to say for example.com, we wanna serve app one and the way you serve this application is you pass in the request and the send function and that's it. Same thing with app two and example.org. And then I generate two different error responses if the host either is in present or if it's a host that we don't know anything about. And if anyone wants to be really clever and play around with things, you could actually kind of like do a little bit of middleware tweaking at the same time that you're doing this virtual host dispatch. At the same time. Just grabbing another water. Okay.  So there are some ready to go applications ready for you to use from the Haskell ecosystem. And the one that I personally probably use the most is Yapp static, which serves a static, it does static file serving. So I import that. I use default file server settings. That has to do with how it generates cash headers, how often it checks whether the files in the file system have changed. You can go read the documentation for all the gory details of all the different settings. Like most things, there's a lot of configuration available, but out of the box, what it's going to do here is it's going to serve a web application that shows all of the files that are present in the content directory. And unsurprisingly, I'm able to just throw the log middleware on top of that. And I could throw any other middlewares on top of that as well. One of the other common ones that we like to use is throwing an authentication middleware on top. So for example, you only want people from your organization with a Google account for your G Suite account able to log in. Go ahead and get credentials from Google for an OAuth application, configure Y middleware OAuth, pass in the secret keys, and boom, you've got an authenticated file server that you're able to use. So how do you deploy a Y application? Basically, you can deploy it however you want. Haskell applications compile down to an executable and then you're going to do something with the executable. The most common way that people deploy their applications is to use warp as the backend and then to reverse proxy into that warp server from some kind of front end. So Nginx, Kubernetes, or like an AWS load balancer. In my experience, most of the time people do TLS termination at the load balancer. They don't bother having warp or the Haskell application itself handle TLS certificates, although you can. There is a warp TLS package that you're able to use. It's also possible to completely bypass that reverse proxy and spin up a virtual host, a virtual machine, stick a application right on there and just serve the port directly. All those things are possible, whatever you wanna do. Just so happens that the load balancing approach is the one that I see by far the most often. If you wanna have a lot of fun, you could go ahead and pull out that CGI backend and you can dust off your old Apache and you can serve it that way. I don't recommend it, but you can. And then often, so you could also, these executables, you could compile it on your local machine, you can upload it, or, and this is where at work, the way we almost always do things, you take your executable, you build it on CI, you have CI package up a Docker image and you deploy the Docker image. So I'm gonna give you guys an example of what some of these scripts look like. I'm gonna give you the caveat that the example I'm giving you predates our usage of a load balancer and a few other things. So it's making this overly complicated. It makes it a good example, but I'm not actually saying you should be this complicated in practice. Who has ever heard of historical reasons? Historical reasons. So it looks like this for historical reasons. All right. So I have an application which, it's available on GitHub and we build it on FDComplete's GitLab instance and deploy it to our Kubernetes cluster. It has two different applications in it. It's got storming.com and you showed web.com. This is the hysterical reasons part at this point with the setup with Kubernetes. At this point, I would just have two different deployments into Kubernetes and I wouldn't bother with this weird virtual hosting inside the web application itself, but this is what we've got. So then I have this third application that sits in front of them and does all the virtual host parsing and then uses something called HTTP reverse proxy to reverse proxy into the appropriate application. And yes, this is built on top of Y as well. It ties directly into warp and you're able to use this if you have some other reason for doing a reverse proxy. The reverse proxy launches these two other applications storming.com and you showed web.com and then keeps the other two running. If they dive and the whole thing goes down and GitLab CI builds all three and packages it into a Docker image. And this is what it looks like to build this thing in Docker. So I go ahead and I create this artifacts directory where all the static files, all the configuration files, everything else that's gonna be needed by these applications gets dumped in there. I then use stack, the Haskell build tool that I use. I use that to build the executables and dump all of those into that artifacts binary directory as well. Finally, I actually copy in all those static things that I told you about. And then we use Docker to build the image. The Docker file looks like this. We use, fpcode PID1 is a, it's a nice base image that takes care of the PID1 problem in Docker. If anyone is curious about what a PID1 problem is, talk to me afterwards that has nothing to do with Haskell at all.   And this is the entirety of the Docker file, or maybe the entirety. Maybe there are a few other things I left out, but that's basically it. It provides the additional tools that we need. We need get at runtime to install those, copies over the artifacts, and boom, we've got a Docker image and we're able to run that. GitLab CI is able to build this image by calling the build Docker.sh and then tagging the image appropriately. And then we're able to deploy this to our Kubernetes cluster by telling Kubernetes to pull in the new image name. What about exception handling? I talked a lot about the interface for why at the type level, but Haskell has runtime exceptions. What is the expectation around exceptions? So the basic idea is applications should not throw exceptions. And you might say, that's crazy. What do you do if you have, what if something goes wrong? Well, it's not the handler's responsibility to take care of it. Warp doesn't know what you want to do when something goes wrong. It doesn't know how to generate a nice error message to tell users. It doesn't know how to log information. It doesn't know how to send an alert.  Doesn't know any of that stuff. You've got to do that yourself. So the recommended approach, the correctors approach in why is inside your application, if there's any chance that you're going to generate an exception, you've got to catch all exceptions, do the logging, do all those other things.  All middlewares assume that your application will not throw an exception. They're not designed to recover from exceptions and then do something intelligent because they don't know what they're supposed to do either. You sowed the web framework I wrote that I mentioned earlier. It does a lot of this exception, catching and handling and massaging for you. Things got actually really crazy in Haskell because we have these lazy values that can also throw exceptions. So you sow takes care of all of that for you. And also make sure that you are async exception safe. That's an entirely different talk that I'm not going to give right now, but I have this link available if anyone wants to look at it from the slides later. All right, I'm going to tie off today by stepping through a sample of a JSON service using Y and then I think we'll have some good time for questions because it's not going to take that long. So we're going to step through this. I'm going to explain it and yeah, that's it. So the JSON service we're going to put together is a very simple mapping of names to age. And it's going to keep track of this in memory. It's not going to use a database or anything. We want to put in the service, we want the ability to get a list of all of the names that are currently in the database in memory. We want to query information about an individual. We want to find out how old a specific person is and we want to be able to add new people to this and we're going to have two different API endpoints to do this. One is going to be a put request using the query string to set the age and one is going to be a post request using the request body and post parameters. If anyone's wondering what's the advantage of having two different endpoints to add the same data to this store, the advantage is I get to show you two different ways of adding things to the store. Oh yeah, also when you get the slides, if you want to look, the full code is available on GitHub. Okay, so the API is going to have get slash people. It's going to return a JSON array of names. Post slash people, you give it the URL encoded body and it requires name and age parameters. Get slash person slash name, whatever the name is, we'll return a JSON object and put slash person slash name, question mark query string with age equals age. Those are it. In order to make it easier to read the type signatures, I'm going to define some type synonyms now. So I'm going to say that a name is a piece of text and age is an int and then we could get into, should we use a word, should we use unsigned, should we use son, whatever, we're using an int because I felt like it. We're going to have a people map. The people map is a mapping, a dictionary from someone's name to somebody's age. And if someone says, well, what if two people have the same name? This is a crappy application. Don't ask me difficult questions. And people var. People var is going to use a mutable variable, a T var, which comes from STM. Who has ever heard of STM? STM is software transactional memory and it's one of Haskell superpowers and you should definitely use it. It's awesome. All right, so we're going to have this mutable variable that's going to hold onto the map so that we're able to access updated versions of it and modify it when appropriate. We're also going to define some helper responses. And if it seems strange that for something so simple we're already having to jump in and find all of these helpers, now you're beginning to understand why I tell people not to use Y and to use a web framework instead. Because this is a lot of bookkeeping, a lot of manual stuff that you have to do. Just let a web framework handle it for you. Okay, so a not found response is a builder with status 404 and not found. And we could say maybe we should have a specific response type, content type or anything. Whatever, we're doing very simple stuff here. Bad request is a 405 response that you return when someone uses the wrong request method. It's not used as often as a 404 but 405 is also an important part of HTTP. And here is a helper function which is going to use the ASON library. ASON is the default standard library that most people use for JSON in the Haskell world. And you give me any kind of value that can be converted into JSON and I will give you a JSON response body. All right, so our router, the thing that's going to dispatch. By the way, these lines in the middle, the blank black line, it's just a formatting issue. You can ignore it. There's no deep mystery that anyone has to figure out. Okay, so my people application is going to be fed in a people variable and return an application. This is right off the bat an important aspect of how we do things. Haskell is all about functions and closures and capturing variables. When you, we're going to later on create this variable in our main function. Our application is predicated on having a variable available. The way that you provide the static confirmation isn't with some kind of mutable global variable or anything like that. You just pass it in as a function parameter. So we've got people app. We take people var and request and send because that's the way you make an application. Now I am going to pattern match on the path info. And this, these entries here correlate directly to the four endpoints that I told you about before. So if it's slash people, the path info list is going to have a single entry in it with the word people. There I'm able to go out and pattern match again on the request method. And if it's going to be get, I'll use get people response. And if it's post, I'm going to use post people response. And I'm passing in the request to post people response because I actually have to parse more information out of the request. I don't need to do that when I'm getting people. And then if it's neither one of those methods, I'm going to return a bad request, the 405 response. If I get slash person slash name, I'm able to capture it like that. And notice there's no, like, special syntax in order to do variable capture. Again, it's just a variable pattern wild card the same way you would do anywhere else in pattern matching in Haskell. Same thing with the request method, get and put. We are going to look up the age from the query string in the put case because it makes the pattern matching that we're going to do later a little bit easier to look at. And if it's on the slide nicer and the number one problem I always have with giving talks is how do you fit everything you want on a slide? If neither of these routes match, then we return a not found. And at the end, we send the response. All right. So our two getter endpoints. Get people response. I'm going to take in a people var and it's going to return an IO response. So it's going to do some IO in order to generate the response body. We have this mutable variable. We just want to know what's in it right now. So we atomically read T var. Atomically is part of STM. You can ignore it for the moment because we're not actually doing anything transactional but that's what it means here. And we get this mapping of all the people. The map from names to ages. Remember our API is supposed to just return the array of names. So we're going to use map.keys to get the keys from this map, turn that into a JSON response and we're done. Get person response is going to take in the people variable again and the name that we're looking up. It's going to get the people out of the variable again. It's going to look up the name. It will return a not found a 404 if the name isn't found and otherwise it will construct a JSON response body. All this stuff about object and the dot equals operator, that all comes from ASON. I'm not giving a talk on ASON today so I'm not going to explain it to you. But you can probably guess what it does. Setting via put. So this is where things get a little weird. Remember that we said that Y needs to be as flexible as possible. It needs to be unopinionated. Well there's three different things that can happen when I pass in a query string parameter called name. Either I don't have the name parameter at all. So it doesn't appear. Another thing that I can have is question mark name with no equal sign. And that doesn't pop up that often but there are actually some web applications out there. I think the AWS web services is an example of this that treats that as different from saying question mark name equals nothing. Those are two different cases. So in Y we actually treat these as differently which is why you end up with having a maybe maybe byte string. If nothing appeared at all, the lookup is gonna fail and then we're gonna get the first nothing case. But if the look, if the name is there but it simply doesn't have an equal sign after it. It doesn't have any kind of a value associated with it.  But we actually need to have a proper name parameter, sorry, a proper age parameter. So if that's the case, if I actually have a byte string I'm going to read it as a decimal I'm gonna try to parse it and assuming that the parse is successful I'm going to modify my variable, my people var by inserting the new name and age and then I'm gonna generate a 201 response. Otherwise I'm gonna say that I wasn't able to parse this as an int and I'm gonna generate a 400 response. We also have the post parameters and this is where we have to parse the actual request body. And this is where we pull in those batteries from y extra. We call parse request body. We use the LBS backend. LBS is the lazy byte string backend and this means that if there were any files submitted as part of the request body read them into memory. This is exceedingly dangerous. This is super dangerous. Someone could submit to you a file that's one terabyte in size and you will crash any reasonably sized machine that you have available trying to read this into memory. If you use something like USODE USODE actually has a lot of different protections built in to stop this from happening. It has a limit on the request body size. I think it's two megabytes by default that you can upgrade. And also for anything that's greater than 50,000 bytes, 50K it will automatically start writing it to a temporary file instead of reading it into memory. Again, if you use Y directly if you have to make sure that you're protecting yourself against all these things which is why I say use a web framework instead. So we're going to go ahead and parse the request body. We're going to get the list of parameters and then we're going to look at the name, UTFD code it, look at the age, parse it as an int and assuming all of that works then we do the exact same atomically modified T-VAR that we had previously in order to update the map. Finally, at the end of all of that we have our main function. We create a new empty mapping stick it into a T-VAR and we serve the application. People app, people var is an application. We then wrap it with the auto head middleware. Auto head automatically generates responses to head requests by using get requests. If you're familiar with head requests that makes sense. If not, then I'll tell you afterwards. And like I told you you can layer as many of these middlewares as you want. So let's do logging also.  If you go to the GitHub link that I gave earlier in the slides you can also look at a test script. The test script demonstrates this thing actually working so you can have some fun and run it on your local machine. All right, so takeaways. It is perfectly doable to write an application directly in Y. But there's a lot of manual plumbing and like I sound like a broken record use a web framework so it handles these things for you. All right, so in summary. Y is a low level interface. It's the basis for a lot of different frameworks and a lot of different applications. There are lots of common utilities. I've only scratched the surface on what's available in the Haskell ecosystem. There's a lot of stuff available to handle most of the common use cases that you're gonna run into with Y. And it's designed in a way that it's easy to plumb these things together. I would actually claim that Haskell makes it really easy to be able to plumb these things together because it makes it so natural to be able to compose different things like that. This is probably not the interface you're going to be using on a daily basis. You're probably gonna be using you-so-its-servants, Scotty, something else instead. But if for whatever reason you have to go down to this level, don't be afraid of it, embrace it, use it, it's fine. And that's it, so thank you everyone. So the question was what are the common use cases where you would need to go down to that level? Okay, the most common use cases, and this is gonna sound silly, the most common use cases where you have to go down to this level are when you're writing a web framework. Outside of that, you probably don't need to do this.  If you wanna write a middleware and you want to be able to work with multiple different frameworks, that's an example. If you have an application written, this is a real thing you can do. Let's say you have a servant application and you want to go ahead and serve that as part of a bigger USOD application. You'd go ahead and you'd take the servant application, convert it into a Y application, and then you would serve it from inside USOD using some of those pieces of functionality. So you can drop down to that interface in those kinds of cases. There are also USOD has overhead. I assume servant has some overhead also because it's doing extra things. If you've got a use case or if you just wanna, you know, put together some benchmarks to prove how fast you actually are, maybe you're gonna wanna do that as well. So for normal day-to-day applications, let's say I go to office and I need to start working on a web app for the first time. I should use the mature frameworks, maybe like ScalaTra or Spring Boot. I would definitely say use a mature framework. You're going to, not only are you going to bypass a lot of paper cuts and possible security bugs, you're gonna skip ahead from all of these bits of plumbing that you're gonna have to figure out. A problem that we have often, and it keeps coming up in the Haskell community, everyone really likes to reinvent wheels. So a lot of people say, no, I can't be bothered with a framework. It's gonna take me like 10 minutes to learn the framework and I gotta get started right now. And then they spend two days, three days, five months, years, generating, what is essentially turns into their own framework that they're doing for this application. I've seen it happen multiple times. Right, one more question. So there was a line written over here which says PD-1 provides zombie prevention. So what kind of zombies are we talking about? Are we talking about that straight Java processes that form during deployment because that's the only experience I have personally of zombies? So are we talking about that? So I am not talking about real life zombies, that's for sure. So the zombies, that's talking, that was the PD-1 thing since we have a little bit of extra time. Zombies are processes in Unix where the parent process is not raping them. Every time a process dies, the parent process is required to call waitpid. That's what you're talking about, right? Yeah, so the problem is that if a parent, if a child gets orphaned, if the parent no longer exists. So parent dies, these are horrible terms but that's the actual terms that everyone uses. So if a child gets orphaned, parent's gone, then the way that Unix works is the init process, the PD-1 process on the system is required to do the reaping. Now what does this have to do with Docker? Docker, inside of a Docker image, if you ever run PS, you'll see that whatever thing you ran first is PD-1 and that's just the way that the C groups under the surface work. Docker does nothing to help you with this.  Well, Bash is not designed to reap zombies. So you start running these things, you start getting these zombie processes, you've got these things piling up, nothing's gonna clear them out. That's a problem for a long running application. Also, PD-1 is special in another way, it responds, I don't remember if it's sig-inter, sig-term, it responds to one of them differently than every other process and therefore, oh right, so control C doesn't work. And that confuses people a lot as well. So we use PD-1 as the base image for a lot of things that have to be complete. I like using it because it provides an entry point in Docker that provides a PD-1 process that sits there and does the reaping and handles control C correct.


what's up team welcome back it is your biggest fan the real castadero i tried to record this video two other times prior to this and the batteries kept dying so hopefully this battery looks like it's good we should make it all the way through this but anyway this is video number two in a three part series on how to price your products and services and my advice but so if you haven't watched the last video go back and watch it but i'll give you a quick recap right here right now get price out of your head price does not matter price does not what you charge does not matter we think this because we're programmed to think this does not matter if we deliver enough value the cost is irrelevant if somebody's if somebody can make ten thousand dollars off of a service that we provide and we want to charge five thousand dollars for it it's a no-brainer give us five grand you'll get ten grand back but we have to be able to build the value the problem is is that nobody knows how to build value there is no school there is no class in school that we that people take on sales like i don't remember seeing the sales 101 and here's the deal the way the education system works and the way it has been working the chance of you being taught this course by someone who has any experience selling or or or is even interested in the concept behind what it takes to sell products and services successfully you probably won't get that instructor you're gonna get somebody they'll they'll they'll be able to tell you stuff from a book but they won't be able to give you in-depth knowledge because they don't they don't think about this stuff introspectively like there is not how do i put it man they do not have the level of interest required to really understand the sales process and why every business needs to have every not even every bit every individual needs to have some sort of sales process we're all selling and we don't even know it but when you when you open your eyes to this fact anything is possible anything is possible right it may it may take you some time it may take you it may take you a month maybe you a year may take you five years right but when you get there you will be there and you will be unstoppable right the you will never have to worry about anything ever again right you have to worry about money we're about about about anything right so anyway so let's get into this number one we do not we do not need to worry about price we need to worry about value how much value can we bring and what is this value worth to the person we're trying to bring it to so in the last video right we talked about right how to how to get the appointment right so we go so we went into a restaurant and we sat down we had a meal and then we say hey can I talk to the manager the manager comes over say hey you know look right this is what I do I notice your website is like this I believe you can be getting a lot more customers is there you know a time and place that we can sit on a talks more if they say no you say okay all right cool no problem I appreciate it and you never eat there again right just don't even you know um would you eat there if you want but I probably wouldn't but or they may they say yeah sure you know come sit down you know you know let's let's hear what you let's hear what you got to say right and then now you've got the meeting and then when you go in to sit down right and this is where a lot of people make a make the mistake I made this mistake I would go into a place and I would be it would be like I got a pitch right now right now you don't want to do that right you hey like is there a time that we can talk like you know where we can devote like you know 10 15 20 minutes to this thing right and I can get an understanding of whether or not I can even help you right or whether or whether or not you even really if you were even considering you know upgrading this thing or changing your website or whatever right if they go yeah sure like we can meet then that tells you that they they have an open mind to this we don't want to trick people into stuff we because the outcome isn't gonna be what we want and we also do not want to put ourselves in a situation where where the the potential client or customer has all the control so anyway so we've got this meeting and we go in and we go to this meeting when we get there we want to ask questions we never there is a place in a time for us to tell them what we do and possibly how we do it but in the beginning we don't need to that they don't need to know any of this stuff we need to know about them we need to know if they qualify for whatever it is we're selling now this is different when we were selling a product like a physical product like hair curr products or hair brushes or something like that and and we'll talk about that and it probably a different video some other time but here we're gonna stick to products and services so like your web developer or a freelancer and you're selling websites or whatever right so anyway you're sitting down with the client right and it's gonna be you know possibly the first question we can ask is you know why did you agree to meet with me here today and they got an answer that right and they can't give you a yes or no answer they can't why did you agree to meet with me here today yes they can't say yes they can't say no they have to tell you why they agreed well I agreed to meet with you here today because my website looks like crap and you can say well why do you believe that why do you say that why and they said well you know because of this because of that because and you're taking notes the whole time just writing this shit down right did they believe their website is like this like this and say well well you haven't fixed it so like is there why have you left it like this and they'll go like I don't have the time I don't have the money I don't have the resources I don't have the whatever right and if they say for instance they say well I don't have the I don't have the money to fix it you say that's understandable you know I found that a lot of businesses believe that they don't I believe I I I have I have there there is there's like a three-phrase process I'm trying to think of right now but anyway right so right on the fly you say all right I found that a lot of businesses believe that that they can't afford it but often we realize that it doesn't cost as much as they think if if it wasn't expensive as you believe do you think you would you would invest in upgrading your website and they may go if they go no then you just say well you know there's really no reason for us to talk anymore right I want to help you but if you're not open to it then you know I don't want to waste your time I your time is very valuable you got a business to run and if I can't help you then then I can't help you your food's great your restaurants great I really love it I want to see you get more business I want to see you grow but um but if you're not open to to growing your business at least in any kind of way at all then um then you know it was nice to meet you and then you go on right you don't waste your time right and some people like yo you go out here you could sell water to to to Eskimo ice to Eskimo and like all this crazy to do man you don't want to be trying to sell stuff to people who aren't interested because if they buy it at some point they're just gonna be a pain in your ass they're always gonna be worried about what you're doing and how you're doing it and this is that in the third they aren't and do is gonna be like having a boss and that's not why you want to start your own business in the first place now if they go well yeah you know like I've been thinking about this really hard and you know I really want to do it but I mean you know and then you can ask well have you talked to anybody in the past what kind of questions that they ask you what kind of questions that you asked them and they say well no I've never talked to anybody I don't know and so well you said well how do you know what's gonna be too expensive and they well I went online and I looked around and I saw what these people were charging right and I guarantee you that the people that they ran into before on the internet and and they saw what they were charging these people did not have being set up correctly I have a whole I have a whole series on this right if you do things the way I say they will work more often than not and I mean like when I say more often we're talking they will work better than all of this other nonsense that people did you that you see out here but anyway but anyway so now you know right okay so they went to the well what place did you check out and it's okay if you don't know I'm off the top of your head we do you can you recall and you know I don't know you know well I looked at this place I'm just playing you just taking notes right you say okay well well let me ask you this right what would they claim in to do for your business like you know hold on hold on what would you like to see happen like what's your idea scenario and then they got to tell you like it's an open-ended question right well you know I think that I should be getting you know at least another five to ten customers a week from you know from my website and I think that's possible I think that's something I could do right and then you're like okay but well what do you get that number from what do you think five to ten right and you're just asking questions so right I think I've covered enough questions for you guys to understand what it is I'm talking about in the next video will come back and we'll go a little more into that that question process but we're gonna get into the part where we're getting yeses and yes and yes and yes and we're working our way towards the clothes and we're working our way towards a price now this is this next video is gonna be the most powerful video in the world because it it should for the people who are really thinking for the people who are serious it's gonna expand your mind it's gonna blow your mind right may blow your head clean off your shoulders okay team all right I'm your biggest fan the real Casadero that is it for this one in the next video in this series we're gonna come back and we're gonna close this thing out and you're gonna have some knowledge you can go out and use and you can do it to grow any kind of business whatsoever


George Bruno with the 21 convention the European edition we are in Warsaw, Poland, and I'm having the conversation with Robbie Kramer welcome Thanks George good to be here. What did you talk about my speech was on executing the perfect first date Not necessarily only the first day, but basically the progression of dates Yes, you would want to go through to you know start a relationship with a woman whether that's a casual thing or something more long-term is serious and Prior to you know giving I give a very detailed step-by-step process You know there's so many great speakers of the 21 convention that talk about the overall theory Amazing ideas and a very thought-provoking conversations and I wanted to give something very detailed and very applicable that people can go out immediately implement and Start you know trying to have some better results in their dating life There's a lot of thought leaders out there, but there's not a lot of action leaders, and that's kind of like where you're coming from Yeah, that's always what I've tried to do with my business and her confidence. I've always tried to take these These concepts that are a little bit tougher to apply and find very step-by-step ways to implement the advice without you know the stuff from back in the day all the pick apart of stuff and You know the very original kind of trainings were very tactical And that could lead people the wrong way So I never want to try to give you know What that one-size-fits-all approach? But I like to give the theory and the scientific approach to break things down so you can Go out and use that So a man's not going to go from zero to sixty in three seconds. There are steps Correctors progression Walk us through some of those steps Yes, the thing I see the guys that really screw up on dates Especially when I first started dating I had a lot of anxiety around where to take the girl what sort of venue to choose You know how many places I should go how long should the date be like there's all these questions and It can be overwhelming. So I always recommend that you know you can if you have a plan and you know what you're doing that gives you a lot of peace of mind and you can just focus on the connection and the important part about the plan is remembering that you can essentially end the date anytime on your terms and Whether that's just 30 minutes you grab a beer and you walk in a park Which is a great start to a first date or you go to a little pub and you spend 30 minutes there That you know you save money Obviously, you know, not a big investment on her part not a big investment on your part You're just having fun getting to know each other and the thing that most guys screw up on dates is they forget that the most important thing Is the physical connection? Yes, so they may end up at a table You know eating dinner across from a girl trying to you know create a connection with a mouthful of food That doesn't work or they go, you know the stereotypical like dinner in a movie. That's the worst date ever. Yeah So I always have a plan in mind to make sure that physical connection moves along because if it doesn't You know, you don't know where you stand. You don't know what's going on the best way to do that is to keep moving and So my dates typically like I said they start somewhere like a cafe Grab a quick drink grab a coffee and then I like to walk and talk because walking and talking. It's uh, it's easy It's uh, you know, you're not stuck at a table, you know in a boring setting. It's very, you know The walking also does release Some anxiety physical anxiety because everyone always has a little bit of nervousness when they first meet Yeah, and it kind of melts some of that anxiety away. I think yeah, exactly and then from there Uh Basically, I'll I'll move to a more Intimate venue so more like a hookah bar That's a you know, easy fun place to go or just any sort of lounge sit on a couch Get to know her a little bit better. How close should a man sit? Well, if you're sitting on a couch You'll be right next to her.  She's gonna go like that. Yes. Yes, right? Yes, and uh as As the connection and you know gets deeper and deeper. She's probably going to you know stare in your eyes you'll be giving you all the signals that you want to kiss her and typically You know on most of my dates that can happen within 30 minutes to an hour and I'll move in go for the kiss. Yeah, if she likes it great. Yeah, not I'll try again 15 minutes later Yes, and you know if that doesn't work out then I usually just end the date Yeah, because she doesn't like me, you know, and I'm not I don't want to give up the impression that you know You need to do that within a certain amount of time frame But you should never be scared to do it And I think that's a big question for a lot of guys at least from my first start is how do you go for that kiss? Or how do you you know, how do you make that connection happen? and It's more about the proximity it should be easy to happen So it's really about where you're sitting, you know, like like we said sitting next to us. Yeah, and And then from there Once you kind of get the kiss out of the way That's that Imaginary line that's cross like now. We're definitely attracted to each other.  Yeah sense. Yeah, exactly It helps the situation So taking a gal out for dinner first and having two hours of food in your mouth Probably is not a a good thing to do, right? Definitely not. Okay And I like the idea of moving because that does release a little bit of anxiety I like the idea of doing couples things I like the idea of having physical proximity and making it easy if a move is going to be made it can be done easily, right?  Yeah, you know backfire Should a man ever ask a woman can I kiss you?  Yeah, yeah So the best way to make that first move is to make this go for it. Exactly There's a little a little kind of test that you can do I heard this way back in the day. I don't I don't remember from who but if you attempt to whisper in her ear and she moves closer than Likely because she's not really sure what you're going if you move in right? You know, they do that after yeah, and she Follows suit. That's a that's a good little tell Do you how how soon on a date?  You don't do the two-hour dinner commitment thing exactly because that can be the longest two hours, right? No chemistry Yeah, exactly and you're never you know, you're only you're not offering any sort of lung You know date you're not it's like let's grab a drink And she doesn't know that you have a plan to keep moving and to go from the park or do a cafe to a lounge And then from there to like an arcade or somewhere where you can act like a couple and be kind of childish and be like kids together Which really makes you feel like a couple and cements that connection So you're just you know, you're continuing to move you're continuing to get deep in that physical intimacy and At the end of the at the end of the time she'll be like wow, you know wasn't expecting this It's it's kind of like a cool little adventure you can go on How long does it take for a woman to size a man up and how long does it take for a man to size a woman up? You mean like to you know when you first meet and you kind of you know Well, you know men are more visual of course, so we'll see a woman and we'll immediately know like okay I'd like to you know, yeah, we've heard yes, you know Then you kind of find out later, you know as you spend more time with her if she's the type of person you'd You know want to do more than just sleep with her or maybe you know, she would turn you off in a way Yes, you know something about her personality. Okay, never mind And for women, I feel you know, they they have a different You know at first obviously they're concerned about safety, right? So guys will a Lot of the time I see the mistake happen where guys will take a girl out on the first date You know at the end of the date one in the kiss and then they'll invite them back to their house for like the next date and women You know, they won't feel comfortable going back to a guy's house that early a lot of the time Yes, even if they invite them over for dinner or yes, and and so they'll either not respond to the message or they just won't go, you know the flake and The guy will think oh, well, I guess she didn't like me. It's like no She just wasn't comfortable, you know moving that quickly some women doesn't matter, right? Totally fine, and you can you know, yeah kind of run through that but To answer your question in terms of sizing up You know it takes in my experience like within the first 20 or 30 minutes They'll kind of get the feeling like okay. He's cool. He's normal.  Yes And it really gives her the impression like wow this guy's interested in me.  Yeah, I see that that's probably the biggest mistake I see guys make is they they try to oversell themselves where in essence, you don't want to be selling at all You want to be just finding out who she is asking your questions deciding if she's someone you'd like to have in your life and The physical connection will kind of take care of itself as if you give it an opportunity You know if you're next to her if you're walking next to walking is the best because it's just it's dynamic Across the street, you know, you can do the arm out you can small you know, put your hand on the smaller back to go through a you know a door or something like that and You know, this is all stuff that that happens should happen naturally Yes, but for a lot of us like for me the the idea of going on a date in my early 20s I'd like never been on a date until maybe 25 or 26 Yeah, I just didn't know what the hell to do. Yeah, and especially now with online dating, you know You meet a girl on Tinder and then you're like, okay, do I what do I do? Well, I don't know Yeah, yeah, it's looking me like I said overwhelming is a first date different All right, I'm gonna describe two scenarios. You meet one gal out and about Club bar store coffee shop And you that's woman a woman be you discover on Tinder Which is what a lot of people do that the swiping apps, right? Our first dates the same with both Women good question. Yeah, I wouldn't change anything really, you know, the first 20 30 minutes you meet them somewhere easy Somewhere easy to find park coffee shop and You take them through that same progression the only time I would change the scenario around is if I'm Looking to give off the impression that I definitely don't want a girlfriend and If I'm the type of guy who has a big social circle and I meet a girl and I want to you know Deepen the connection with her and see where it goes Instead of taking her on a one-on-one date if she feels comfortable enough to meet me out with my friends I'll tell her to come out and bring a friend and I'll just integrate her into my so social circle Yes, and that way there's no pressure. We're not even on a date, you know We're just all hanging out. Yes, and we're getting to know each other She's basically getting to know everything she needs by meeting my friends because that will tell you This is this is the type of guy hangs out with these types of people. This is what he does and My social circle now.  It's a you know, it's a very like I Don't know how to describe it. It's kind of like a It's strange it's like I'm back in college sort of that sort of vibe, but people are older It's very normal for if I invited a girl out She would meet me and my friends you might hook up with my friend She might hook up with me two weeks later And this is what you see a lot in in our dating culture.  They go to Mekinos. They go to Ibiza They go to fashion week in LA New York Milan Paris and it's basically this group of people that travels around in parties. It's Burning Man. It's a can film festival and Girls will find themselves on the circuit by Instagram guys will hit them up Message them a few times say hey look at my yacht. Look at this. Look at that come to this party and all of a sudden They're getting flown around essentially living lifestyle of partying and and modeling even though they're not really working it can be it can be kind of a toxic environment.  That's what they're doing, you know, they're and You can You can integrate yourself into that environment, but you have to be careful because You know it can drain your your bank account pretty quickly.  I was I was basically doing that for a good year and Had an amazing time met a ton of amazing people some really amazing guys Fun relationships, but it can be as I mentioned it can be a little bit draining So that exists and guys don't realize that exists and they think like oh, you know this beautiful girl Whatever, you know, I'll impress her with the some trip to here or there and it's like no She's already done that because any times it's a it's kind of eye-opening. It's kind of like the red pill of advanced partying I'd like to yeah. Yeah, yeah I've had women say to me men don't date anymore. They just want to hang out comment on that Yeah, and women do too. They don't want to date either I think you hear that more from a Woman who might want to settle down who's looking to you know transition out of the party phase and start a family and If you do want to keep things casual, I always tell guys, you know be very careful To date women who are you know kind of at that age where they're looking for something more serious because You know if you go out with them and have sex and things will progress along She's gonna potentially you know be like all right. What are we doing here? Right, you know, we're hanging out hooking up But where's this going and if you want to avoid those conversations and have the bachelor sort of lifestyle date young women You know date women under 25 because you did that really won't come up. Yeah, you know partying Yeah, and if you're looking for something more serious, you know, don't expect a 22 year old to right to get off The circuit cuz yeah, she's gonna say yes to that next invitation to meek and us for sure. Is there a typical age where women Want off of the circuit Yeah, I tend to see that right around 27 28 You know when they start to feel the biological clock taking When is it appropriate to take yourself off of a dating site if you're seeing somebody Because you know if you meet somebody on a site, they're going back Regularly to see if you're still on there still looking right do both people have that talk and say, okay Let's both take ourselves off of the site It's a conversation that has to happen yeah, it's the elephant in the room at one point or another yeah, the The the trick there is if you have any anxiety about taking yourself off then you probably have anxiety about creating something more serious and If that's happening, it's a conversation that you should be having earlier or not even a conversation You should be having but a way that you're showing rather than telling right if if you don't want a relationship And you don't want to have or if you don't want a monogamous relationship And you don't want to have the conversation about you know I saw that you were active on you know your seeking arrangements site or I saw your active on tinder and you don't want that drama then You can It's a little bit tough to describe But you want to give off the vibe that You're just having fun.  You're not seeing her more than once a week Because if you're seeing a girl more than once a week, it's pretty obvious that she's gonna Expect you to be her boyfriend. You know I heard back in the day a guy say if you're seeing a girl one more than once a week You're in love and guys will They'll meet a girl. They'll have great sex. They'll want to keep having sex, but they'll want to keep it casual They might not have other partners So they'll make the mistake of seeing her a couple times a week because you know if they're horny and Then a month later the girls like where's this going? He's like, oh, I don't know. I'm kind of focused on work right now I just want to keep things casual and she's like, what do you mean? Yeah, right so they give off that signal because they don't have other women And they're not actively going out and pursuing that Basically out of laziness So the important thing is to not be lazy if you want to be single and if you want to date multiple women then you have to have the What's what basically you have to make sure that you're not seeing them too often because you're just gonna give off that vibe Yeah Where can people find out more about what you do and what your philosophy is? Yeah So if you go to inner confidence calm you can find everything I have I've got a bunch of different E-books on the site that are free. I have a podcast called the leverage podcast, which I release episodes a couple times per week That's what I recommend that everyone should go check out because there's great content great Interviews on there. I think we're on our a hundred and tenth episode At this time so check out the leverage podcast go to inner confidence calm and you can contact me straight from there Robbie Kramer from inner confidence calm. Thank you, sir. Thanks George


The first in his family to earn a college degree, Fred Clipsch credits the College of Technology, now the Purdue Polytechnic Institute, and his ROTC experience is at Purdue, for much of his success as an entrepreneur and as a champion for education reform. And my name is Fred Clipsch. I graduated from Purdue in 1964. I retired seven years ago as chairman and CEO and majority owner of Clipsch Audio Technologies. My father worked at International Harvester as a tool grinder, did not graduate from high school and was now insisting that I graduate from high school, but then I go to college. So my dad paid for one semester, the first semester of school, but then I had to pay for the remaining three and a half years and I did that by working full-time. So as a result, I wasn't really involved in many university activities except the ROTC program. And I was involved in the ROTC program at high school and then ultimately with Purdue University. And interestingly, when I graduated from Purdue, I graduated and I was also commissioned in the Air Force as a second lieutenant. There's no question that having a college degree, especially back in 1964, was important. So coming to Purdue and having Purdue help me become an effective student was a game changer, a life changer. I spent the last 20 years being involved in the education reform movement in Indiana specifically, but actually across the country. And my goal is to help public education do a better job of providing a quality education to every child in regards to where they live or what their parental income is. So education has been a theme of mine all the way from the very beginning with Purdue and that giant leap forward now to doing that on the philanthropy side of the house. Thanks to Purdue, we have literally shared my time at Purdue, now my children and grandchildren, and their educations at Purdue. But all of our activities were built around Purdue athletics, Purdue education. Purdue has been a big part of our family from the very, very beginning. A major footprint in our life is Purdue University, and the education not only I received, but all my children and the rest of my family. And it all started at Purdue for me. That was Fred Clipsch. Look for more stories at Purdue.edu slash footprints.