Good afternoon, everyone. This is Melissa with thestockswish.com and welcome. Welcome to Netflix. What an outstanding everything. I mean, gosh, this is just like the prettiest thing I've ever seen. So let's go over it. Target today, I mean, I said earlier, I said yesterday, actually, that tomorrow Netflix is going to go. It was a great call. I should have done a video and put it out on the net. I didn't have time to last night. I was working on talking to people about the class and getting people signed up for the class this weekend for the Golden Gap class. So I never had time to do a video last night, but I did say it in my live trading room. And everybody that was there heard me say it. And then, actually, it gapped up last night. And one of the people in the room texted me that it gapped up, and then I knew that it was going to go at least to 4.20 today, which was the target I sent yesterday in the room. And then I saw it do what it did this morning. It blew through 4.20, and then the next time was 4.25 and 4.30. This is actually going to even get over 4.30. This is crazy. It is over 4.30. I love this. Netflix is on pace to be the Golden Gap of the year for 2014. And we're only in the second month of the year here.  This is pretty amazing. Netflix is going to get to 7.50 this year. That's the call. Netflix to 7.50 this year, 2014. It's got a year to do it that's within its sights and perfectly reasonable. Last year, Netflix was the bullish Golden Gap of the year because of what it did. The move that it made it actually did correction. Let's just go back and look at this whole thing from the start. Here's all the move in Netflix. I remember trading this all in here in 0.9 and 0.10. And look at the rally that it made. I remember the days I was doing it where Netflix has so much power. So much power. It feels so great to be in something that has a lot of momentum and volatility when you're in it in the right direction. I mean, that's why I love to trade gaps. Anyways, then Netflix got down here. You can see how this broke. This was actually in 2011. It feels like a long time ago now, doesn't it? And then look what it did. And here's all of the down move in Netflix. It actually did get to the dream target. Look at this. Netflix got to the dream target to the downside. It did it. And that's the great thing about charts and trends and stocks. Nothing lasts forever. So you can play something hard in one direction, stick with the trend. And then if it does a correction, you play it hard in the new trend. And that's what you could have done with this. You could have been long Netflix all up into this first move. You would have known to get out of the long here on the gap, okay? Was a good bearish gap, a professional gap, a golden gap at the time this happened here and started the move and there it went. So then this happened here. And now at this point, you don't do anything, you're not buying the stock here. You don't buy bottoms. But you can wait for the correction to happen and it happened. And I actually called it for it happened, just like I called this one here before it happened. You could have bought Netflix here immediately on the gap up that happened in 124, 2013. What an outstanding trade if you were in that. So the idea of this getting to 750 this year is 100% realistic and could surpass it even. So let's be realistic here 750 for Netflix this year. Here was the buy last year and you could have bought Netflix on this gap. But many people wanted to short and been in it, held, held, held every day I said it's getting ready, it's getting ready, it's getting ready and do this huge, beautiful monster day here on the 28th. And then I kept watching it and every day, every day the market was falling in here. I kept saying buy Netflix. You want to buy something? Buy Netflix. You want to buy something? Buy Netflix. Have 100% conviction in Netflix? Netflix, Netflix, Netflix. I don't know if anybody believed me. Some people did and have capitalized on my call. But yesterday when I said Netflix was going to go today, even I, even I, and surprised that the movies is making on the day here. Markets helping this, but that's not the reason this is happening. This is happening for a combination of reasons all coming together here. This is, this is one of these super duper, super duper plays that you really just don't get all the time. Netflix is actually gapped up was a bullish gap up a continuation gap to the bullish side. A great, beautiful, fantastic gap. Number one, Netflix also did a breakout play on the daily chart. This is a breakout play today. Netflix facing, basing, basing, breaks out. It's a breakout play. Netflix is also triggering a daily buy setup. Okay. It's also doing that. Netflix is also in a bullish uptrend anyways. And today you're getting the market running too. So it's everything. I mean, this is, you know, it's where you get like 17 things, but it had it. And you could have been in this today, it aggressively, aggressively into the open in the, my favorite trading time of the day, which is the first five minutes of the day. And let's look at it. I love this thing. I love Netflix. I have to get re-signed up for that here. Had all these movie channels and really haven't needed Netflix, but I miss it. So I'm going to have to re-sign up for it. I'll help you get to 750. All right. Let's look here. So Netflix open, came in, doot, doot, doot. Nice little setup in here. You were held for 10 and you could have bought it very aggressively here, did a sandwich, and could have done an ad right in here. This is amazing. Look at how this held here. I mean, this is really good people. And then it shot up and never looked back. Stop here even is really good actually for Netflix. It's a dollar stop plus a spread. I mean, that's actually really great. Not just for Netflix, but for any stock at this price point. The price point is $410. $410 a share for a dollar stop. This is like a steal here to be able to get this entry. It's a steal. Okay. And it ran all the way up here, went to the target, blew through the target. So, you know, this is actually 11, 12-hour trade here. This is just incredible. I love it. And you could have done the ads, and you wouldn't have passed this port. But even the time that it here was, it was only 9.45. It should open, strong stand, holds and support. Holds and support triggers, rallies up. Rallies up makes a new high. You stay with it. Comes on down. Here's the resistance. Comes on down to support holds. Rallies up. Keeps going. I mean, it's still going, but you would have had to really get all out and then re-enter it here for a day trade. And I said buy any rally in Netflix today. Buy every rally in Netflix today. Buy every rally in Netflix today. And you could have bought it here. And you actually could have bought it around lunch, which is not an ideal time to take new trades. But I said this morning you could just buy every rally in Netflix today, meaning you buy the dips in. Every point you buy. Look at that. So it made it over the 430. This might be the end here because it's getting late. It's 10 and 3. But as far as holding this trade for a court trade, which a lot of people are doing on my call, it's got so much more room in it here. And now that it had the fat, nice day today, this continues on Monday. This will have some follow-through here. I know that it didn't really after this day, but go back and look what the market was doing here. And honestly, this just needed to rest after this. Huge gap up. Fall in here. Big green day. Rest, rest, take a nap, take a nap, take a nap. Go. I knew it would go to jail. Such a great call. Oh, Netflix is really outstanding. I mean, this is power. So you want to know what power looks like? This. I was talking about this earlier in the room today. I have no idea why people like to do things that they think make sense, but really it has totally, doesn't make any sense at all. You got to think and have common sense when you're trading. Stocks are like people. They want to do the easiest thing that's possible for them. What is the easiest thing for Netflix to do? The easiest thing for Netflix to do is just keep running higher. It's not even taking a lot of energy for it to do it because it's actually just doing what's easy for it. This is why this whole concept of going against a trend makes no sense at all. Stocks like to do what is the easiest thing for them. They're not really any different from people. People always like to do what's easy. I mean, let's face it. People like to do what's easy. People really prefer to do what's easy than to do any work. Okay? And stocks really want to do what's easy. Going with the trend of a stock, if it's continuing, it's easy for it. It's hard for it to go against itself. It's easy for it to continue itself. So the easiest thing for Netflix to continue to do is to continue to run up. It's the easiest thing for it to do. And that's why the idea of shorting Netflix here into this gap was crazy because that would have been hard for it to do. It's easy for it to keep going. This gap here that happened in Netflix was a brand new gap, a bullish gap, a brand new gap here in this chart that was fantastic and continued this move up here higher that's making new highs at the moment. But honestly, even when this happened here, I said it was still going over this bar. Now, it took a little while, but not that long considering the length of this bar here and all that happened here was profit-taking back here. That's all that was going on with this. Okay? This is power here to make a gap like that. The stock closed at 333.73 and opened here the next morning at 387.40. There's only one thing that can make a stock go and close at 333 and go up to 387 in one night. Buying. Okay? So if people have new buying and just bought this, we're not going to sell out of it. And they're still buying it. And they're still buying it and they're still going to keep buying it and this is really going to have another great year here. This seriously might be the golden gap of the year here again for Netflix. So I know people like to get tricky and think about doing the opposite and it's just this whole idea of something to hang in midair that people don't understand. So they think that something's going to go against itself but that's not the case. The understanding comes from knowing what people are actually doing with the position holders. Who is in this? Who is the power of money? Who are the institutions that are buying or selling the stock or shorting it? Okay? Because hedge funds can take short positions too. So you have to understand what are they doing? They are giving the stock a lift or buying it. So you want to be with those people. You don't want to be against them. And it's easier for the stock to continue to get a lift here now. So it's going to do it. It's going to roll with it and ride with it wherever it goes. It's the same thing of something is, you know, tired but Netflix is not tired. Netflix has all the energy in the world and it took a nap for about a week and a half. So... And I think this could even hit up through a 450 by Monday. This is going to have a nice little rally here. I think we get three green bars here in a row and we get a rally here in Netflix. Continuation here. Follow-through. At least one more green one for the Monday. We'll see how big that green bar is. Netflix is outstanding. Amazing call that I made in this even before the gap that I would gap up a year ago when it would correct the chart and go from a downtrend to an uptrend. The move here, the breakout play, what I said in the room yesterday for this to go to data 420. I mean, there's some things that there's just no substitution for. Let's put it that way. And it's reading gaps. There's no substitution for reading gaps. I can put all the indicators in the world I want on my charts. Everything. Everything in the world. I can make this look like a planetary solar system of indicators. I could have every Fibonacci figured out. I could have every algorithm in Fibonacci figured out. I could have charts and computers and people lined up. I could have a whole room of things here. There's no substitution for just me, my eyes and my brain reading the price. And if you're a person that's a trader, you've got those things. You've got a brain. You've got two eyes. And you have the ability to be able to learn how to reprice. And that's all you need.  And it's really all in the gaps. That's the way I'm able to read the price and something like this to call these trades and go, Netflix! Go, baby, go! 430.50 430.49 430.50 That might be it for today, but it is three o'clock. It's three o'clock on a Friday. Most people are done trading, but Netflix has all. In fact, Netflix could even gap up on Monday. Who knows? I mean, after a bar like this, you think, well, it's done for now. No, no, it's not. No, it's not. So this is Melissa with the stockswish.com. I actually have a golden gap course this weekend. Saturday and Sunday, I'm going to be snowed in doing the gap class. And I love teaching the gap class, and I love gaps, and I love Netflix. We'll find out if Netflix is going to be the golden gap for 2014. It certainly is off to a head start. It's actually surpassed everything so far. We'll see what Netflix, what more it has to give. If you'd like more information on the golden gap class, email me at melissa at the stockswish.com. Thanks, everybody. Have a great day.


