Hey everybody, this is Brian. Welcome to the, what are we on here? 135th, this is a continuation. This is the high-performance TCP server design part 4. I'm showing you that there's part 3 in case you're just now stumbling upon this video. You know that there are three preceding videos to this. And if you're just starting in Qt, I've done 130, well now 135 Qt tutorials. Before we begin, 41 years ago, something awesome happened. I was born. Yesterday's my birthday. I wanted to say thank you. I've had a huge, huge outpouring of people on my Facebook page wishing me happy birthday. And I just wanted to take a moment and say thank you very much. It was very humbling to hear from people all over the world, all different cultures and religions and beliefs and ways of life. And it's just, it's magical to me how something like programming really connects people. Other than that, I haven't posted in a few days, so quick update. I've been playing a lot of Dota 2, probably more than is actually healthy for me. And I started playing Counter-Strike Go, global offensive. Pretty fun games. You should try them. Anyways, let's just dive into this. I've wasted enough of your time. Today, we are going to take our high-performance TCP server and we are going to inherit the TCP classes that we made. Remember, we made the connections, connection and server. We're going to inherit those and make a very basic HTTP server. When I say very basic, I mean, it will send the headers, but it won't send the files. That's going to be in the next tutorial if we finish this one up. I may have to split it and do a few more because I've got quite a bit of programming to do here. So let's just go into File System and then Show Containing Folder. I'm never very good at this. There we go. All right, so we want to make a new folder. We're just going to call HTTP, a new document, HTTP PRI. There we go. Go back into Projects. All right, so we're going to actually change this a little bit. Now, when you do this, the little TCP folder should magically disappear. Oh, no, what have we done? But now we've got this beautiful little project include file. So the first thing we're going to do here is say cute. Oopsie, plus equal network. And we really don't need to do that. I just do it out of habit. Not now, kitty. Go away. As soon as I start typing this darn cat, I love him to death, but he just wants to be all over me and will do the pen path. Where is the dollar sign? I actually celebrated my birthday with my family yesterday because we all had the day off. So that's why I'm doing the tutorial today because everybody's gone doing their things. And I'm already all partied out. I've had, oh my gosh, my girlfriend made these amazing steaks. And if I eat one more steak, I'm just going to explode. I love steak. I'm like a steak junkie. All right, so what we've done here is we've gotten our little HTTP project include. We've added the network. We've set the include path to the current directory, the dependency path to the current directory. And we're including yet another PRI. And this is the TCP project include that we've been working on all these tutorials. So that shows you how you can kind of do that. So what we're really doing is we're segmenting off rather than keep adding and adding to this TCP folder. We can now segment it off and say, all right, we want to use this, but we want everything we're working on today to be in this little HTTP bucket. If that makes sense, we're going to make a few classes here. Add new class and let me look at my little notes here. Notes are always a good thing. Don't you think we're going to make a HTTP server? Make sure the path is correct. Sometimes some of the older versions of Qt Creator will play around with your path. I don't like it when people play around with my path. It makes me very upset. And we're going to make a HTTP connection. Now, following this design pattern here, let's see, just collapse that. You can see we have a server, connections and connection. But in here, we only have a server and connection. All we're going to do is inherit these two classes. We don't really care about the connections. We're going to let that do its magic under the hood. But we want to inherit and then override some of these functions here. So I'm going to try to get this all done in one video. But let me close some of these files. We do have a fair amount of programming in this little video. So I may have to chunk this up into two or maybe even three videos. So let's just start going away. Let's see, Qtabug, not now, Kitty, Daddy's busy, Daddy's very busy. Include, we're going to include tcpserver.h because we're going to inherit it. And we're going to include the HTTP connection. And we're going to inherit the TCP server, not to be confused with Qtcpserver. We're inheriting this class. And this class inherits the Qtcpserver. All right. So we've done that. Now we need to go into our sources and remember to change that as well. Otherwise, you're going to have build errors. Oh, my gosh, I'm not kidding. When I say if I eat one more bite of food, I'm just going to explode. I really just like my stomach's actually hurting. I'm like, now we're we're making a root and set root because a web server has what's called a root path or where it will begin looking for files. Because really, all it is is it's a generic file server. And it uses the HTTP protocol to transfer files back and forth, which is actually a very simple protocol. And we're going to add a rate in here. Rate is going to be the speed at which we transfer the files. Not going to do a whole lot with that. This tutorial that's coming in the next or maybe a couple now, depending on how fast I can do this one, what we're going to be doing in the future, just while I'm typing, we're going to be sending files at a specific speed. Because if you just, you know, open the socket and start sending the file, you're going to send as fast as it will go, which is going to consume that entire bandwidth. And it'll essentially, you know, deadlock other clients. So we want to really throttle that down. I mean, like when you've noticed, I think I've talked about this. I can't talk and type at the same time for some reason.  Well, that's actually the the actual web server. Well, why did I hit caps lock there? Cue it pointer. It's the web server throttling the connection. Sorry, I was trying to finish my train of thought here. I'm like trying to type, talk and look at my notes all the same time. And it's not going very well. OK, so we're going to flesh out this class a little bit here. We're going to have to actually, you know, do a little bit of this and jump into the connection and then come back. So let's just go. Whoopsie. Darn you. That's somewhat embarrassing. There we go. Someone sent me the keyboard command of that. And darn it, I keep forgetting. And now it's doing again. Here we go. I keep forgetting what it is, and it's actually kind of embarrassing that I keep forgetting it because people keep reminding me. But I guess that's what happens when you're older. You know, you just forget things all the time. Unless you ask my girlfriend, then I just intentionally forget things like taking out the trash or whatever she was just talking about. I wasn't really paying attention to her. I'm just kidding. OK, so I actually right off the bat, I do kind of see. Something we should do here. We're going to include Q core application just because I said so. All right, so we've got our little constructor here. We're going to say M route and we're going to set our value here. Yeah, Q core application, application, dirt path. So what we're really doing is we're saying the default route is going to be the same path as the application. It's big security risk. You really don't want to do that in production code, but I just want a value in there in case I forget to do it in a future tutorial, it'll be something. And we're going to set the default rate to 15 K. I think that's 15 K. Me 1024 by 15. Yeah, that's 15, 360. That's 15 K. So 15 kilobytes per second is what we're going to be sending files at. And then this is pretty easy, maybe. There we go. We're going to set the path here. And then we're going to do a little, you know, just defensive programming. Whoops, I want it or not. And basically what we're going to do is just remove the trailing backslash. And there's probably a more elegant way of doing this. I'm always amazed at some of the some of the messages I get of, dude, this one video, this one time, that one thing that you made.  It was a lot easier if you just do blah. And I'm like, oh, why didn't I think about that?  But at the same time, I really love the collaboration. So if you have no idea what I'm typing here, you should probably go back to introductory C++, but I'll explain it just in case. We're really just saying if the variable emroute, which is this path, ends in a slash or, you know, a other slash, we got to do double slashes because that's what's called an escape character. Then we're going to say root actually equals the path minus the last character. And then we're just going to say Q to bug. Like I said, I'm sure there's a much, much easier way of doing that. But while I'm old school, I just like doing things the hard way. Whoops, root set to I like throwing Q to bugs in there just because I can see what's going on under the hood. It makes me happy to see things going on under the hood. All right, so I don't want that.  So, you know, sorry, bear with me here. But you got to do that once in a while.  I love staying at home and playing video games and just, you know, Netflix and vegging out and doing whatever. My girlfriend, on the other hand, likes to travel the world.  And I do want to go back, but I was really glad to get home and have my computer. All right, so so far, this class is pretty skimpy here. We just have, you know, a route. We have a rate and now the meat of the of the issue here, the incoming connection. Now I want to jump into this little guy here because I think we've talked about this before, the queue socket descriptor, or I'm sorry, the incoming connection, the queue and pointer, the descriptor. This is a little bit different depending on what version of Qt you're using. You notice I'm using Qt pointer. I've seen it as Q at 64, Q handle, Q pointer, and even as you end, so depending on what platform and what version of Qt you're using, that may be different. So I'm just going to put that in there. So if you download the code and you run it and none of the connections are actually connecting, it's like the client thinks that it's connected, but you don't see it happen in the program nine times out of 10. That's the problem. You got the wrong data type. They're all supposed to be essentially the same thing, but they're different. They're very, very different under the hood and Qt understands that they're different and that's why you have problems with that. And if you try to do like an incoming connection, Q into 64, an incoming connection, Q handle, you get all sorts of funky, weird compile errors. I haven't quite figured it out, but it really kind of messes with your head. So anyways, I just wanted you to be aware of that. It's a very big gotcha that I see a lot of people having problems with. I get probably, I want to say about 30 emails a month just at one question of, Hey, I'm working with a TCP server. I can't get an incoming connection. What am I doing wrong? That was embarrassing. Can't spell incoming. I'm going to say incoming HTTP connection because, you know, why not? I hear like this weird humming. I don't know what the deal is, but I hear it. My girlfriend got me a new wireless headset for my birthday, but it hasn't gotten here yet. So really psyched up about that. This headset, I love it. It's a Logitech G930, but once in a while, like, especially if somebody kicks up the microwave or something, it'll drop the connection and it drives me crazy because I don't know that it drops the connection. So I'll either be making a video or I'll be gaming and just suddenly I hear it go beep, beep, meaning it just reconnected. So then I have to figure out what did I say versus, you know, what they heard. Anyways, it's just annoying. So what we're doing in the incoming connection here is we're just literally making a new HTTP connection, which is an inherited version of the TCP connection or it will be as soon as we're done with it here. And then we're going to accept it very much like we did in the TCP server. Well, actually exactly like we did in the TCP server. We're going to say descriptor connection, boom. And to do, set rate and root. Wow, I cannot type. I actually had so much steak. I know some of your vegetarians and I'm trying not to gross you out, but I actually had so much steak. I felt like I ate a bowling ball. I'm not even joking. I mean, like I literally felt like I just ate an entire bowling ball and I love red meat. I don't know why I just do. All right, so we've got our server. We got a little bit of work we're gonna have to come back to, but that's kind of fleshed out. The connection on the other hand is gonna be a bit of work here. And there may be a few sections where I just blatantly copy and paste just to save time, but I will try not to do that because I know you guys really are masochistic and you like watching me type. So we're gonna include Q file because we are essentially making a file server. My, one of the presents that I got for my birthday. It's hilarious. I gotta find a picture of this. It was, it's a cat bed, but it's shaped like a hamburger. It just cracked me up because it looks like a cat burger. My cat won't go anywhere near it though. He's too smart for that. Q core application. I'm not sure if we need Q core application in here, but we'll do it anyways. Include, we're gonna override TCP connection or override inherit and then to do make a rate controller. Once again, when we transfer the file, we have to throttle that bandwidth. Otherwise we're gonna consume all of it and we're gonna deadlock everybody else. So let's just flesh this out super quick. Kind of curious what video games you guys are all about. They're playing, I've been playing defensive the ancients or Dota. And I'm very not good at it. I'm the opposite of good, which is weird because I'm usually pretty good at video games. I'm a very big computer guy and when I play video games, because as I'm programming, I can actually think under the hood what is this game doing? And I can figure out kind of, not cheating or hacking, but I can figure out, okay, well, it's got a random loot table that pretty much once a second or once a minute or once every 10 minutes response. If I come back at nine minutes, it'll be better loot, that sort of stuff. But this game is different. It's very much a team game. And sometimes your team is not good.  Let's put it that way. I had a very crappy team the other night. I wanted to like reach the monitor, just punch, throw everybody, you know. Yes, I said punch, throw, throw, punch. More like it. Hint and rate. I gotta quit hitting caps lock here. All right, so what we're doing is we're just making our little internal variables for this class. We're gonna have a file because we're sending a file. We're gonna have the route path and the rate, which we're gonna set and you guessed it up here. And then we're going to, and let me add this in here while I think about it. Really shouldn't need this, but I like to add it just in case I've seen some versions of Qt that kind of freak out a little bit if you don't do it. We're gonna call Qmap, Qstring. And we want Qstring. And what we're doing is we're just making a variable for the request header. HTTP protocol. Basically sends some information for a request and then you have to send some information and then the file and the information is just metadata that describes what you're sending. And we're gonna get a little bit into the, well, actually we're gonna get a lot into the protocol today, but you'll see. It'll become much clearer or it'll become much more confusing. I haven't decided which yet, but we'll get there. And then mimes because every file on your computer has what's called a MIME type. Am I pronouncing that right? M-I-M-E MIME. So like a .txt is a text file. That's its MIME type. A JPG is a JPEG file. That's its MIME type. It's just a description that says what type of data the file you expect is going to hold and what application would it be associated with. So that was really what we would do. And then we're gonna say to do make a rate controller. If you haven't figured that out by now, that's actually a pretty important part of this program. It's actually kind of the bread and butter of how this thing works, but we're not gonna have time to get to it today. We're just laying the foundation for that. Say void, process get. If you're wondering what get is, well, it's all mine. Get is a part of the HTTP protocol. You can do things like get input. Get is requesting a file. So we're gonna handle get requests. Put is when you wanna put a file. So if you wanna upload a file to the server, which is probably, I think it's probably outside of the scope of this tutorial, but we might add it, I'm not sure. Might not add it until many, many decades into the future. So we're gonna handle the request, void send file. That's pretty self-explanatory of what it's gonna do. And Q string, get MIME type. And we're gonna just, we're gonna call that path. All right, so very super short version of what we got going on here. Got our getters and setters. We've got some, well they're not true getters and setters. I know I'm gonna get hate mail for saying that, but we've got our Q maps. We're gonna have our request, our response, our MIME types. We're going to make a rate controller in the future. We're gonna process the get, handle the request, send a file, get to MIME type. Now we need to do public slots here. And I am actually going to just copy and paste because this is gonna take forever if I don't. Look at all that typing I just saved. And we'll go over them super quick. We've seen them before. Connected, disconnected, ready read. Bytes written if you probably guessed we're overwriting these. The space or the line here is to show that we're not overwriting these. These are actually unique to this class. And of course the error. So let's just start plugging away at this bad boy. Oops, I actually wanna go up here first.  So I've been talking with a couple of you by a Facebook messenger. It's one of the easier ways to get a hold of me. One in particular, she'll know who she is. Excuse me. It's stuffy in here for some reason. I've been kind of getting into embedded hardware and stuff like that. I made my own saltwater battery. And she kind of turned me onto these. It's called a field programmable. Now that I'm on the spot, I've totally lost the name of it. Basically it's like the Arduino but instead of making, how can I describe this thing? It's a field programmable device.  But with a normal microprocessor board like an Arduino, somebody's already made the circuit. And this is, I think it's a field programmable gateway, something, something. Maybe I'll look it up at the end of this tutorial. Anyways, you can design circuits in this thing using a special programming language which is very much like Java and C++. And it's really friggin' cool because you'll have like 84 pinouts and you can designate which one does which so you're not stuck with okay, I've only got three serial lines. You can say, no, I've got 80 serial lines because 80 serial lines, I need them all. Why you would need 80 serial lines? I'm not quite sure. But you know, it's just really neat that you can actually design this. And I found that a lot of companies will actually, they'll use these things for prototyping purposes. No matching function call for accept. Well, what have we done here? What do you mean? What have we done here? Oh, I know what we haven't done. We haven't inherited this thing yet. Inheritance 101, ladies and gentlemen, you must actually inherit. All right, let's do this. This should actually work much better now that we try to do this.  We've got a lot of unused parameters, which is really not a big deal. I've seen some people that are like, oh, you've got warnings in your code. Unused variable is really not a warning.  Okay, magic and copy and paste time. I'm gonna save us about 20 minutes of me babbling here. Boom, that just happened. All right, so what just happened, you ask? Well, the map, the qmap, the mime variable. Really all I've done is I've added the file extensions and then the mime type. So example, txt is text plane. Why do I have two txts in there? We'll fix that problem.  Now, the reason why I'm doing this is because Qt is a cross-platform language, meaning you may be downloading this on Linux, you may be downloading this on Mac, you may be downloading this on Windows, and every operating system handles this slightly differently. For example, Windows is in the registry, Linux, it's in a file somewhere, Mac, I'm dead certain it's in a file somewhere in Mac, but the problem is what file, what operating system? So if somebody else comes in, downloads this for Solaris or some embedded system, it may not have all that stuff. So we're just adding what I've called the default MIME types that you're probably going to encounter on a webpage and just throwing them in here real quick. Anything beyond that, you're gonna really either want to send an octet stream, which we'll get to later, or you'll want to actually look up in the registry or whatever file that's specific to your OS. But just so this thing works when you guys go out to go to use it, we're gonna just throw that in there. All right, so maybe it didn't save that much time because I had to stop and explain it all, and I could have probably explained it while I was typing it, but it's my birthday, so we're gonna just cut me some slack here. All right, so somebody asked from the last set of tutorials, why are you doing destroyed in the deconstructor? Why do you want to queue debug there? Because we're making objects dynamically, and I want to make sure that memory is cleaning up as we work. I don't want objects sitting out in memory. Anybody out there watch IT Crowd? If not, you gotta look it up. It's called IT Crowd. It is just hysterical. I thought it was on Netflix for a while, but it was a British show, and it's about a group of people, well, in IT, and it's just, words cannot describe it. I mean, you've got to go watch this. It is so funny. Unfortunately, it was only five seasons long, and then it got discontinued, but oh my God, what a five seasons that was. Anyway, so once in a while, you're here, let me make a reference to it where they're like, have you tried turning it off and on again? Because that was like their default answer to everything. It's a lot of funnier if you just go watch it, otherwise it just sounds like I'm a lunatic. All right, so pretty much the same thing as the other class. We're just gonna set the rate and the path. Somebody asked a question, or will ask the question, I should say, of why don't you just give it a pointer to the other class? Because I don't want to. I want loose coupling between classes. It's actually a design pattern is loose coupling between classes. You want the classes to be as independent as possible because you don't want them to rely on things that could potentially be broken later on in life. So for example, if I'm working on this class and Sally's working on another class, whoever Sally may be, damn you, Sally. Anyways, and she changes something that my code depends on. Now I've got to go through and figure it out and fix it. It's not fun, I've been there. All right, so process get. Process get. That is a whole lot of code that I've got to type out. Let's start doing it, I guess. The whole point of process get is to process the incoming connection. Whoopsie. All right, so we're gonna do a QBite array, EOH, which is short for end of header, EOH.append. And the end of the HTTP header is two new lines or carriage return line feed, carriage return line feed. That's how we know the difference between the header and the payload, as it's called. Typically they won't send a payload on a get, but they might if they have like a cookie or something, because remember, websites have cookies. Oh yeah, she could very easily build that into this program, but we're not there yet. We're still trying to process get, so. And request.value. Now remember, emrequest is, well, you guessed it, it's a Qmap. So we're gonna see if we've got a value called SVR underscore header, and if we have not, then we're just gonna have a blank variable. Otherwise, we're gonna get that. Because what might happen is you may have a header that's longer than your packet size. This day and age, I seriously doubt that, but it may happen. So you wanna keep appending that header until you get this end of header marker. So header, append, data. And all we're doing is just putting the variable back in the map. Now, this is where the magic happens. If header.contains, EOF, that marker we're looking for, then parse the header. Nice, right? Okay, cool. So, if we've got our end of header, then we're just gonna start parsing this bad boy. Whoopsie, cannot spell. Header, split. And we're gonna split this based off return line feed. So basically we're gonna read the lines out of this thing. Whoops, I cannot type, read my notes and thank all at the same time. All right. Sorry about that. I just wanna make sure I was in the right spot here. Reference to string list in here. Is that what's going on? I think that's what's going on. Should just be count. Okay, what is wrong with you? Maybe I misspelled string list. Yeah, I did, that's the problem. Okay. All right, let me get a quick drink of water here and you get to listen to it in all its glory. My throat gets really dry, which I don't know why because it's like 90 degrees and extremely humid for some reason. So we're just gonna split it by lines and then we're gonna read each line. We're gonna say Q string line at i, we're gonna get the current line. First line has three values, which is kind of a pain for us and they're separated by spaces. So it's HTTP path. Or actually is it, yeah, it's path version. I think that's right. It might be version path, but I'm pretty sure it's HTTP path in the version. All right, so Q string list, items. We're gonna split based off space. If we've got a count greater than equal one, then we're going to insert the method. Actually, that's what it is, sorry. And we're going to say, let's call this TTV method. We're going to add that in there. And we wanna actually do trimmed just because we wanna make sure there isn't any trailing space in there. They really shouldn't be because we're splitting it. I just wanna make sure that through the magic of copy and pasting speed, this process up a little bit here. So if we have more than two or two or more, gosh, I'm horrible at this, aren't I? All right, so this is a little bit different here. This is where we get the actual path. So we have to say, this is the actual relative file path. So really, it's not gonna be the full path of the file and this is where it gets a little bit tricky and this is where a lot of attacks on web servers actually happen. For example, it's going to send you a path of like, let's call it slash some file or actually some der slash some file.txt, right?   That's where your root path comes from. So they may actually send you a dot dot or a slash dot dot. So they try to go up in directories.  Cause then they can download, you know, your password files and things like that. Q URL from percent, encoding to Latin one. And all we're really gonna do is we're gonna load this because it's gonna come encoded. Like if there's a space here, there won't be a space. It'll be like, what is it? Percent 20a or something like that. I don't remember. It's just gonna be some weird encoding. So we're just gonna take that encoding out of there, right? And then we're gonna insert the actual path here. All right, now we're going to get our third item here. And I think we can just do this. We can just say, we don't want that. We want to, and we're gonna get the second item here. Remember it's a zero base. So you gotta go zero, one, two. In case you're wondering why it looks like that. All right, so let me double check here. Yeah, I did miss something. Let's just cut this out, cut, cut, cut. Want to make sure we're on the first line. That's what I was forgetting. That's why it looked kind of funny to me. There we go. That looks better. So if I equals zero, meaning we're the first iteration of this loop, then we're going to process that first line. And there's a lot going on there because it's method path version. Method will be get or put. Path will be the file path and then whatever HTTP version they're using for their protocol here. All right, all of the lines are key value pairs. And these are much easier. Well, I say much till we dive into this thing. So, oopsie, I knew I'd screw something up. Sorry about that. Want to make that available to that scope. We want to make sure it actually contains the little marker there. The key value pairs will be separated by that.  All right, so we just want a warning and we're going to get some of those because, well, the protocol ends with two hard line returns. So we're probably going to get a few warnings here. But we just want to continue. And we could say if line is greater than, or if line is actually not empty. And let's actually do that. Let's actually do this right here. Ah, get up there. Make sure the line's not empty. That way we know something is kind of scurry where that requests some browsers are a little different, right? Just going to get the index of that. And then we're going to do some basic string parsing. This is like C++ 101. We did this back in Hello World and what's a variable kind of thing. I think my girlfriend's going to get home any minute now. We may have to do another tutorial here and pick up where we left off. All right, so we're just going to add those key value pairs in there. And in case you're wondering, it's going to be like, you can look it up online what the HTTP protocol is, but it's going to be like browser version, what languages they accept, what encoding they accept.  So it's kind of interesting to see that. So if we can, let's see, we've done this, we've done that, now we got to go. And we could have put this all in one giant function, but I really don't like doing that because it makes it easier to break them apart.  Process get, we're just processing the header. And if we don't have the end of header marker, we just keep dumping into that variable right here until we have it. Once we have it, then we, you know, parse everything out into that Qmap. All right, so handle the request. Let's give this a good build. We did a lot of coding. I want to make sure there's no real little gotchas in there. Nope, nothing so far. All right, good. So we're going to handle the request. We're going to get the path that was in that first line, remember. There we go. Now, you could very easily use this as a parameter to this. You could say, you know, send it over right here to here. But I actually like keeping everything in that Qmap. So if later I want to go and I want to evaluate the request, I've got it in a nice little object called a Qmap and I can just reiterate over the key value pairs and see exactly what's going on under the hood and what blew up. I don't know if you can hear that bird in the background but it's driving me crazy. It's just chirp, chirp, chirp, chirp, chirp. We're going to strip out any directory jumps.  It's my girlfriend's. One of these days it's just going to have a heart attack and die.  Whoops, we won't. So we're just going to take our root path and our file. So for example, our root would be like something mydir something slash something. And we're going to add that to slash file.jpg or whatever. Actually, let's just do test.jpg. That's basically what we're doing there. After we've removed the directory jumpings. Now the root file or the index file is called index.html. Some other servers call it index.html or index.php or asp or whatever you're doing. Basically, if it's a directory they're asking for, you check for this file and that's the file you'll send them. So missed a few things, didn't I hear? Queue file, endo, info, fi, file. Actually, let's call it actual file. That'll probably work a little bit better, right? Queue file, add array, response. And we're going to actually generate the response here. And this is where we're going to build the, you know, the 200 okay or the 404 not found. I know you've probably seen 404 not found. That means the file you're looking for was well not found. 200 okay, you've probably never seen because 200 okay means we found your file here it is. So you see the file, but you don't actually see the response. So anyways, it'll be pretty obvious what's going on here. So if it's a directory then do this. Otherwise, well actually I don't want to do that. So yeah, the thing I was babbling about is about the field programmable device. It's actually really wicked cool.  You would think that I would remember the acronym because I actually did read about it quite a bit today and I'm actually going to go buy one just to play around with. All right, queue string. All right, see my headphone just cut out. I heard it beep. So I wasn't really talking about much. So if my voice cut out, it was babbling on about that field programmable device. Oh my God, that bird is just going and going and going. I swear he's gonna give himself a heart attack. Let's call this F index. Very particular about my file names and I don't know why. If F index, nope. I'm very particular about it, but I also screwed it up. Sorry, my bad. There we go.  Simon, be quiet. Not only is the bird noisy, he's also deaf and just doesn't listen. So, well, he actually stopped. Maybe he died. I shouldn't say that. The bird eats fried chicken. I've never seen a bird eat another bird. It's kind of creepy. My girlfriend will feed him fried chicken and he loves it. It just really just creeps me out, man. So really all we're doing is we're saying if they requested directory, then we're going to set it to the default file. Sorry, kind of tripped over my own fingers there. So if they requested directory, set it to whatever they're asking for and an index file. Now we're going to check to see if that bad boy actually exists. It's got to exist and it's got to be a file. Pull up my notes here. Very simple to easy and understand logic of what's going on there. Now we just got to build out this response, if you will. Going to get the mime type of the file and then we're going to go queue debug. I should do file path. So we're going to send the file. Now I have to say in this tutorial we're not actually going to send the file. Bear with me here. Coming up in a future tutorial, we're just going to send basically the header. We're going to set the response code and I'm going to just copy and paste here. So I'm going to get a little tired of typing. Whoopsie. All right, so this is where we're going to actually make the protocol, the header, if you will, that we're going to send. And we're going to say new line. So that's our first line, which is just the version, the response number and the response text. Then we need to do content-type. And this is that mime type that I was talking about. We need to actually tell the browser, the client that's connecting to us, what type of file we're sending it so they know how to handle it. You think that they would just be handling that logic on their own, but no, they need a lot of hand-holding and it kind of bothers me that they do that, but whatever. We also need to tell them how long this file is so that they know how long it's going to take to download this sucker. And by doing this, I'm actually trying to save us a lot of typing in the near future when we actually send the file. All right, now, last but surely not least, we need to tell them, hey, we're going to close this connection because in HTTP protocol, it will actually hold that connection open so it doesn't have to reconnect and all that. And then we're going to add another blank line. There's that hard return, hard return the end of the header that you've seen before, right? So that is the basic HTTP header and we're just going to, through the magic of copy and paste here. And let's actually, we're doing this response so that later, we can actually go through and very quickly look up what sort of response we're sending and we're doing that for a specific reason which we'll cover in just a bit, just bear with me. And all we're going to do, we don't need this mime type or length because we don't have it. We're just going to say four or four not found and we're going to close the connection on you. Goodbye, have a nice day. Once I got, I need a drink. My throat's like super dry. Sorry if you can hear me swallowing. This microphone's like super sensitive to weird sounds. My cat made this weird squeaking noise the other day and it picked it up. I was like, what the frick? Now we're going to actually write the response out. Hoo, let's give this thing a good build just to make sure we haven't, oh, see. It's all fun and games until somebody screws something up here. All right, unresolved const binary operator. Well, that's a very long error message for you forgot your brackets there. There we go, that looks much better. So let's kind of jump back to the beginning because the rest of this is, you know, I don't want to say it's easy but it's definitely not near as much typing. It's just a lot of, you know, Q to bugs. We're setting our MIME types. We are, you know, just setting the root, setting the rate. We're processing the header, the get request and then we're going to handle the request. Now, notice we haven't done anything with these yet. That's coming up here and these little beautiful things which we're going to start fleshing out. So to do make a rate controller. The reason why I'm not sending the file in this tutorial is very simple. We don't have time. It's going to be like another two hours of me typing and I can't fit all that in one video. I'm really trying to hustle as it is. So all we're going to do is send the 200 or the 404 and then load it up in Siege just to make sure that it's actually processing the HTTP protocol correctly. So end pose. And what we're going to do in this little section is we're going to look up the MIME type based off the path and we're going to, just because I don't want to type that out, whoopsie. Double whoopsie, there we go. In case you're wondering, application octet stream is the default MIME type for web traffic. It just means we don't know what it is. It's just an octet stream. It's just a big blob of data. So Q string, mid and we're going to say pose plus one. We want to know that dot location plus one and then two lower. So basically we're just looking for the first period and then we're going to get everything behind that and call that the extension. Now there are little tricks you can do with like Q file and Q file info, but I just wanted to do it this way because I wanted to do it this way. So if our little Q map of MIME's contains that extension, notice how I did it two lower, two lower, I cannot type and talk, jeez. Now I'm actually kind of embarrassed that I can't, it's feel programmable, I'm not going to let that go, feel programmable gateway or something like that. I will find that out and I don't know why I'm being so absent minded today. Well actually I do, work kind of sucked today. I mean it sucks going in on your birthday but having a sucky day at work on your birthday is even worse so it's kind of like I just wanted to come home and chill. All right, now for the rest of these, pretty simple, connected. I'm just going to copy and paste that, disconnected. Ready, read. This is where we're going to make some magic happen here. Want to make sure we actually have a socket object. Now you could get that from get socket but I want to do the internal M socket variable. Q debong. What's a Q debong?  We're just going to read all, we're going to throw that in a process get. And remember that'll just keep looking for the end of header and if it can't find it, it just keeps adding to it until it finds it. So that could be a potential security flaw in this program already is they could just keep sending data and eventually crash the server. So want to maybe in the future modify that a little bit and let's flush some of these out super quick. Bites written. Bites written is not something that we normally work with. But we're going to work with it this time. Whoops, I was in the wrong window. Bite written is called once while you guessed it, the socket is actually written bytes. So once we've written bytes, the only time we're going to write bytes, I should say the first time we're going to write bytes, we're going to know that we are writing the header. Therefore, Q string code equal M response value. And we're going to get that code that we stored earlier, right? The 200 or the 404. So that way we know how to handle each one. So if we're sending a 404, we're just going to say msocket.close because we're going to close the connection and then return. However, if it was a 200, which it won't be for this tutorial because we're not implementing it, but we're just going to flush it out anyways. All right, so we're going to then send the file and you very well could put that this line right here. You could very well put that in send file and not have a parameter, but I just felt like doing it that way. We can easily see what's going on here. And then we'll handle that in the rate controller class. So let's not worry about that right now. And I'm going to just copy and paste some things just because they're very easy. They're just Q debug statements here. We're kind of on the home stretch and I just want to really get to this so we can go over what we've done. Now, we won't see any of this fire off in this tutorial because this is going to be part of the rate controller class that we're going to hook into. Once the file transfer is finished, if we did a 200, okay, then we would actually close the file and close the file socket, which none of that's going to trigger off in this tutorial. I'm just adding it as the groundwork for the next tutorial because it looks like we're going to finish this up on time. So let's give this a build. Oh, come on. Oh, yeah, yeah, you're not there, are you? And give it a good build. All right, so let's run this bad boy and we're not done. Grr. We're going to switch that out. Oh, we're going to take that out and we're going to say, everything else should just work, right? We'll start that. And now let's find my little handy. Now you see that Siege is reporting 404 not found and it's not going for a few seconds and then stopping. It's just going and going and going and going. You can see our connections are just hammering away over here and that's because we're actually returning the HTTP protocol. There it is right there in your window, the HTTP slash 1.1404 not found. So if we actually control Z out of there, whoops, not pucky, I did the wrong one. Let's run it again just because. There we go, now I'll stop at control C. You can see the just in that little second time we had 3,530 hits availability 100% meaning the server did not drop any of those connections. Transaction rate, about 1,000 transactions per second which is actually pretty speedy considering we're not really doing anything. Concurrency, successful failed. Notice how failed is zero because we are actually returning the protocol this time whereas before we weren't.  The longest transaction took three seconds. So that's actually an eternity in network time so we are really hammering this bad boy. So that's it for this tutorial. The next one we will actually cover the rate controller and then tentatively actually send a file and see this thing work in action. Whew, that was a lot of typing and whoops, you can see how our client count is now zero. So you can see how it's actually cleaning up, disconnected, removing, et cetera, et cetera. That's why you do all those Qtabugs and you can see it's the HTTP connections. Anyways, that's it for the source code for this and other tutorials. Go to my website voidarounds.com, go to Qt and it's gonna be way, way, way at the back here. I'll try to get that uploaded tonight. Last but certainly not least, this site's 100% funded by your donations. If you feel like sending me a sizeable birthday gift like a Porsche or a Ferrari, feel free. And be sure to visit the Voidrums Facebook group for, well, we've got like 280 programmers in there. We just chat about every language known to man from Java, Python, C++, C-sharp, Qt. Qt's not really language, but you know what I mean. Anyways, thanks for watching.