One, two, three. All right. It's indeed a great pleasure to be here at this occasion, which is very important, and today must go into history as China's Southern Airlines come to Vancouver from today. This is three flights a week that we're beginning with, passenger flights. I expect that very soon we will see daily flights, the relationships that we have built with China and the opportunities that exist, not just in tourism and economics and the commerce side of it, but about 26% of our population in British Columbia shares family with China and Asia, so we continue to build on that great opportunity that we have. Having another China Airlines come to Vancouver, come to Canada, which I'm sure will promote closer links between China and Canada, especially in trade, in terms of trade, education, culture and tourism.


So this talk is not a very code heavy talk, but there are a bunch of command lines that you might like to copy and paste if you want to try things out. So you want to scan the QR code, go to the URL. There's a copy of the slides right there, so you can follow along at your own pace. My name is Taylor Campbell. As you can see, there's very small text that we had to write on this badge because printers seem to have missed it. Or I also go by Riastra in NetBSD. I'm on the core team of NetBSD. I've been hacking NetBSD for about 15 years. And I started hacking it fairly early on. I've been a NetBSD developer for about 12 years at this point. I work on various things in NetBSD and anywhere from networking to file systems to concurrency to drawing pretty pictures on the screen, which I'm not very good at. And yeah, so I got started hacking NetBSD fairly early on in using it. And I'll go into the origin story a bit in a moment. But first, this is the main thing that you need in order to start hacking NetBSD. You just need to check out the sources. You can do that with CVS or with Mercurial or Git. The main repository is CVS. There's an automatic conversion to Mercurial and Git that is ongoing. It's off by a couple of hours, updates every couple of hours. And then run build.sh. And that's it. And you don't need to be running NetBSD to do this. You can do it on your MacBook, running macOS. You can probably do it on an OpenBSD. You can do it on a Linux under any reasonably POSIX-ish system. The requirements are fairly minimal. What will happen is that build.sh will first build a cross-compiler tool chain and then use that cross-compiler tool chain to build NetBSD. In NetBSD, unless you go out of your way to do it differently, every build is a cross build. And this is very nice for keeping the build isolated from the host environment. So you don't have to worry about structured definitions being mismatched between the host and the resulting NetBSD. Everything starts with a cross compiler and a clean environment, very well-controlled build system here. So this is how you get started. And this is how I got started, too. It's been like this for about 20 years that you can get started this way. And that's a good part of what attracted me to using NetBSD in the first place. So I had previously lived in the Apple world running macOS and well, it was called then macOS 10, written with an X but pronounced 10.  And yeah, Apple puts a lot of effort into making the system nice and cute to use, do a lot of work on polishing all the rough edges off, and you can also get reasonable development environment in macOS. But it is still very much controlled by Apple, and they get to decide what you get to do with your computer. Sometime around then, maybe 2007, 2008, Apple decided you shouldn't be allowed to run iTunes under a debugger. And I thought, this is my own computer. I'm the one who should be in charge of what software gets to run on this computer, not Apple. And I was offended by this denial of autonomy of my own computer. It's a general robust computer. It's a Turing machine. It can do whatever computation you want. In principle, I could, and I'm sure someone has figured out some work around that will let you actually run GDB under iTunes. They run iTunes under GDB, rather. That would be an interesting concept running GDB under iTunes. I don't know what that would mean. But anyway, I don't think they forbid that. But they did forbid running iTunes under GDB. And it was the autonomy of using my own computer to do the computation I want. That was really off-putting. And I knew that Apple controlled the operating system. They controlled what software updates and stuff happened. But I could still generally use the system. But you can't use a debugger for the things that are not blessed. That really ticked me off. And so I started chopping around for something better, something that would respect my autonomy. And that would also run on my PowerBook G4. Because that's the laptop I had handy at the time. And the student didn't have a lot of money, didn't want to have to, didn't have the cash to shell out for a nice new laptop or anything like that. So this is after Apple had ditched the whole PowerPC landscape. And so I had to find something to run a PowerBook G4. And I chopped around a little bit. I'd run OpenBSD previously on some Intel tower that I used as a home router for a few years. I didn't do very much with it. I just ran it as a home router then. And so I looked around at some Linux systems, some BSDs, and in that BSD. And now, I had this spare PowerBook G4. And I also had an Intel MacBook, a 32-bit Intel MacBook, in fact. This is one of the one generation of Apple hardware that was a 32-bit Intel system. So it was kind of inconvenient for a while. But I was using that as a main laptop. And I wanted to test things on G4. And so I wanted to make sure I could build it from the sources and have the control over what I'm actually running. And the only thing I found that made it really easy to do that was NetBSD. And so I gave it a shot. And this is the first email I wrote to NetBSD mailing lists back in June 5th, 2008. I guess they're maybe too small to see. I tried to get a small screenshot, but anyway, showing my tribulations with trying to follow the install instructions, which were complicated, but they worked smoothly once I figured out which steps to take. And then within a couple of weeks of messing around with it, installing packages, doing some package source, I found a bug, which turned out to be a kernel bug. And this is actually kind of exciting. I mean, it's not great that the thing I was trying to test out as a potential replacement for my computing platform has bugs. But I think we're all going to have to live with the fact that there will be bugs. And so it was exciting that I found this bug. I reproduced it in sTunnel, this program to make a TLS tunnel between two servers and expose it on a local socket so you can transparently make your IMAP client if it doesn't support TLS, talk to an IMAP server that's worth TLS, something like that. And I went digging around with this really awful API in posits called the CMessage API for ancillary data on a socket. This is both used for weird IPv6 features and for passing file descriptors on a socket from one process to another. And the API is just awful and not for any good reason. You have to assemble a buffer with the right alignment. And there's these macros, CMessage length, CMessage space. And you have to use to get the right allocated buffer and a frame within the buffer to assemble it all yourself. And if you get the alignment even subtly wrong, then it won't work on some architectures like PowerPC, except actually it was the kernel's bug that it didn't work on PowerPC because, well, PowerPC has strict alignment and X86 does not. And I guess nobody tested this particular path on PowerPC.  It seems to be doing the wrong thing based on the documentation I could find of how CMessage stuff works. And so I decided, OK, I'll just open up the kernel source code and read it.  I mean, a lot of people have this impression that kernel hacking is this dark, mysterious, black magic.  You know, you can't just forget to free memory because you need the system to continue operating. You can't just kill the process and start over because the kernel is the thing that is responsible for freeing the memory that the process failed to free. And so there's some constraints in kernel program. But it's just C code. And C is a fairly simple straightforward language. You know, there's dark corners of C, but it's nowhere near the level of complexity in the language of C++ or Rust or what have you. And so I just decided to poke around. And I tried to guess how CIS calls were implemented. I think what I did was I just grepped for some long CIS call names.  And, huh, these seem to be system call functions that they seem to match up with what the system calls are called. And so I looked at them and they have these arguments that match the arguments and laid out in the structure, but they match the arguments that are in the man pages. And I just kept reading and I found, okay, well, this seems to be the send to function, the send to system call. And I dug around and found where the C message header framing is parsed and I found that there was some alignment criterion that had a, maybe it was an equal sign where there should have been a less than sign or a greater than sign or something like that. And I thought, huh, that's interesting. It looks like if I trace down the values that go in here, then with on the PowerPC, then it will take the error branch. And if it's on X86, then it won't take the error branch. So I don't remember the detail. This is 15 years ago now, but something like that. So I proposed a fix on the NetBeast users mailing list, just one line thing to change that criterion. And within a few days, Christos Zoulas committed it. And that was exciting. Wow, I had just found a bug in the kernel and found a fix, the fix I suggested wasn't quite enough, Christos made it some other changes as well. And it later turned out that in fact, it wasn't quite fixed until several years later. This C message API is really bad and file district of passing is also difficult. But anyway, I was excited because I'd found a bug in the kernel and I've never done any kernel programming before. And I proposed a fix and the fix was actually a reasonably good approximation to the correct fix and someone committed it. And I could actually do something. I'd never done this with macOS. I had no chance and I've ever doing that until well. Maybe Apple would hire me now but I wouldn't want to work for them anyway. So then I thought, okay, well, I can do kernel hacking. It was great. So I bit off a little more than I could chew and decided to try getting the old Broadcom Wi-Fi driver working for the PowerBook G4's airport extreme. And I spent a couple of months working on that. And I had no clue what I was doing. I just copied the code from OpenBSD. You looked at the dragonfly code as well for reference and I went through and I have no clue about Wi-Fi. I still don't really have any clue about Wi-Fi but I just tried to make it compile, see what happened. And I got it to compile and then I went through and tried to make it link and got it to link and I went through and tried to make it run. And just whenever things didn't work is just tried to poke around at it some more. See what dragonfly's doing, see what OpenBSD's doing, see look at the man pages and just worked at it and I managed to get it working by September. I'd never done kernel hacking before, I just dove into it. And it was easy because I didn't have to worry too much about my development and machine crashing because like I said, I had two laptops at the time and I could just work on my MacBook, thank you, work on my MacBook and cross-compile and then, oh yeah, conveniently these Apple laptops had target disk mode where you could just boot into target disk mode, it would expose a firewire disk. You could just connect the two machines with firewire, copy and or kernel over and then iterate and so it was real fast. That's not really a thing anymore but there's other options like net booting with NFS and there's other ways to iterate kernel development which I'll get into later. And so yeah, it took a bunch of work but I got it working, of course. Like I said, I'm not really good at wifi, I don't know, I don't understand how it works. This driver isn't that great and also Broadcom hardware is a pain and the documentation is actively hostile and there's newer Broadcom cards too which with a different driver, BWFM. But anyway, so let's get back to how you can hack that BSD too. So as I mentioned, you can check out the sources with CVS or Git or Mercurial. At some point in the near future, we are going to switch away from CVS but that hasn't happened yet so for now you can still use any of these three options. And yeah, I know CVS is ancient and crusty but it works and switching is a pain so we're working on it.  Now let's go through, this command line is a little bit long. There's some options here that are not the default. I picked the minimal set of options that I use personally because it's convenient for my development. Once you've checked out the source in a directory called source and you enter that directory, build.sh-o.dot.slash-obj, it says put all of the build products right there. So nothing will be written into your source tree, nothing will be written outside.dot.slash-obj. Go all goes into the one directory. If you make a mistake and you screw something up and you're not sure if you can recover from that state, it's very easy, you just delete that directory and start over. There are other ways to use build.sh-obj trees, you can have object directories inside the source tree scattered throughout, you can have it in slash users, slash obj is traditional but what I do is this and this is handy. Dash big U makes it an unprivileged build which really we should make the default because these days privileged builds are kind of silly but traditionally from the 80s, possibly even earlier, you would build as root, run your whole compiler tool chain as root in slash users slash source and build products in slash users slash obj but these days it is build unprivileged and you don't have to worry about root running, GCC or Clang or something. It's just a little bit sketchy from how heavy weight and complicated those programs are using anyway. Dash little U makes it an update build so if you make a mistake in some code you're editing, it'll pick up where it left off. Take some time for it to scan through all the directories but it'll pick up where it left off once it gets there so you don't have to recompile everything if you just change to one .c file. We can even speed it up more by doing builds in one sub directory at a time, I'll get to that later. Dash M alpha, this says build for the sleek modern deck alpha architecture. Now you can build any architecture you want, you can cross build that BSD for the Vax if you want or for the, I mean, not every architecture on the planet is supported. We haven't yet finished the PDP10 port but you can use build.sh list arch to see what the options are. There's a lot of options especially for ARM and MIPS. There's a bunch of different ABIs and variants and it's a kind of a mess for those but dash big n one changes the verbosity level to one so it'll just say compile foo.c and it won't show the whole command line but you can use dash n two for whole command lines or dash n three for more or dash n zero for very quiet builds. I find that dash n one is a good level of verbosity but tastes differ. You want to do parallel builds because everyone has multiple CPUs these days. If you don't have multiple CPUs then you're gonna be waiting a while. And then there's a target. You can specify several build targets. Release builds a whole net BSD release, the whole thing for one architecture and it will produce various things. It'll produce a cross compiler tool chain in object slash slash tool there. It'll produce distribution sets based on TGZ, comp.tgz, et cetera. It'll produce a desk to dir which is a staged installation of net BSD into a directory that's what the distribution sets are built from. It will produce a bunch of build trees for individual programs and libraries like find and that's all the .o files and the executable from find are stored in that one directory. If you screw something up with that then you need to start over. Just blow that one directory away. And it'll produce kernels in OBSIS arch and you can find a net BSD, a file called net BSD or netbc.gdb in that directory and that's a new kernel. You can just boot that kernel, move it to slash, maybe move the old one to slash o net BSD so that you can recover if you made a mistake but move it to slash and then you can boot it. Some other useful targets from build.sh help is always useful if you forget how to do anything. List arch, if you're gonna build just the cross compiler toolchain which is handy for some things you just want an ARM compiler that you can run. I mean you can use like godbolt.org if you're just playing around with seeing how compilers produce but it's handy to have a whole toolchain sometimes. Distribution produces just the user land, doesn't build any kernels. It can be handy if you just want to update your user land with some changes to some files. Sets build just distribution sets, modules, kernel modules, pretty straightforward. For kernels, if you just wanna do kernel development then build.sh tools to get a toolchain and then build.sh kernel equals generic and that works for most ports like X86 and alpha and fax and a bunch of others. For some of them, like 64-bit ARM and 64-bit RISC-5, the kernel is called Generic64 for administrative reasons that make it convenient. And in some ports like FBPPC that's short for Evaluation Board, PowerPC, these are ports that were originally created for just generic hodgepodge of evaluation boards that were made by various different makers. There's a lot of them 10, 20 years ago that all this kind of small embedded system so you don't wanna have a whole kernel for all possible ports and the kernel is somewhat smaller and it's tailored to that one evaluation board for embedded development kit. So you might find some of those if you're dealing with FBPPC or FB ARM or what have you. If you want to make a custom kernel config, you can either just put some customizations in generic.local, this is a file that the generic kernel config will automatically look at if it's there, if it's not there no problem but if it is there you can just have that file in your source tree and it will never have merge conflicts when you update from CVS or Git or Mercurial. Or you can just create a new kernel config, call it say debug, this is what I have in my debug kernel. I have a few more options in that but they wouldn't offer on the slides. And it's just to turn on some debug options so that I get some diagnostics if I, while I'm trying to do some driver debugging or something. Now if you wanna boot a kernel, let's say you built one for AR64. So you can take the AR64 image that build.sh release just produced and G unzip it and into a dist.image file. And you can make a, let's say this image is about one gigabyte or so, maybe a few hundred megabytes. Once you extract it, you can expand it with DD to be, let's have a pointer, cool. Spend it with DD to be a sparse image by adding a single byte after 10 gigabytes. And there's other ways to do that but this works. And then you can even make a sim link to the kernel that you just built in the case for booting QMU with a netpst kernel. You want the netpst.image file and this is very handy because you can then pass it on the command line to QMU and anytime you want to update the kernel, just execute QMU, control AX and start it up again and it will instantly boot the new kernel. You don't have to worry about copying it over like I mentioned the target disk mode even. You don't have to copy it over to the file system. And you can do that but you can also boot with kernel on the command line. And so this just specifies boot from the disk DK1 which will be discovered from the file disk and image. This makes sure that we have the machine type of just a generic virtualized ARM system with a reasonably modern CPU instruction set, not some ancient ARM v5 thing or something. And it pretends to have two cores, a gig of memory. You want to have the disk to boot from. You'll also want to have a Virudio RNG device. This is handy for entropy, especially if you want to do anything serious inside the VM like generating keys that you care about. And you'll want to have a, and there's lots of options for this, but if you want to have network access to talk to the host or something, then, so this is a complete command line for you can do some reasonable net PC development with. There's lots of other options. The QMU man page is huge. You can run through it, whatever, but this is, I just create a script called run.sh and put that in a directory with the disk image and then whenever I want to start it up, I just run that as h. There's some more options that I put in here, but you can play around with this stuff. You can also use V&D. What does it stand for? Virtual node disk. What does it stand for? Anyone remember? I don't know. Okay, so it's the virtual disk. And so this is just a virtual disk that exposes a file system as, sorry, exposes a regular file in your regular file system as a block device. You can mount file systems from that and so you can mount the root file system and update your kernel or update the user land or whatever. Be nice if you could also pass the kernel on the command line for X86. Right now we don't support that if somebody would like to volunteer to do that. That would be a very welcome starter project. You can also run GDB on a live kernel under QMU and it's real easy. You just pass the dash s argument to QMU. This is actually short for a longer argument. There's more options for that, but dash s is the default thing. And then in your kernel build tree where you have netpista.gdb that was back up in this directory here. Obsess, arch, the machine, compile and the kernel configuration name. So you'll find a netpista.gdb in there. Yes, what's up? Don't you need one? Yes, I guess I should have mentioned that. Yeah, so if you are doing it, right. Yeah, so, right, if you're doing a cross build in the sense that you're like, not just in a way that netpista is always a cross build, if the host is an x86 laptop, like I think that here, and you're trying to run GDB on an ART64, ARM64 guest, then you'll need to pass an extra argument. So I hope this is big enough for the video audience to see or people in the back to see. So yeah, so you can use build.sh-v make cross GDB. This will, in addition to the cross tool chain, build a cross GDB so that you can then use your toolder and you will have a GDB executable that you can use for the purpose of that, for the purpose of running a live kernel under GDB in QMU. And it's, so yeah, once you have, either if you have the host GDB if it's x86 to x86 or armed ARM or whatever, or if you have a cross GDB from build.sh, then you can use that to debug the live kernel under QMU and it's, you can like, you can examine data structures, you can look at what's going on in kernel memory. I'm not sure if you can set break points. You may be able to, but I don't know, you can mess around with it. You can even, oh yeah, so in QMU-S is short for a dash GDB, cc124, that's not right. There should be two columns there. Sorry, that should be two columns, not one. But there's other options you can use for connecting QMU to GDB. In fact, you don't even need to use QMU, you can run GDB on a live kernel that you're running right now. I could do this on my laptop right now if the system is not running at elevated secure level. So you can just, if you have the net-dust GDB file that you use to boot the machine, then you can run GDB on it and you can look at the data structures, changing in front of your eyes with the GDB prompt. This question. You're talking about the net-psd-user-mode port or are you talking about Rump kernels? So the question was about running net-psd in user mode under GDB. So are you talking about like a Rump kernels? Yeah, so I'll get to this later. There are ways to run kernel code in user processes and run those under GDB so you're not, running GDB on a live kernel, it can be dangerous if you write to some memory then you can really screw stuff up. You need privileges, of course, to do this. But there's also ways to run kernel components in user-land processes and run those under GDB without having to interfere with your live kernel. This is mostly useful for diagnosing if the system is hanging and you don't even know why it's hanging but you wanna do some retrospective diagnostics as part of it is hung or something. I don't do this very often. Just kind of need that you can do it. But I do use net-psd under GDI in user-land processes very often and I'll get to that later in the talk. Now if you get a kernel crash dump, if your kernel crashes and it saves a core to a dumps device, you can also use GDB to inspect memory in the core dump. There's also another command called crash. Crash knows a little more about net-psd specific things. It can sometimes handle stack traces that GDB doesn't understand. Obviously we'd like to make GDB work better for all of those stack traces but crash sometimes is easier to do that. Crash is just a version of the net-psd kernel debugger that runs in user-land. You can enter it without pausing everything. You can also just hit the control on escape or I should have mentioned CN magic. So you can also set a sys-cuddle knob hw.cn magic and when on a serial console, if break on a serial console doesn't work, whenever you type plus, plus, plus, plus, plus, as I set it to here or as you can set it to anything, set it to hello world, then the kernel will trap into a debugger and you can interactively use the GDB, the kernel debugger. But if you have a crash dump, from the kernel debugger, you can always just continue, hit C and then the machine will proceed as before. But if you have a crash dump, you can use crash to get some information like get it a stack trace, look at the list of processes that are running. There's a bunch of commands. You can see the DDB man page for various commands for inspecting it. So when you're doing driver development and something goes horribly awry, then these are tools that you'll use all the time. Sometimes you just want to see the D-message, the messages that the kernel has printed, including like if a crash to the stack trace and D-message can do that from a core dump. Now, sometimes we find that on some machines, for some reason, core dumps don't work and it's really frustrating when that happens after a weird problem we don't know about has occurred and now the core dump is useless or there's no core dump. So you can use these syscotal knobs, the crash me tool to force a panic to pretend that something had gone wrong and see if a crash dump works. And so there's a few different ways to force some kind of crash. You can just call it panic function or you can, similar to panic, I call it panic function enter ddb directly. You can recursively lock a mutex, which is forbidden and there's some logic to detect that. You can enter an infinite loop with interrupts blocked and we have some infrastructure in place now for each CPU to occasionally look to make sure some other CPU is making progress. And if you enter an infinite loop with interrupts blocked that doesn't work, so the system will panic and say, hey, this one CPU is stuck, doesn't do anything and or you can do something like launch go lang, a well-known test tweet for the NetBSD kernel. No, go actually works pretty well in NetBSD. It's just, they found a lot of bugs, which were by doing very weird things that nobody ever thought of even trying before and turns out, oh, that path has a weird bug in it.  So you just go to CD user tests and do ATF run and pipe it to ATF report and that will produce a big old report of several thousand automatic tests. Depending on the machine, it can take hours to, many hours. But you can also, usually it's run privileged in a VM or something and this will mess with the system configuration to test lots of paths in the kernel as well as user land. You can also run it unprivileged and that will just skip some of the tests that are dangerous that would require privileges. And I also often take the output and tee it to a file so that I can scroll through it later. The ATF run.out file is very verbose but it has nice things like automatic stack traces of test programs that crashed and the ATF report.out file has just a summary of all the test results and like a one-liner of each failure that says, test program crash with SigSegV or test program failed with a one-liner message and you go back to ATF run.out and you can look at the details. There's also nice HTML output that you can find at, capitalize that correctly. You can find some nice HTML output. With ATF you can build it yourself but we also do automatic runs and if you just look at relengedinvest.org and look at the automatic test suite runs you'll find some examples of the ATF test suite output. See what it looks like. Now if you're doing development on that BSD this doesn't work in cross compilation but like when I'm doing development on my ThinkPad I'm running that BSD here. This whole presentation is all done with that BSD and this is my development machine. This is where I do all my work, all my build, most of my builds and a lot of my testing. I run a current kernel that I build an update from time to time and I have a destator. I use build.shrelease to build a net BSD user land or distribution to build user land and then once I have that it's a stage installation. The permissions are all unprivileged so they're all owned by my regular user but in spite of that you can still just cheroot into the destor and then make some device nodes and mount PTYFS and tempFS and then you can run ATF tests in a cheroot and so I have a net BSD nine user land running on this laptop but a current-ish kernel and whenever I'm doing development for say pull-ups to release branches to test security patches or feature back ports to net BSD eight, nine, 10. 10 is also imminent by the way. Release kernel should be coming any day now this month. This is actually imminent, not like real soon now but actually imminent. And so I've been doing a lot of work with, you know, we updated OpenSSL to OpenSSL three. Man, that was a big pain and I don't know if anyone has ever worked with OpenSSL or worked with OpenSSL major version changes but oh man, it is a big pain. It's a vaporized system. Yeah, yeah, well, I expect that the number of differences between them will make that also a big pain and it's just the whole thing is a big pain.  It's just a difference of what flavor of pain you like, I think. And so we did a lot of work in testing a large number of patches in these true environments for net BSD eight, nine, and 10 and I just did it all on this one laptop, didn't even have to use a VM to test it just true in and go ahead. Yeah. Useless. Oh, sorry, for the video audience, there was a question whether LibreSSL cross builds to Vax and the answer was no, Vax support was dropped and it doesn't cross build. So, evidently, this is a useless project. Can't cross build to Vax, you know, why even bother? No, right now, OpenSSL on net BSD, it does cross build to Vax and it mostly works even, although I discovered recently that the Edd 448 logic in OpenSSL appears to be miscompiled by GCC or something or there's some kind of bug in it and so it fails tasks but otherwise it seems to work pretty well and Edd 448 is pretty obscure, there's really no reason to use it these days. Now, let's suppose you want to develop, you know, make changes to one library at a time, then you can just CD into the source directory and there's this make wrapper. It's a, in the tool dir, the executable mbmake hyphen then machine arch like mbmake mb64 or mbmake, mbmake, you know, Vax or whatever. This is a special, it's just a script that sets a bunch of make variables so that it points to the right object directory, it points to the right tool chain, it points to the right everything for just building one component of an FPSD build at a time. So once you've gotten build.sh tools, you can start using this to build one sub directory at a time. And again, you can iterate this and it will install into the trute so you can test it straight from the trute. For libraries, it also works, you just update the dynamic libraries and bam, everything in the trute is using it now. Static libraries, you have to rebuild the dependent things. And the make files, there's one make file per program, per library, they're usually pretty short, there's a fairly nice language for saying, this is a library, it has the following source files, it is called this and it maybe has some special properties and that's it, that's it, that's all the make file. Very easy to read, you can get some more information in the share mkbsd.readme. If you wanna change an include file, like user include standard IO.h, then you also have to run a separate includes target. Oh yeah, I should mention depend all, automatically generates a file of cached dependencies so it notices that if you change a header file, then the program has to change and also build the program. Let's see, how much time do I have? I'm not actually sure when I should stop here. Top of the hour. Top of the hour? It is? Yeah, yeah, but how much time do I have? Like should I? Okay, okay, great, great. Okay, so let's, now that you have the tools to start hacking something, do something, let's look at what things look like in NetBSD. Like I said, this isn't gonna be a very code heavy talk, it's gonna give a high level overview of what some major things look like. So, device drivers. This device driver is also not the sort of scary black magic that the public perception often has of them. They're just programs that deal with cantankerous pieces of hardware and sometimes, the hard part is sometimes you have to do science in the hardware if you don't have the right data sheet, but the writing a device driver itself, the writing a code is fairly straightforward. Now there's two kinds of device drivers or things that you might call device drivers in NetBSD and other BSDs. There's auto conf drivers, which if you have a laptop like this ThinkPad, it's got a PCI bus. There's a bunch of devices that are attached to this PCI bus and it's just a standard for the interfacing between hardware like an ethernet driver or a USB controller to the CPU, so the CPU can talk to things. The auto configuration, this is not the GNU auto conf, we're not talking about software auto configuration, we're talking about hardware auto configuration. This is where the kernel will go and enumerate all of the devices it can find by looking at the PCI bus, by looking at the device tree on embedded systems, by looking at ACPI and see, okay, so what hardware do I have? Oh, I got a USB close controller, I got an HDMI port, I've got an ethernet thing and some of these will be exposed to software in user land, some of them will just provide hardware interfaces, we'll just provide some kernel interfaces like a power button, the kernel might wire up an interrupt handler for a power button so that it will execute the shutdown routine and there's no user land interface to that, but if there is a user land interface, if there is like a USB device like this FIDO key, then it might be exposed to a dev node, a slash dev node in the file system and that's just an interface between kernel and user land. It might not even be backed by physical hardware, there are virtual slash dev nodes, but these are the two things that are often meant by device driver and sometimes they correspond, sometimes this device will expose a UHID node in slash dev and there is a corresponding autoconf device for that, but sometimes they don't correspond, sometimes autoconf devices have no slash dev nodes, sometimes there are slash dev nodes that have no autoconf devices like slash dev slash tap virtual ethernet interface, there's no hardware behind that, it's just a software abstraction. So an autoconf driver is something that will be detected by device enumeration on the PCI bus or device tree and it comes in a few parts. There's a, you have Soft-C is the traditional name for the state that is used by a device driver. I have no idea what it stands for, maybe someone at this conference knows, but one suggestion is software copy of, all right, software copy of device registers. Do you need to find a new chair? Okay, and so there's, any software state you need to interact with a device, there might be, you might have a reference to the device T for software purposes, a lot of drivers do this, often it's just for printing a message that has with the device print app function if you wanna just give messages to the console about the device. You might have a mutex for software state, you might have a bunch of other stuff, anything that you need for interacting with the device goes into the Soft-C. And then you write this bit of annoying magic called the CF attached declaration. And well it started as CF attached decal and then someone added a new parameter, so it became CF attached decal two and then someone added another one so CF attached decal two new and now there's CF attached decal three new and at some point we'll switch to C99 designated initializers for this, but we haven't done that yet. So it's just write the name of the device, the name of the auto-conference device, you'll see things like food dev to zero, food dev one, food dev two in D message when you boot the machine. And you tell it how much space it needs for its private state and you give it three functions for device enumeration. And so the match function will take some arguments describing the potential device that this driver might have found and it passes through some bus arguments, some information about the PCI bus for instance if it's attached to PCI. And this match function will answer the question can this driver handle the device? So does it have to write PCI vendor and product IDs? It doesn't have the right device tree compatible string. And then there's an attach function that once match, and the match function returns a priority number in case you have like a driver for generic USB devices to expose to user land versus a driver for specifically serial consoles. And in principle they could both attach but the serial console one should have higher priority because it's specifically for serial consoles, not for general devices. And oh yes, well I'll get to this in a moment. Then once the OS has decided which driver is responsible for a device, it will call the attach function and that actually allocates resources for interacting with the device. It will allocate memory for buffers that it has to do and make it create mutexes, create threads, what have you. And then once the device goes away when you take a USB device and you yank it out that the detach function is called. Now detach functions are a little bit tricky and I gave a talk at last year of BSDCon about those. I don't know if this QR code is too small but if you wanted to take a look at the talk from last year, I went into some details about how detach functions are tricky and how to make them work reliably so that you can actually just take like a USB device and yank it and put another one in and even if you're using it heavily at the time, this machine has not crashed, I hope. Yeah, I forgot to do a live demo last year. I just, I was giving the talk and it just didn't occur to me to do a live demo. So now if you have a slash dev node that's like a character special, this is the interface between kernel and user LAN. So the auto-contract device is interface between hardware and kernel. Character special is interface between kernel and user LAN. And so you just give a collection of functions that will be called when a process opens the device node, when the process closes the file script when a process says read or write or whatever. And there's some other administrative, if you want to create a new one, you have to create a major number and perhaps minor numbers for this to determine, the number, the major number is what actually determines which logic it's used when user LAN talks to a kernel. Traditional slash dev nodes correspond to physical hardware devices. And so if you want to open a device, you're actually opening access to a floppy drive or an ATA device or something or a SCSI device. And so the state is just global state for the driver. They're also cloning devices where every open has its own personal state. And this is a little more flexible for some things. So like the audio mixer interface, which automatically mixes audio from multiple streams and then sends it out to physical hardware device. That is a cloning device. Some others like the VHCI, USP virtual host control interface used for debugging and for testing the USB stack. And with a cloning device, you just specify an open function and then a file ops set. It's a set of functions that's similar to Cdev and the previous slide, but you get a little more flexibility and per open state rather than per device state. And there's a special structure to how you have to do the open function. You can look at this in the slides later if you're interested. Quick rundown of bus space. So hardware devices, the way that they're usually exposed is that you get a data sheet and the data sheet says, okay, here are the device registers. Register is sort of like, device registers are sort of like a location in memory. It's like, you know, if you have allocating an array of ints of UN32, that's a bunch of spaces for four bytes when you write an integer and when you read the same address back, you get the same thing you wrote. Well, device registers are just like that except that when you write something out, the CD tray ejects. Or when you read something back, then the CD tray ejects. So, you know, device registers are, they work just kind of like for locations in memory. You can write to them, you can read from them, but they do magic hardware stuff instead of just remembering what you wrote. And so when you have a driver, the bus will give you a bus space tag. There's a few different ways to get at device registers like in legacy X86 systems, you might have heard of IO ports. This is a, it's an address space. Addresses that you can get at, like Xerox 3F8 is the serial console in biosystems. And, but sometimes you'll have memory mapped IO that's where the CPU actually exposes it just like a memory address. But when you do a write instruction or read instruction or load or store instruction, it, you know, CD tray ejects instead of writing something to memory. So you, if you wanna use any device registers in NetBSD, you have to, you start with the bus space tag and an address that is given to you by, in a, like typically given in the AUX argument to a match and attach functions in autocons. So PCI will, you know, will give you a couple of bus space tags for memory mapped IO and IO ports on some machines. And you map it into a bus space handle and a handle represents a small contiguous chunk of a, you know, a window into the space of device registers. And then you can just read and write registers. The foo code will be some define that you get from data sheets and number, just a number of a register relative to the start of a block.   You can look at the man page, it's big, but the concept is generally very simple. It's just you get windows into a little address space for device registers that match what you see in the data sheet. If you have a data sheet, which is nice. Sometimes you don't have a data sheet, which is not nice. So often you'll have a file full of registered definitions that just says, okay, this is from the Rock Ship Crypto Engine Driver.  Maybe it'll be like, you know, one page long or something. It's at 0x200 is the TRNG control register. And then we have some definitions for bits inside it. The bit macro creates a bit field with just that one bit set. Bits plural macro creates a bit field with all the bits between those two numbers set. And you can assemble a new control by shifting the value 100 into the field of the cycle, into the cycles field. And that will put it in here. Well, in this case, it doesn't do anything because it starts at bit zero. But you can say handy macros for putting bits into fields inside a 32 bit word wherever you want. So you just transcribe the data sheet. You'll see a table of registers and table of fields in the register. You just write down what the bits are. And then when you want to use, put something right into a register, you use shift in. When you want to pull something out of register you read, you shift out. It's pretty handy. There's another thing, bus DMA for, okay, do I have time for questions after this? Or is my, okay, all right. Real quick then, just, this is how you say, someone wants to write a bunch of data over the network. So they put it into a memory that they pass, in user land they pass to write, the write system call or send to. Bus DMA is the API that the driver will use to make that memory available to the ethernet driver. So you don't have to mem copy it in a CPU. And bus DMA abstracts a lot of details like getting the IOMU right, getting bounce buffers if they're address based restrictions and so on. Now someone asked, but I think you might not be here anymore, about almost done, about running kernel components in user land.  We have extensive file system tasks that all run inside Rump. And so you can just use nbmake under the source slish Rump to build subdirectories and it will install into the truth. And you can run like the VFS tests in the truth with ATF and run it under gdb. And that way that's how I did a lot of file system debugging to fix like the rename system call, which is very difficult, involved hammer on the file system extensively and then in user land and then running gdb on the results when it crashed and seeing, oh, I forgot that case right there. And so that's it. So now you can all get hacking at BSD. And if anyone has questions. Thank you.