I am a Warren Officer in the Minnesota National Guard. I'm a Navy Veteran. I am a Combat Veteran. I'm a Navy Veteran, legally blind. I am also a Master Resilience Trainer. And my civilian job, I work in IT. An active volunteer. A mom. And I'm a DAV member. And a DAV member. And a Lifetime DAV member. And I'm a Lifetime DAV member. My job in Iraq was a combat medic.  They can't believe it. DAV is leading the way for women and veterans. They're getting the recognition out there that women are veterans. They are actually helping push women's issues at the VA hospital. We still have a long ways to go with that aspect, but it's getting there. And I'm proud DAV is doing that. It's awesome. I have been a part of Boulder Crest Retreat here in beautiful Arizona. I needed to come to Boulder Crest because my life was in a very dark place. I struggled for the last 25 years with the rocks, as they call it here, that I was carrying. Boulder Crest is a safe place. No one here will judge you. Everyone here will embrace you. They will make you feel comfortable. They will help you transform your life. This is a wonderful retreat sponsored by DAV. What I get out of being a DAV member is feeling the support of others and being able to support others. So DAV has had many events I've participated in. It's national tea tournament in Iowa where you golf and winter sports clinic for downhill skiing. There's a lot of women veterans at these events. To have organizations like the VA and DAV put on an event like this is liberating. It's interesting when I tell people that I've been shot at, you can tell that there's a disconnect. One thing I did with DAV was go to the Minnesota Lynx Open Practice, which was awesome. It gave me a very enjoyable time watching another team work well together and just to know what their history was. I think these events really help out because it brings multiple female veterans together and with that camaraderie gets to be more recognition.


In what should not be a surprise, given there are 14 games on tonight's slate, there are a lot of really fun options, both at pitcher and for stacking tonight in MLB DFS. And that means we gotta kind of dig on through and be a bit picky with these options. I think we can do that pretty successfully and feel pretty good about the options we have, but a lot to sift through for sure, some uncertainty with starting pitchers, stuff like that. So we're gonna break down tonight's 14 game slate, get you ready for tonight and hopefully win you some money over on fandual.com. Welcome on into the solo shot. That's right here on the Fandual Podcast Network and numberfire.com. My name is Jim Sotis. I am a senior writer and analyst for Number Fire, here to break down this 14 game main slate with lockset for 7.05 PM Eastern for today. Couple weather notes on this slate. First one is out in New York for the Mets and the Cardinals. Doesn't seem super heavy, but it does seem like there is a good chance that rain does interrupt this game one way or another. So Mets and Cardinals definitely up in the air for tonight. Same thing in Atlanta for the Braves and Rockies. They're lower rain odds, so they should be good to go, but potentially some murkiness there. Check back on that one later. And finally, there is a chance of thunderstorms in Kansas City for the Royals and Angels. They should be okay, but check back on the timing of that rain later on as well. We'll dig into the pitching options, outline where I'm going on a pretty full slate and then get you talking about some stacks later on. The first day reminder to make sure you're subscribed to the Number Fire Daily Fantasy podcast feed wherever you get your podcasts. You can find this wherever you get your podcasts and also over up on the FanDuel YouTube page. If you like what you hear, leave us a thumbs up on YouTube or a five-star rating on Apple Podcasts or on Spotify. Baseball season is in full swing and there's no better place to get in on the MLB action than FanDuel America's number one sports book because right now, new customers get a no sweat first bet up to $2,500. That's at $2,500 back in bonus bets if your first bet doesn't win. So don't miss your chance to get a snag a no sweat first bet up to $2,500 when you join FanDuel today. FanDuel official partner of Major League Baseball. Major League Baseball's trademarks used with permission must be 21 plus and president select states, first online real money wager only $10 deposit required, refund issued is not with trouble bonus bets that expire in 14 days. Restricted supply seafold terms at fanduel.com slash sports book. FanDuel is offering online sports waging in Kansas under an agreement with Kansas Star Casino LLC. Gambling problem called 1-800 Gammler or visit fanduel.com slash RG in Arizona. 1-800 next step or text next step to 533-42 in Connecticut 1-888-789-7777 or visit ccpg.org slash chat in Indiana 1-800-9 with it in Wyoming and Kansas 1-800-522-4700 or in Kansas ksgamblinghealth.com. Louisiana is 1-800-777-770 stop in Massachusetts gamblinghelplinema.org or call<PHONE_NUMBER> for 24 seven support in Maryland MD gamblinghealth.org in a New York 1-877-8 Hope and Wire text Hope and Wire and in West Virginia go to 1-800-gambler.net. Pitching preview for this Friday main slate Joe Ryan checks in with the highest salary on FanDuel his salary is $11,000, $400 all by Kevin Galsman at 11-2. We got Shane McClanahan at 11 flat fall by Zach Gallin at 10-8. Tristan McKenzie is facing Zach Gallin. His salary is 10-5. Followed by Michael Kopeck at 98. Julio Tehran is 97. What a world, love that. Andrew Abbott facing the Astros 95. You Darvish get the tough test of the Rays at 93. Domingo Ehrman 92 at JP France at 9,000. Sandiel Contra, Taiwan Walker, Martin Perez, JP Sears, Trevor Williams, Patrick Sandoval, Rich Hill and Tanner Hauke are the others that $8,000 are higher. My goodness, that is a list. A lot of names in that list and a lot of names to sift through for today. After sifting through all of those names, I wanted settling on Joe Ryan as being the top guy for tonight. And entering last night's game, I was skeptical of Sonny Gray against the Tigers. Didn't think he would leave after four innings, but I wasn't as confident in Gray as I am in Ryan for tonight. So Sonny Gray flopping last night to me does not impact my handicap of Joe Ryan for today. Just much better form for Ryan right now and happy to be here for this time. The matchup obviously is a big part of that because the Tigers have a 122 ISO against righties with a 77 WRC plus and they are more than willing to strike out. But Ryan overall is just pitching really well this year. In 13 starts, he has a 3.49 skill interactive ERA with a 27% strikeout rate. His expected ERA is even better at 2.45. I think that number, the expected ERA at 2.45 is overselling it a bit, but he's obviously pitching great. Now Ryan doesn't always get a ton of leash. That's kind of the twins, the way they work with the pitching and the starting rotation. So Ryan can have outings where he has just four strikeouts. And he saw that each has passed two games and three of us passed four. But we've also seen Ryan get double digit strikeouts three times. I've got Ryan projected for 6.7 strikeouts. That's not like a massive number by any means, but I think for tonight, given the fact that he probably is not gonna allow a ton of earned runs and that number is number three for me tonight, the strikeout projection, that's high enough where I feel good about him. So Joe Ryan to me is going to be the top pitcher for tonight. I think there are plenty of guys you could list for the second slot behind Joe Ryan at pitcher. And you can justify all of them. My personal preference is going to Michael Kopeck at $9,800 and this feels odd because I was stacking against Kopeck about a month ago. And obviously that didn't go well. I think that was against Houston when I did that. And he did walk six guys there, but didn't let up many runs. And that game is also when Kopeck started to change the way he was approaching his pitch mix. In that game, Kopeck basically ditched his curve ball entirely. Now the curve has never been a massive factor for Kopeck, but it was his lowest whiff pitch. According to baseball Savant, Kopeck had just a 15.4% whiff rate on that pitch. His other three pitches are all at 27.9% or higher. So in getting rid of the curve ball, Kopeck basically became a three-pitch pitcher. And at least for right now until teams catch on to him, that is working very well. Across six starts without that curve ball, Kopeck has a 2.99 skill-interactive ERA. His strikeout rate is 35%. Those numbers are great. But when Kopeck was a guy we were targeting with hitters earlier on, it was because he was also struggling with hard contact. But that number has gone down too, because in the six-start sample, the hard hit rate allowed for Kopeck is 30%. That has all helped him to rack up a 2.00 ERA in this time. And this is obviously a very small sample. He was at home for five of those six starts and he had plus matchups. This time, he's on the road and taken on the Mariners. That's a good offense, but they will strike out. 25% strikeout rate against righties in the current active roster. And that's a number we can use pitches against as long as we're okay with the risk of facing a team that does have some good bats. So there is risk here because A, it's the Mariners. B, Kopeck could revert back to his old form. But for the upside, I'm willing to take that risk. I like Kopeck enough to rank him second behind Ryan, even on a slate with a lot of names on it. So to me, the studs for tonight are gonna be Joe Ryan, one, Michael Kopeck, two, and I feel pretty good in putting those two guys that high on my list. We'll talk about some other pitchers you can consider and things to watch for tonight. Top value of the slate has to be, I think Sandy Alcantra, I know he struggled this year. And he hasn't shown a ton recently to inspire confidence of a turnaround, but his salary is 88. And that seems absurdly low in a plus matchup. So I am gonna make Alcantra the top value for tonight. He's facing the Nationals here, obviously not a ton of strikeouts in that matchup, but also not much else to fear. They have an 83 WRC plus against righties with a 124 ISO and a 32% fly ball rates. They're not a team we need to fear with opposing pitchers. Alcantra is definitely still struggling. He went seven innings with just one and run allowed last week, but just four strikeouts there. And also he let him five runs to the A's to start before that. So this is not, I'm not on Alcantra because I think he's trending up. He's been kind of the same. In fact, if I look at like my most relevant sample for Alcantra, it's the full season in 2023. In that time, his ERA is 4.75. His expected ERA is better at 4.11. And he's still got a 13% swing in strike, which is actually higher than where it was that last year. So he hasn't been great. And I haven't seen a lot to make me think that that will turn around suddenly, but there are still reasons to believe he's not fully broken. And if he's not broken, I can't not use him here at 88 in this matchup. So if you get the VOD that Alcantra will be very popular, fine, pivot, you know, because he hasn't proven to us this year that he deserves to be a heavily rostered pitcher. But to me, the discount and salary and the matchup help offset the performance. So Sandy Alcantra, I think deserves to be our top value. I know it's not a massively hot take by any means, but given the way he's pitched, I think that you could question that for sure. So as long as Alcantra is not too popular, he'll be the top value for today behind the top studs of Joe Ryan and Michael Kopeck. Let's go down to stacks. I think the stacking slate is super, super fun personally. First one is in Atlanta for the Braves. D'Nelson LaMette has not been a disaster as he transitioned to being a starter for the Rockies. The skill interactive ERA across three starts is actually in the low fours. He's getting some strikeouts. Walk rate's not too bad, but LaMette's letting up a lot of hard contact and that has bit him in the results column so far. So I think we should stack the Braves against him tonight. It's a very warm game, 86 degrees in Atlanta and that does bump up bats. And it also makes hard contact more dangerous. That's an issue for LaMette because across the three starts, his hard hit rate allowed is 53%. His fly ball rate is 37%, which is not low enough to make that a non-factor. LaMette let up five runs to the Diamondbacks, three to the Giants, two to the Padres. Now he has to go on the road to face the Braves. They have a 109 WRC plus against righties with a 194 ISO. That's a very tough task. I think we should take advantage of the park factor, take advantage of the weather and stack Atlanta against LaMette for tonight.  So the big impact for me of that is that I'll favor Matt Olson over Sean Murphy. Both these guys are awesome. They both had fantastic years but I will sometimes consider going Murphy above Olson just because I think Olson tends to be more popular. Sauer is super, super close. I mean, you can use both obviously as well but I think that it does give Olson a pretty legitimate edge. So Eddie Rosario gets bumped up against lefty, Ozzy Albee's prefer him against lefties or Rosario gets bumped up against a righty and Albee's gets bumped up despite the fact I prefer him against lefties in general but I do think that Olson is kind of the big benefactor specifically where I view him relative to Sean Murphy within these stacks. The other hot game on this slate is the Royals and the Angels and the temperature here is actually higher than Atlanta 88 degrees versus 86 in Atlanta. As mentioned, check the weather here just to make sure this game will be good to go but if we get the green light I think we should stack the Angels. They're facing Brady Singer and I still like Singer long-term. Showed a lot to me last year. I traded for him in Dynasty this off season so it's been rough and he hasn't had it this year. The big issue for Singer has been hard contact and he's been trying to work his way around this trying to get more strikeouts to make the hard contact less of an issue. In order to do that he has gone back to leaning heavily on his slider as past six starts. That has not helped the hard hit rates. It's at 52% in that time. That's despite having matchups in that sample with the Tigers, Nationals and Rockies. Last time out, Singer had to face the Orioles much better offense and he let him four runs in four and a third innings. Now he's facing the Angels. The Angels have a 111 WRC plus with a 40% fly ball rate. So I want Singer to turn it around selfishly for my Dynasty teams. But I think for tonight we should stack against him until we actually see that turnaround happen for Singer. Now within this Angels stack I'm not sure if Mickey Moniac will play. He's been pretty spotty with the playing time but I really want him to. The sample on Moniac in the major series expanding and he's up to 70 played appearances against Reides. His ISO is still 388 which is absurd. He has a 61% fly ball rate. He is striking out too much which may be why he winds up on the bench but overall he looks awesome. He was playing great in triple A. His salary is 29. So if Moniac plays I will definitely be there for today. The salary has been kept down primarily because of playing time but I think that if he's in there he's a really fun place. Mickey Moniac to me, the key focal point within the Angels stack was saying a lot. Give me the other guys but according to accounting for salary he's a thought option for sure. Now for the third stack looking at the Blue Jays current roster you would think they'd be awesome against lefties but they have not been at least in terms of hitting for power and that may continue but I'm okay betting against that continuing and I do think they're a fine stack tonight. Facing Martin Perez who was fantastic last year and looking at Perez's numbers I don't think what he did was a fluke by any means but he hasn't been able to duplicate that this year. We have a nine star sample on Perez with his velocity stabilized and his skill interactive ERA is 5.26. It is up there primarily because he doesn't get many strikeouts but he's also letting up a 38% hard hit rates with a 39% fly ball rate. Across the full season Perez has a 5.14 expected ERA. That's up from 3.59 last year. So again, it wasn't really fluke but like it hasn't carried over to this year and it's also not trending the right way. If you look more recently he let up a seven earned runs last time out. He let up six earned against the Tigers two starts before that. So if the Jays actually do have juice in their bats against lefties they probably could show it here. So I feel inclined to give the Jays a swing and see what happens for tonight. The big catalyst of this turnaround against lefties from a power perspective would be Vladimir Guerrero Jr. Against lefties this year his ISO is 027. That's not gonna stick. That's very flukey. That's very much not gonna stay but George Springer has room to grow as well. So I'd expect those guys to tread up in terms of their numbers against lefties. I would not expect that for Alejandro Kirk. He's not a guy who's hit for power really in general but even to get last year against lefties didn't do a whole bunch. So between Springer, Vlad, Matt Chapman, Boba Shet Danny Janssen if he gets in there. I think these guys do have some power and the Jays salaries are all pretty low too. I think they're highest salary guys $3,500. So you can definitely stack them while using Joe Ryan pretty easily for tonight. Let's dig in now to things to watch. I did wanna touch briefly on some of the other stud pitchers why people need to take a risk on Kopeck as opposed to going to some of the others. Kevin Gosman facing the Rangers. It's a really tough offense. It doesn't strike out a ton. So that's why I couldn't get to him. Zach Gallin strikeouts have been down recently also facing a low strikeout team. You Darvish gets a raise. I'm not opposed because the salary is low but it's a really tough matchup. Shane McClanahan on the other side of that game is on the road facing the Padres. Tristan McKenzie was a consideration for me especially with the roof closed in Arizona. So I would say if you wanna take a swing at someone else McKenzie at 10.5 not a discount by any means but 10 thing for sure. I just preferred Kopeck over those guys. So they're all at least somewhat in play if you have a strong inclination towards someone like that totally fine. I think you can easily justify any of them but for me it was Ryan one Kopeck two with a contra being the top value. I think you could look at one offs on the Rockies if you wanted. The reason Jared Schuster who is still trying to find his groove but they're just such a terrible offense that you can't stack them. So for one offs the Rockies are okay. As far as other stacks you could go to three teams are going with like bullpenish games tonight. And I think we can stack against any of them honestly. Tiger is going with a full bullpen game which makes the twins pretty stackable that bullpen not a shut down unit. So twins would work out pretty well. The Giants facing Matt Andres I think will be the starter for the Dodgers. So the Giants good offense Andres has been fine in triple A this year. So the Giants in play for stacking. And on the other side Sean Mania likely to be the bulk reliever for the Giants again. He's pitched a lot better recently. Their bullpen overall has been very good too. But the Dodgers can crush lefties. There's a path of them being very good here. I'd rank those options the twins first followed by the Giants than the Dodgers but all three teams very much worth a look. I'd probably put them below the other stacks. Again the top stacks are tonight being the Braves, the Angels and the Blue Jays but all three of them at least were a consideration for me within the top three. So again twins, Giants, Dodgers, the teams that I'd also consider in addition to the top three stacks. Let's finish up here with the Dinger calls for today. I was tilting yesterday because I have Dalton Varshow in the same Dynasty League as Brady Singer and Dalton Varshow had another barrel that led to an out. So I was researching to see which batters have the most barrels that have led to outs this year. And the answer is Ronald Lacunia Jr. Despite the fact he is sixth in WRC plus this year. He actually has the most barrels that have resulted in outs in the entirety of Major League Baseball, 15. So you could argue he's been unlucky and he's been absurd without accounting for luck. So I'm gonna go Ronald Lacunia Jr. as my boring home run call for today. This is a really long way to get there. Being mad about Dalton Varshow stuff led me to wanting to use Ronald Lacunia Jr. as my boring home run call but here we are, Ronald Lacunia Jr. is a boring home run call for Friday night. The fun one, I will go Mickey Moniac if he plays because I just love what he's done. His triple A numbers are pretty good too. I think he's a beast, I wish they play him more. I have him in the same Dynasty League. I should stop talking about Dynasty but we'll go Moniac if he plays. If Moniac does not play, Eddie Rosario is the backup for the Braves. Good iso against Raidi, it's not great, it's good but hits it a good spot in the order. Gets a bump up against Lumet. So boring home run call, Ronald Lacunia Jr. Fun home run call Mickey Moniac and it's Eddie Rosario if Moniac can't go. That is all that we have here for today on the solo shot and for this week. As for next week, I am off Monday because of Juneteenth. Enjoy the holiday weekend, everybody. Back with you on Tuesday. So no show Monday, back with you Tuesday to give you more solo shot then. If you got any questions for me, I'm on Twitter at JimsonusJIMSNES, do not forget to subscribe to the Number Fire Daily Fantasy podcast where ever you get your podcasts and also check us out over on the FanDuel YouTube page. Want to thank you all for tuning in, having fantastic and safe weekend. We'll talk to you once again next week on Tuesday. This has been the solo shot right here on the FanDuel podcast network.