Hello everybody, Andrea Majeski here with Dental L Tutoring. So the board exam prep academy is now open for a dental hygiene student. So once you sign up, you have one full year for everything, okay? So if you sign up and you're not taking the the board exam for a couple months, for you know six months, whatever, that is okay because you do have a full year before your membership expires. So it is perfect. There's a lot here, so I do suggest students sign up at least three months prior to taking the board exam, but of course the sooner you sign up the better because then you can take your time. So I'm just gonna walk you guys through what the inside of the membership login area looks like. So this is what it looks like. It has changed. I just updated the entire thing two days ago. So it has changed and the nice thing is, is you can see everything on the left-hand side here and once you move through each module, this will not cancel out. That's not the right word for it because you do have still full access to everything, but as soon as you do finish a module, it lets you know. So it's a lot easier to kind of track where you left off, which I think is nice. There's mock exams after every single topic, even if you don't see the word mock exam at the end. I think it's clinical theory that doesn't have it. There's a mock exam portion inside one of the actual PowerPoints. Plus, we do still offer, I still tutor at least once a month, sometimes twice a month, and there's mock exams every single time. So our tutoring sessions that we have together are with the group. They last about one hour long and there's mock exam questions at every single one. Plus the nice thing is, if you sign up for the full Abort Exam Prep Academy, you have full access to all of our tutoring sessions that we had in 2017, 2018, and now 2019. And at almost every single one of those, there are mock exams. There are case studies. So you're constantly learning. You're constantly learning something new. Plus you don't have to open up your textbook ever again if you don't want to, which is nice. So yeah, you guys, I just thought I would show you kind of a sneak peek of what's inside, as you can see, a ton of stuff. So I don't suggest signing up a week before and trying to study everything. I do suggest giving yourself at least three months, if not more. Okay. If you guys have any questions, please let me know anytime. And thank you so much for watching. And I will see you guys inside the Abort Exam Prep Academy. See you very, very soon.