In Ohio in 1995, young Natasha Romanoff plays with her surrogate sister Yelena Balova until Yelena scrapes her knee. They go to their mother, Melina Vostokov, who tends to the wound. Later, father Alexei Shostakov comes home and tells Melina they have to leave. They take the girls to a hangar where they prepare to board a plane before a team of shield agents pursues them. Alexei shoots at them while Melina tries to get the plane moving. She is shot, so Natasha must move up and take the controls while Alexei hangs on the wing. They manage to get the agents to crash all over the place before flying out of there. The four arrive in Cuba, where Melina is given medical attention as Alexei meets with a man named Drakov. When the nearby soldiers try to get the girls, Natasha swipes a gun off one soldier to defend Yelena. The men note that the girl has guts and both girls are tranquilized and taken away in a truck. A montage follows showing Natasha and Yelena, plus dozens of other kidnapped girls being taken to the red room where they are subjected to harsh procedures and training throughout their lives, shaping them into powerful black widow agents. 21 years later, Natasha is on the run after violating the Sokovia cords. General Fadius Thunderbolt Ross and his men close in on the building where she is located. Ross attempts to talk to Natasha, but she makes it clear she is not going quietly. She manages to escape before Ross can catch up to her. In Morocco, Yelena has her eyes on a target, Oxana. Yelena is spotted and she pursues Oxana on foot. The two fight until Yelena fairly stabs Oxana in the gut. She then sprays Yelena in the face with a synthetic red gas called red dust, which appears to break Yelena free from mind control. She realizes she just killed a close friend of hers. Yelena recovers the rest of the gas and removes a tracker from her body. Drakov is informed of this when Yelena's signal is lost and he goes to dispatch his super assassin, Taskmaster. Natasha moves to a safe house in Norway where she meets her contact, Rick Mason, who supplies her with items like passports or whatever she needs. She is also sent a mysterious package. Later that night, Natasha runs out of fuel and goes to get more, only for Taskmaster to ambush her on the bridge. Natasha tries to fight the assassin, but Taskmaster is capable of mimicking moves and is quick to defend himself. Taskmaster attempts to grab Natasha's package, but she already grabbed it before Taskmaster throws her off the bridge. Natasha finds that it is red dust, along with pictures of her and Yelena as children. Natasha travels to Budapest to find Yelena in her own safe house. The two engage in a fight until they call a truce before they literally strangle each other. Yelena tells Natasha about the red dust and its effects and she also lets her know that the red room is still active. Despite Natasha having believed it to be destroyed when she supposedly killed Drakov, Yelena mentions Drakov's daughter just before several black widows come after them. The two run out of the building and topple a tower, as Natasha has to shake one widow off as she falls to the ground. When Natasha gets down to the widow, she tells Natasha that Drakov is forcing her to do this just before Drakov has the widow kill herself. Just as Natasha and Yelena try to escape, Taskmaster appears and pursues them through the streets. They steal a car and drive as fast as they can, but Taskmaster fires an explosive arrow that sends the car rolling down into the subway. Natasha and Yelena run with Taskmaster following a trail of blood from Yelena's arm, but the two manage to divert Taskmaster's path as they hide. As Yelena tends to her arm, she brings up how Natasha believed that she killed Drakov at the cost of his daughter Antonia's life when trying to work for SHIELD. She was keeping watch outside his office when Antonia entered the building. When asked by an agent if they were clear to execute Drakov, Natasha said yes, despite Antonia being there and the building blew up, killing her. This has haunted Natasha ever since. Natasha and Yelena grab some supplies and get drinks while reminiscing about the past. With Yelena talking about the fake family they had and the training they went through, they know that in order to bring down Drakov in the Red Room for good, they need help. Natasha contacts Rick again and he procures a plane for her and Yelena. Alexei has been in prison, arm-wrestling other inmates while regaling them with stories about how he became Red Guardian, Russia's first and only super soldier. He tells the others that he battled Captain America, although another inmate believes it to be a lie and Alexei breaks his hand for it. The alarms go off as Natasha and Yelena fly in over the facility. Alexei uses his super strength to break out of the building, but the guards go after him and try to attack the plane. Natasha descends and engages in combat with the guards while Yelena fires a grenade at a tower. This causes an avalanche that buries the facility, but Natasha is able to grab Alexei in time. However, both she and Yelena aren't particularly happy to see them, since he and Yelena lied to them as kids. When they ask Alexei if he knows where to find Drakov, he tells them that Yelena might have an idea. The three make a rough landing near a farm, where Yelena is using mind control on pigs. She reunites with her former fake family, and Alexei openly flirts with her, which grosses out Natasha and Yelena. He even goes to try on his old Red Guardian outfit, but he struggles to get it on due to gaining weight. While sitting at the table, things get tense, as Natasha says that nothing from their past was real. Yelena is brought to tears, as she believed their family to be real. Later, Yelena tells Natasha that her birth mother was relentlessly searching for her, until Drakov had her killed. At the same time, Alexei tries to continue being a father figure to Yelena. Although she is still too angry at him, until he sings American Pie, which was her favorite song when they lived in Ohio. Moments later, Drakov's agents arrive, having been contacted by Yelena. They subdue Natasha, Yelena, and Alexei before being taken away. The group arrives at the Red Room, which is located on an aerial base for the utmost discretion. Molina is brought to Drakov. Although it turns out to be Natasha, wearing a disguise. This was part of a plan she staged with Molina back at the house. With Molina taking Natasha's place in the prison cell, since she knows how to open the doors to free herself and Alexei. Yelena nearly has her head cut open, until Molina talks to her via an earpiece, to inform her of a blade she can use to free herself. Meanwhile, Drakov reveals several things to Natasha. First, he is protected himself with a pheromone as a protective shield that prevents any soldiers from attacking him. Then he brings out Taskmaster, who is revealed to be Antonia, having survived the explosion with facial disfigurement, and her father has her mind controlled into being the perfect super soldier. He then shows Natasha the files of all the girls around the world, that he has their mind controlled. When confronted by guards, Molina blows up one of the engines on the red room, sending several guards falling, but also causing the whole facility to begin tumbling toward the ground. Alexei fights Antonia, while Yelena and Molina battle the guards, until Molina helps Alexei trap Antonia in one of the cells. Natasha then smashes her face against Drakov's desk to break her nose, to block out the pheromone as per Molina's advice, allowing her to attack Drakov. He brings in other widows to attack Natasha as he makes his getaway, but Yelena sends the red dust to the room, blowing it up and breaking the widows from their mind control. Natasha tells them to go free, and she stops to release Antonia from her cell, despite acknowledging that she will go after her. The red room starts to come apart even more, prompting everyone to make it outside to escape. Alexei and Molina make their escape, unable to wait for Natasha and Yelena. Drakov and his guards board their getaway craft, but Yelena takes electric batons and jams them into the turbine, causing the ship to explode and blow up Drakov and the guards. Yelena is thrown from the impact, but Natasha jumps and reaches her in time to give her a parachute. Antonia catches up to Natasha and fights her when they land on the ground. Natasha opens her helmet and sprays her with the red dust, freeing her from her father's control. Natasha is met by Yelena, Alexei, Molina, and the other widows, who take Antonia in for recovery. Natasha bids farewell to her former family as Ross and his team start making their way toward the location. Two weeks later, Natasha now has blonde hair and meets up with Rick again as he has gotten her a jet. She is set to help break out the other Avengers from prison and reunite with her second family. In post-credits scene, it is now 2024. Yelena goes with her new dog to Natasha's grave, following her sacrifice in Endgame. As she mourns her sister, she is met by Contessa Valentina Allegra de Fontaine, who now has Yelena under her employment. She gives Yelena a file on her next target, the one apparently responsible for Natasha's death, Hawkeye.