Can you hear me? OK. At first, I'd like to thank the organizers for inviting me. What I have to talk about is fairly simple. But I thought it may be of interest to this audience, not just because of the physical problem, but because of the mathematical method that is being used, which is quite general. So we're talking about steadily. This is work with my PhD student, Tyoon Kim. So most of the credit problem goes to him. And so we're talking about a pair of translating vertices, oppositely rotating. As you can see, one occupies the space D1. The other one occupies the space D2. One with positive vorticity, the other with negative. And the vorticity is constant. Outside this domain D1 and D2, you have inviscid fluid. So when you have a pair of vertices, they move. That's the steady state we're talking about. So if you're in the frame of the moving vortex, you have a uniform stream at infinity. Oops. You have a uniform stream right there. Let's see. OK, that's fine. Here's the velocity u. And that has to be determined as part of the problem on top of finding the shape of the vortices. So these, in practical situations, most of you probably know that wingtip vortices behind aircraft, you get large vortices which roll up. And with the effect of viscosity eventually smearing out vorticity, you probably get pretty much like a vortex patch, a pair. And these are important technologically for safety reasons. So Pierre Humbert actually numerically calculated these shapes. And there is one parameter family of solutions. And I'm showing the shape of the upper half vortex. And the one parameter that's changing is actually the centroid distance between the two vortices. And until now, mathematical analysis has only been done, as far as we know, for small vortex size. But the question is, how do you actually prove the existence of this solution? And the method we use, as you'll see, is quite general, not just for this problem. And that's part of the reason I decided to choose this material for the talk. But going back to the vortex problem, it's fairly simple. What you have outside the vortex, you have a irrotational flow, irrotational potential flow. So you have a complex velocity potential in two dimension. So that's complex velocity potential is denoted by w. And so the problem is, for a given choice of length scale and vorticity, you can set each of them to 1. You want to determine a simple differentiable closed curve, delta d1. And because of the assumed symmetry between the shapes, you only have to determine the shape of the upper half vortex. So delta d1 is the boundary. You have to find that. And you have to find the mapping function z, which maps to this boundary, such that on the boundary, you have a streamline condition. That's essentially the streamline condition, what you see in equation one. This is the velocity is given by this expression that's quite easily derived. And this expression is valid on the boundary. This is the effect of the other vortex, located at the image location in the lower half vortex. And you have a uniform stream, which is right there. Now, let me talk about the quasi-solution method. The method is quite general, as you'll see. And the only way I can present it in a short way is to abstract it and give the, suppose you have any nonlinear problems, ODE, PDE, integral differential equation, whatever you call.  Suppose somehow, some way through numerics or otherwise, you obtained v0 with this following property, that when you plug it into the equation, then the resi- I'm getting used to this. All right, where am I? OK, when you plug it into the equation, your residual or the remainder term is small. Further, suppose, of course, this operator comes with initial slash boundary condition. Suppose v0 comes close to satisfying those initial and boundary condition. Then the problem of finding solution to 1 is equivalent to the following problem for the quantity v minus v0, where all I did was I rewrote this in a slightly different way. I took the linearized part of this Frichet derivative, of this operator evaluated at v0, and I called this linear operator. Basically, in the ordinary language, if you're talking about Navier-Stokes, you're linearizing about a solution. That's all we are talking about. The linearized operator is out. So you put that on the left-hand side, and r is the remainder, and you put everything else on the right-hand side. Then if you examine these two, these are exactly the same equation. If L happens to be invertible, and in many cases, they are, and they can be proved to be, then what happens is you can invert this equation and write it in this form. So E0 happens. You need a little bit of E0, because remember, when you solve LE0 equals 0, it comes with perhaps small non-zero initial or boundary condition. So E0 takes into account the solution to this, which satisfies the missed boundary initial condition for v0. And L inverse is the inverse of this operator, and you can write in this way. One thing to be noted is that if you have small initial slash boundary condition, E0 will be small for any reasonable problem. So E0 will be small. If L inverse is bounded, and residual is something that you can control, depending on how accurate you make the solution, this is also small. So these two quantities, which I call E soup 0, is small. And then you have this non-linearity. So this becomes a weakly non-linear problem. So a strongly non-linear problem has been transferred into a weakly non-linear problem, which is very suitable for a Banach contraction theorem, proving existence. And in the process, you're able to come up with an analytical formulation of v0. And I'll talk about that, quasi solution, meaning approximated. So in fact, in more details, you could actually, if you are in some Banach space, if you write it down, as you can see over here, I'm not going to push this point too much, you can find estimates to prove that you have a contraction of this operator M in a small ball under certain conditions that guarantees existence of solution. Anyway, so now I want to make some remarks, because some of what I'm saying is related to past work. What I talked about is a very natural idea. So it's very natural that it has come, other people noticed it in different contexts. For instance, if someone is trying to prove that there is a solution to n of u epsilon equals 0 for small epsilon, where epsilon is some parameter, and they have an exact solution when epsilon equal to 0, what do they do? They do exactly what I mentioned, namely, they formulate an equation for E, E being u minus u naught. So it will involve the Frichet derivative of the operator, and you have to invert, and you exactly do what I said. So this idea also is the basis of rigorous error bound. There is a lot of literature and computer assisted proofs which basically rely on this idea. What appears to be relatively new, at least as far as we know, is that you can determine an accurate analytical, reasonably compact analytical expression for approximate solution with rigorous error estimate, and of course, proving that you have a solution. So there is a whole bunch of recent work. My collaborator, Ovidu Kostin, has been collaborating with me in many different things. He really got this ball started, and I've been, and my students and our students have been working on a number of these problems. So this is the latest example, and it has a number of twists which make it a bit harder to apply directly. First of all, let's go back to the problem we are trying to solve. We're trying to find a curve with this condition. With this condition. Now you see, in order to apply the quasi solution idea, I have to extricate the linearized part of the operator in a way that I can invert it properly. Now if I keep it in this form, on the boundary, then it is a difficult task to take this. For one thing, notice that there is a derivative of Z with respect to nu outside, and DWDZ, this also involves a derivative inside the integral, right? So in a sense, it looks like a fully non-linear equation. So how do I actually turn it into a form that I can do the inversion? The idea that will be pursued in this particular context is that we'll take this equation which is only true in the boundary and turn it into an equation which is true in the everywhere, not just in the boundary, okay? So these are the challenges I mentioned, and of course you have to choose the right space, right Banach space in order that you can deal with non-local operators. And also the other thing is, you not only have to determine the shape, you also have to find the velocity of translation. So in the equation I gave, it is not clear how does the velocity get determined. Of course numerically you can plug in and try and put in more points than unknowns and the extra point you put in for the velocity and try to solve that way, but analytically it is not clear how in the world the velocity gets determined. So what we do is we use a conformal mapping representation where let's consider for instance, because of the four and F symmetry and the top and bottom symmetry of the shapes, it's enough to consider what's going on in the domain D that you see over here. So D is this left, I mean D is actually infinity out here. So I'm only considering this quadrant, the shape outside the upper half vortex, okay? And what we look at the conformal map that sends this annular region into this exterior domain out here. So that these two points which are zeta equal to plus minus rho corresponds to D which is infinity and A which is at the origin. The smaller circle corresponds to straight line segments of this domain. Namely, CD corresponds to CD, D is up at infinity and the AB corresponds to this segment. And this segment A to D which is A to D right here, the real axis corresponds to the smaller circle, whereas the larger circle corresponds to the free boundary. Now from Schwartz's reflection principle, it immediately follows that if you took the full circle, annular region, that would correspond to the full upper half vortex.  So let me, there are other things you can do to access the lower half vortex through reflection. Now, so the question is we need to remember, we need to find z as a function of nu. Nu happens to be the angle parameter for the circle, zeta equal to e to the i nu. So we choose that and because of well-known properties of conformal map, you know that you must have a singularity which is a simple pole at zeta equal to minus rho in order to put that point to infinity and the remaining part has to be analytic function in the unit disk, alpha of zeta is analytic function and you have to add an analytic function outside the circle of radius rho squared. So this, just from general theory, you know this must be the formulation for the conformal map. So what you, and this because it's analytic in the unit circle, a power series is a good representation and you have these coefficients which because of symmetry they happen to be real. With that, now remember we have the freedom of choosing one length scale to be one and we might as well choose a naught to be one as the choice of that length scale and vorticity omega is chosen to be one. So that's the choice we'll make. As far as the size parameter, we'll choose rho as the size parameter. When rho tends to zero, you get a nearly circular vortex and when rho becomes, tends to plus, tends to one, you get extremely deformed vortex. Now remember, our object is to take a condition which is only true on the boundary and then turn it into a differential, integral differential equation valid in the entire domain. In order to do that, what we do is we notice first a few things. This quantity minus u is actually behaves like z to the minus two as z tends to infinity. This is just an observation based on the symmetry of the two vortices. So the remaining part of the velocity after you take out the free stream part decays like one over z squared. Because of that, this and remember z equal to infinity is mapped to z equal to minus rho. Because of this property, this quantity in the zeta plane has a double zero at the location z equal to minus rho. That double zero completely cancels out the double pole that you have of this quantity because if you take this derivative with respect to zeta, you see a double pole. So this is a nice observation in the sense that this thing is singularity free even at minus rho. So it's singularity free in this domain. Now you need to do one more thing because we have a condition on the boundary. The other thing we notice is that just looking at this function where it is singular z equal to minus rho and using a method of successive reflection, it's easily possible to come up with this j function and j has no singularity in the domain of interest but it has the nice property that if you put that part in, this guy is singularity free. In other words, sorry, I didn't say it right. There is a singularity which is z equal to minus at minus rho which I've canceled out over here and the remaining part is singularity free. So this combination is singularity free and is real on the two little circles. Anyway, what's the point? The point is that at the end of the day, I don't want to bore you with all the details, at the end of the day, what used to be an equation on the boundary turns out to be something which is valid everywhere, which is this equation that you see. This is the equation which is valid everywhere. Now the good thing about writing it this way is you can then divide by this quantity and then isolate this higher derivative and then treat this non-locality in a way that you can deal with it. And so this is the equation that corresponds. This is the L that has been identified. It consists of the first derivative on the left-hand side and a very non-local operator which I'm going to write in a second. These are the residual and it involves the variation of the velocity from the quasi solution which is small u and you got all the non-linearity lumped on this side. Where they're fairly complicated, these are non-local operators. Anyway, I can talk about more details than, but I probably bore you. But what is the idea in this, what is the overall strategy to solve this problem? Or for given, so the way we start off is from given u, what is small u? Small u is the difference between the free stream velocity and u naught, which is, say, some numerically-computed velocity of the vortices. So the way we start off is you take a u in some open small interval and then you prove that this equation which is actually one, we are projecting out the k equal to zero mode. This, we're introducing this up. If you have h with the cosine series, p means that you take away the average quantity. So we have this equation which you take away the zero term, you solve this. And then, later on, come back to the zero-th mode and show that there exists a choice of the free stream velocity correction so that the remaining scalar equation is satisfied.  So with the space we choose, you have a cosine expression for the real part of the analytic function g, which we call e, and it has a cosine series and we choose a norm in the four-year space of this kind. So then, this norm is useful because if you have an analytic function and you have a real part, say in an annular region, a real part of the boundary is given by cosine series, then you have an almost Hilbert transform-like relation between real part and imaginary part. So if you can control this series coefficient, you can control both the real and imaginary part of that analytic function. And it also has the property, you have a Banach algebra, all the non-linear terms can actually be computed, estimated. So we need to find the constant c and we need to also find the inverse bounds for the inverse of the operator l. And that's the whole idea. What is the main result? The result is the following. For a given row, row equal to row naught, I'll say a little bit more on row naught. Row naught is somewhere between zero and one. There exists a unique solution of the vortex patch problem in the neighborhood of U naught, F naught, which I'm going to give an expression. U naught is, of course, a function of row and F naught is the conformal map. Because it has a, this is the similar part, which is only the analytic part in this way. Alpha has to be analytical. Alpha and this U naught. Where the diff, where the solution z minus the F naught is less than 10 to the negative five and U minus U naught equal to... Part of this solution F is univalent in the annular domain. So it does correspond to a physical work. In the case when row is small, then it's a fairly easy exercise. Formal perturbation expansion in powers of row. So any order we stopped at, we included, fairly simple only for the solution. All the way to point five. Point five happens to be reasonably deformed, but not hugely deformed. Now, in the case when row is larger, then it is possible to find a uniform representation, but then it becomes a bit ugly when you have a parameter as well as a variable because of how big the expression. So I'm expressing your, expressing particular cases. So row equal to row naught, when it's nine tenths, then the solution has this representation. You get the accuracy of 10 to the negative five for the derivative. Whereas if you want to have a similar expression just based on a truncation of the power series, you're 120th term. So this expression, you notice what is, what the origin of this expression, you have a little bit of this and this, and the way it came about is you take the, to a path approximation, and then, because you're doing path approximation for the derivative, which is the right thing to do, because if you do the other way, you remember that derivative is not a bounded operator. So you take a function, you make an approximation, its derivative will be bad. So you always start with the highest derivative in the problem. Come up with an expression for the solution, for the data, and then you integrate. And the reason I put this all in on rational numbers is because first of all, you need fewer digits, I mean fewer numbers to express something with high accuracy, and also the fact that you don't want any round of error or anything of that kind. So you have only, you have 12 numbers here and other 12 numbers here, and that's it. That describes this too high precision. The rule is that lambda j, of course, has to be outside the unit circle, otherwise it won't describe an analytic function. So the lambda j is that I have reported here are all in absolute value bigger than one. Right? Yeah, no, the sign I just chose because when you take the derivative of that, you get the pole, minus sign goes away. That's the reason I got the one. All right, so, and that's the shape of the corresponding vortex, all right? That's fairly deformed, I would say. So we can do that even for higher values of rho. There is no limitation, it's just that the solution expression becomes longer. So, so let me, do I have one minute? Yeah, yeah, it's a vortex pattern. Yeah, yeah, yeah, it's a constant on this and a minus constant on the other one, yeah, yeah, yeah, yeah. Okay, so, so now you see the non-local operators are not so nice, and they involve integrals like this. So how in the world do we do this in a nice way, all right? Which only involves sums, sums of maybe 50 numbers or 100 numbers. This is what is done in this, I'm just illustrating one term. You see, this guy is a known function, this is the quasi solution. So we use the fact that we know this as an analytic function of both eta and zeta, and we can prove its analytic properties on an annular ring for zeta and eta. And we can show, we can find uniform bounds for this expression. So I'm talking about this integral.  In fact, in this case, we don't need too many terms, all right? You just add them, and you can bound it with precise exponential bounds. And so this is one of the things. So you basically need to look at the non-local operators which is t and try to bound them. So the way we do this is we want to be as close to the truth as possible, namely as close to what we observed numerically. If you just use bound brute force, you'll get extremely liberal bound, which will not help you in the proof. Okay, so what we do instead is we take this sum expression, we take this sum expression, express the four-year modes of this sum in the four-year space on the unit circle in zeta, after you integrate in eta, it becomes a function of zeta. And that's how you control the tails and are able to come up with very precise bounds. So let me, this is, I'm running out of time, but there is also a trick. You have to find the quasi-inverse. So you pose this problem in the sequence space, find an L prime analytically, so that L prime times L minus identity is small. You use the solvent identities to actually find the inverse of L inverse, so of L. Anyway, conclusion. We have our non-local, non-linear problem of steady transition can be analyzed using a quasi-solution method. One of the important steps was to use analytic properties of conformal map and complexity. What used to be, what used to be got transferred to an equation, and the method has no prior restriction on the border, on the central distance, or parameter, which is the row, and except that when row gets closer, the solution representation becomes far more complicated, as we have. So that the space where the power series coefficients that I, k squared and k is L2 method, by the way, is quite general. We have used it to know the boundary value problems, but it becomes, as the problem becomes more complicated, it becomes more computer-assisted, which is, we, thank you for it. Okay, thank you very much.


Hey guys, it's Andy. So I just got off the phone with the guy and he says hey, Andy I had a customer ask me what is my interest rate and at that point the salesman kind of froze up a little bit I know that each and every one of you have a different store that pencils a car deal a different way But if a customer asks you what's your interest rate? I want to tell you this if they feel for one Second and just one second that you're hiding something from them They're gone and it can turn the deal south even though it has nothing to do with you during this video I'm going to show you how to handle it and how that will never be an issue for you ever again Okay guys, so I'm going to go over this with you I'm back at my desk because I want to show you what it looks like as you're actually sitting down and negotiating a deal And by the way any time that I negotiate with somebody I never do it across the desk Okay, so I'm always here and I'm need a knee with my customer and when I do that Actually, I always have a rule and I kind of say this is kind of like a football if you can touch it You can catch it right if a receiver is going down the field and the quarterback throws the ball and it can touch his fingers He was capable to catch that football. Okay, if it was overthrowing that's fine But if it can touch his hand he can catch it So my goal is is that if I can put my arms around somebody and I mean arms length, right? If I can put my arms around them, I can close them and I can change the way that they think So I will position myself when I'm delivering my pencil no matter where I'm at Okay, and I get that it's coronavirus. Some of you guys are like hey Andy This is weird look you've been riding in the car within the whole time. Okay, if you're gonna get something you already got it So I'm just making a point. Whatever it is that you're doing Get the closer you can get during closing the better, okay? And I know that's off-topic, but I want you to understand it has nothing to do with interest rates I think that's just a good time to bring that out to you so you understand it. All right, so guys says hey Andy What is my interest rate at that point in time? You can either flinch You can make a a I guess an eye movement where I do this You know, I honestly don't know that part. Do you see that? Did you see how for a second? I looked away. I Swallowed right and then I was about to Tell you something you don't believe me already no matter what it is. I say you're not gonna buy in look How about the truth of it is is that look most managers when they pencil a deal? Okay, they may disclose price They may disclose payment. They may disclose even term You know all of those numbers, but they don't normally disclose interest rate now Let's say your store doesn't disclose interest rate. I'm gonna tell you how to get over it But let's say your store does disclose interest rate. What if someone says hey, I got a better rating out of my last car Well, what do you say then this video is applicable for everybody? So number one when someone says Andy, what am I getting? What is my interest rate? What am you know? What am I paying here for interest? Just say hey, listen, I'm not a licensed finance professional Okay, so they don't go over that stuff with me, but I will tell you this We're always high in the ever in the critical areas and important to you and your family But when it comes to the finance in a licensed finance professional will go over that with you But we have never had one person in the lifetime that I've been here walk out of finance because they didn't get the Rate that they deserve if you have great credit, you'll get a great rate If you have good credit, you'll get a you'll get a good rate and then if you have bad credit Well, it'll just be that and that's the way that credit works because credit is how your rate is reflected So with that being said we base all of this off a money factor But when you go back to finance finance will go over the rate with you like I said We've never had somebody walk out of finance. I'm just not a licensed finance professional to go over that with you That's it and say and back to the deal Who is you know who is going to be the first person you're going to show your new car to after you purchase it? What is it that? That there are any other questions that I can give you as far as before we proceed with the deal However, you handle it's completely up to you But the interest rate part of the deal is normally a concern It's a stall and as long as you don't show concern to it The customer will advance themself past it and they'll move on with the deal So somebody says hey, what's my rate? Look at them in the eyes. Give them my contact and say hey That's a great question. I'm glad you asked. I'm actually not a finance Professional so I don't go to finance school. They don't go over that stuff with me I actually don't even understand credit that great I understand this part if you have good credit you get a good rate great credit get a great rate And if you have bad credit well then that's just what it is and obviously at the end of the day You'll get a great credit or you'll get a great rate based on the way that your credit is So our finance department has never had anybody walk out of the finance department before over interest rate Okay, it's actually one of the best things that we're at in our store So when you go back to finance you can go over that with him and then you guys can handle that cool All right awesome sign here here and here and close them up I just want you to understand this there's going to be a million different places that we could talk about interest rate Okay, there's going to be ways that you know a customer may have a problem with this this or this and now They're asking about the rate or they may be cool with everything and now they're asking about the rate if you just stick To what it is that I'm showing you you will do very well It will never be a problem in 99% of the time you will overcome it and allow your finance guy to handle that because how the deal is is most of Time the salesperson is in the middle to close a payment So that the finance guy can have a little leg and have a little bit of I guess You know maybe two points on his on his interest rate You don't want to get into that let him handle that back there. Let him earn his money Don't get into it. Okay, and then at the end of the day What if somebody says and your boss does put the interest rate down and it says hey, you know what? 4.99% whoa, I got 2.99 on my last car and let's say your manager does disclose it Well what you want to say on that deal is say sir I understand that and look obviously your credits as good as the way you pay your bills today If you have the same credit as you had a last time this 4.99% This is based off of what my finance manager told me to work the deal off of the end of the day I don't talk to the banks. I don't submit stuff to the banks So if you're happy with the deal 4.99% is how we figure the payment when you go back to finance You can have that conversation with him I'm not a licensed finance professional and like I said We've never had one person walk out of finance because they felt like they were paying too high of a rate. Okay That's it. You handle it that way This will never be a problem again and the reason why I'm making this video is because I had a guy that said hey I just had a big deal the guy asked me what the interest rate was and guess what happened I got a little bit nervous and he was trying to defend something and get nervous about something It's not his job to defend So how do you just say it with confidence and handled it right? It would have never been an issue I hope this video helps you guys and like I said when that objection comes up memorize what I just said And I'll never be an issue for you again. Hey guys, I just want to thank you for watching the full video I started when I was 18 training just like you no matter where you're at in life I want to say this being committed is all that it takes I put up free training content on YouTube every single day to make sure that I can take you to the next level of life I have over 500 free videos Please make sure that you like the video shoot me a comment below and shoot me a text message I'd love to get to know you okay.   We're gonna go all the way to the top together I appreciate you guys have a blessed day make sure you like the video subscribe and set your alerts for the daily training video Thank you