We're primarily used to Blue Origin announcing things after the fact, but at a recent conference they actually have released new details about their rocket, new Glenn, and potential customers. And this is your space pod for March 14, 2017. No, really, Blue Origin is about as secret as it gets in new space, but at the recent 2017 satellite conference they actually threw us a few bones about their new big rocket, new Glenn. An impressive vehicle, the two-stage variant of the new Glenn rocket stands at 270 feet tall with a three-stage variant standing in at 313 feet tall. The first stage will be powered by a cluster of seven BE-4 engines, a liquid natural gas, liquid oxygen, stage combustion rocket engine, which is being designed and built in-house at Blue Origin. The BE-4 will put out 550,000 pounds of thrust, making for a total at lift off of 3.85 million pounds of thrust. In the second stage we'll use a single BE-4 engine. New Glenn and its two-stage configuration can lift nearly 13 metric tons to geostationary transfer orbit. However, if your destination is a bit closer in low-Earth orbit, expect that payload delivered to go up to a whopping 45 metric tons, and the three-stage configuration will likely be reserved for deep space payloads. And since all the cool kids are doing reusability nowadays, the first stage of New Glenn is designed to be fully reusable. Using its rocket engines and with fins and six landing legs, New Glenn will land on a barge out at sea. It will then be brought back to be refurbished and ready to fly again, potentially up to 100 times per first stage. Also, the first fully assembled BE-4 engine was revealed in a tweet from Jeff Bezos, the founder of Blue Origin, who noted that the second and third engines are not too far behind in manufacturing. It's expected that the first full hot-fire test will be conducted by the end of the year. And that's not all the good news that Blue Origin announced at the 2017 satellite conference. They actually have two customers lined up to fly. French-based Unosat has announced that they're going to fly one of their satellites to geosynchronous orbit on a New Glenn as soon as 2021. Now, this is a big win for Blue Origin because Unosat is one of the three largest providers of communications from space. In addition, startup OneWeb has announced that they will launch some of their 900 satellite constellation to low Earth orbit on a New Glenn. And OneWeb, of course, is going to be providing internet access from satellites in low Earth orbit. If you're like me and a big fan of multiple companies coming together in order to compete in spaceflight, then this announcement was a big deal and also a very exciting one as well. And it's very nice that Blue Origin is starting to become a little more public instead of that secret one that isn't going to tell you anything about what they're doing. Jeff, if you're watching, thanks for being less secret. It gets everybody a little more excited about the future of spaceflight. Thanks for watching the Space Pod. I'm Jared Head. What do you think of Blue Origin's new rocket and some of their customers? Well, let us know in the comments below. And of course, you can reach tomorrow on our various social media outlets such as Twitter, Facebook, and Reddit. And of course, a huge, huge thank you to all of our Space Pod Patreon patrons. Without your support, we wouldn't be able to do these Space Pods so that we can inspire and excite the world about space. So again, a huge, huge thank you to you all. So until the next Space Pod, keep exploring.