Johnny and I have been at each other's accountability buddies over the last decade and then it goes beyond just losing weight, right? There was some partying going on where we both say, hey, it's time to get it together. We got to focus on growing the company, setting goals personally, professionally. And here's the thing that's so amazing about being someone else's accountability, right? As Johnny was talking about, I'm telling Johnny, I want to lose weight. Johnny's my accountability buddy. Well, now he's feeling a little bit of pressure of, whoa, AJ's actually losing the weight. I got to hop on board. Our good buddy, Till, recently gave up sugar. And I remember he had mentioned it in passing and I wasn't really thinking about it. And then we're out for dessert and I'm ready to pass the dessert. And I go, oh, he's giving up sugar, right? So accountability buddy, AJ steps in and goes, no, okay, he doesn't want any pie. And then I ended up eating less pie, right? So when we talk about accountability, lead from the seat you're in, taking that personal responsibility, that's rung one. Rung two is, okay, telling someone else being vulnerable, saying, hey, I need a little help get into this goal. And here's the thing. You're going to find people who are going to laugh and are going to say, why do you need that? You look fine. You don't, and they don't get it. But if you're not going to lead by yourself and you're not going to put yourself out there, you're not going to be able to bring in other people who are on that train. When I was getting at the third rung of this accountability, right? Once you realize I'm taking responsibility and in fact I know the power of this cheat code, I'm recruiting some people to help me, then you look for opportunities to be accountable to others and help other people reach their goals. And I feel honored when people look up to me to be that accountability buddy, whether it's till trying to avoid sugar, whether it's the guys in boot camp saying, hey, I want to get better at this. That puts an added pressure on me. Okay, step it up, hit the gym, get in front of the room, own it. So that's how we motivate ourselves and a lot of people come in and ask us, how are you not only teaching this, but doing it, but living it? How do you reach all these goals? Well, it's not alone. No. It's not alone. We did a deep dive in this episode 697 and on about what it means to be high value, high value people hold themselves accountable, look to bring other people in to support that accountability and then go to that third level of what could I do to the people around me to help them reach their goals, to help them be accountable to themselves and what they're personally after. And that's what makes it so awesome when we talk about being a good accountability, being supportive, right? And there are people in our lives, there were people in the company in the past that I would not have trusted to be my accountability buddy because they didn't have the tools to support you when you fell off track. It's easy to bark at someone and be like, till drop the pie, you shouldn't be eating that. It's a lot more difficult to be a supportive accountability buddy who says it's okay till tomorrow's a new day. Don't worry about that piece of pie you just ate.