Hey, this is Brett. And this 2016 Chevy Silverado 2500 Crew Cab Long Box High Country is stock number 13126Z. I am here at Summit Automotive in Fond du Lac, Wisconsin, your new and used heavy-duty truck headquarters. This 2016 Chevy Silverado has the 6.6 liter Duramax diesel engine. It's the LML engine, which puts out 397 horsepower. It's paired up with the Allison Heavy-Duty 6-speed automatic transmission. This truck has been fully-safetyed and inspected by our service shop, has a fresh oil-land filter change. All the fluids have been checked and topped off, and this truck is 100% ready to go. I'm going to go all the way around, inside, underneath, start it up, and take a look under the hood in this video. Black clear coat is the color, and I shoot all my videos in 4K. 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 vehicle before seeing it in person. And if you like the video on how I do things here at Summit Auto, you can subscribe to my YouTube channel and the lower right-hand part of the screen. Click that, and then click the bell notification so you get updates every time I do these videos of our new and used inventory here at Summit Auto. This one comes with 20-inch ModoMetal painted and polished aluminum rims. It has Cooper Discover AT tires. These are LT27565R20s, and they have probably, I'd say, 80% of the tread left on them. So pretty new tires on this truck frame and underbody is in fantastic condition. For a 2016, front fender is in great shape. Comes with the projected lamp-style headlamps, the factory fog lights, the painted front bumper. You get the front bumper parking sensors and tow hooks up here. You also get the chrome-trimmed grille with the black bow tie. Comes with a chrome bug shield, and the hood is in fantastic condition. I didn't see any dents or dings on there, and it also has the cab lights up top. Passenger side front fender, no major dents or dings on there. Looks really good. This passenger side front rim, no major scuffs or scrapes. Going down this side of this 2016 Chevy Silverado High Country, take note of how clean the body is, how reflective and mirror-like that paint is. I take these HD videos so if you are far away, or even if you're close by and you just cannot make the trip down but you're still interested in purchasing the truck, 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. And once again, if you like the video, you can subscribe to my YouTube channel. I do these every day, and that link is in the upper right-hand part of the screen. Back rims in excellent shape, and the back tires are just as new as the front tires. And as that B&W gooseneck hitch, and look at how clean that frame is, absolutely no corrosion on it. For being a 2016, this had to have come from down south. Has all the remainder of the factory exhaust, and that frame and underbody is absolutely perfect. Lower rockers, no corrosion on them. Factory chrome step bars. And I can check where this one was from in just a minute here. Once I get to the buyer's guide, rear bumpers in pretty nice shape. I didn't see any major dents or dings in there. It does have the rear bumper steps and parking sensors, full towing package, which includes a receiver hitch, four pin and seven pin wiring. And that tailgate is in very nice condition as well. You get the locking tailgate and the backup camera right there. Shocked down assist tailgate, spray in bed liner, and you do get that B&W gooseneck hitch right there. That ball is removable, of course. 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 on the box. Looks really good. And for full disclosure, this back rim is in nice shape as well. No scuffs or scrapes on there. Down the rest of the side of the truck, the doors and the cab all are in very nice shape. This one does come with the telescopic tow mirrors. They have built in directional signals, LED side lights. They do telescope out like that. I'm pretty sure they power fold in as well. Inside the High Country package gives you the brown leather interior with the kind of tannish white piping on there. You get the High Country stitched into the headrest, I should say. And that seat is in fantastic condition. I didn't see any rips or tears.  I always like showing both sides so that you know that both sides are working properly. We'll take a quick look at the back seats and then we'll start it up and take a look at the instrument cluster and then we'll start it up and the radio and everything. Back seats are just as clean as the front seats, no rips or tears back here. Power sliding rear window with the built-in rear defrost. Seats are in really nice condition. You do get a storage bin underneath there, which is nice. And WeatherTech floor mat back here too. Sudkern airbags, wood grain trim, and the bottoms of the doors all look very, very nice. I promise you I'd find out where this is from. This one's from Utah. So all states titled in Utah. That's why it is so clean underneath. Check out the miles, the radio, and everything that this truck has to offer. On the interior, 42,433 miles, you do get a digital spinometer compass display and that instrument cluster is very nice and clean. Comes with the heated leather wrap steering wheel, Bluetooth and information center controls on the right, cruise controls on the left, heated steering wheel button, forward collision warning, the Allison six-speed automatic transmission with the optional tap shift. This one comes with the Chevy MyLink system, AM, FM, and Sirius XM radio capabilities. You do get the factory navigation system and you can see there's self-rolling meadows drive, which is right outside. So that is working properly. And you get AM, FM, and Sirius XM radio. So now as a projection manager, we can project your cell phone to the screen via Android Auto or Apple CarPlay, CD player, heated and cooled seat buttons, dual climate controls, power pedals, stability control, that's for your cargo lamps. That's also how you turn on your LED side lights. So we'll check those out in just a second parking sensors, lane departure warning and the factory exhaust brake. Two USBs, two 12-volt power points, and then a 110-volt, 150-watt plug-in. You get two cup holders right there, wireless cell phone charge pad, passenger side seat and floor mat are in excellent condition. You get the dual glove boxes, no rips or tears on that seat. Headliner is in nice shape and this one does have the power sunroof. Up here you get your map lights, home link buttons for your garage door security systems line systems, power sign rear window button and your sunroof controls. We'll start it up and take a look under the hood. Starts right up, no check engine lights or anything like that, other than telling me my hood's open. I would personally like to thank you for checking out the video today. There are those LED side lights, they are extremely bright. And hopefully from this HD video you'll have been able to verify the quality condition options and cleanliness of this truck all the way around inside and out. All lights are working nicely, cab lights and mirror lights are working nicely. And under the hood we have the 6.6-liter Duramax diesel engine engine base. Very clean runs, very smooth. Once again this truck has been fully safety and inspected by our server shop as a fresh oil and filter change. All the fluids have been checked and topped off and this truck's 100% ready to go. The new tires, not an ounce of rust on it, a 6.6-liter, there's your emission sticker. And I do want to show you the loading sticker, the VIN sticker as well. And once again I would personally like to thank you for checking out the video. And I would highly recommend this truck from a quality and condition standpoint. I don't think you'll find a much cleaner 2016 with these kind of miles on it. And to see more pictures of this truck or one of other 450 new and used cars, trucks, SUVs, minivans, Wranglers, halftones, 3 quarter-tons, one-tons, you name it, we got to go to that website right there, summitauto.com. Full pictures and descriptions of every single vehicle from two locations all at summitauto.com. If you'd like to check out more HD videos, you can go to youtube.com slash summitauto.com. Remember to like, subscribe, and share on this video and all the videos that you see there. Click the bell notification so you get updates on the videos I do each and every day here at Summit Auto. In fact any second you'll see a link to subscribe to my YouTube channel on the upper left to link to more Chevy 2500 truck videos like this one on the upper right. Link to this vehicle on our website in the lower left and the link to one of our latest YouTube videos in the lower right. Click those, check this out. And we're super excited to help you with this Ultra Clean 2016 Chevy Silverado 2500 Crew Cab Long Box High Country in Black Crew Coat. Thanks again for checking out the video. I really appreciate it. Remember to like, subscribe, and share. And thanks again.