Thank you, Sivan. It's good to be back at a BSD conference after about 10 years. So glad to be here and meet familiar faces and new faces in person. This talk is more or less identical to the talk that my co-programmer, Santosh Raju presented at Asia BSDCon earlier this year. And we've done a little bit more work on it, but nothing to show for it that we've published. So I'll just stick to the baseline of the talk. And essentially what I'm hoping to do with this talk is not really to present the guts of the development cycle or the experience, but rather to kind of share the opportunity that I realized after 10 years of kernel programming that a certain methodology or approach to coding can actually bring to kernel programming. And I feel like because this code was quite intrusive and at the deepest part of the VM subsystem, typically you'd expect a lot of chaos because NABSD's VM powers about I think it's about 11 CPU architectures and about 70 platforms. So it's really like a huge amount of dependencies and a lot of things can go wrong. So really most of the technical details are in the man pages. We won't cover that, but I just wanted to kind of go over the broad sort of storyline with the hope that I'm not preaching to the choir, and actually there are people from other BSDs and also diversity of port maintainers in here. So it's a little bit of evangelism as well if you bear with me. So this is the background. The background is that all the current BSDs have a very simple implementation for keeping track of RAM on the machine. Obviously it maps to a very simple static array. And this is the famous VM FISSEGMAX hash defined that has come up for discussion when large amounts of RAM show up or in the X86 world the EA20 map is very fragmented and then things happen. And this is obviously from a really long time ago when RAM was not so much and the layouts were not as complicated as they are on modern machines. And so the discussion about this or the idea for this project came up from the need for virtual machines to have memory added and removed dynamically at runtime. And right now we have a balloon driver which is a hack to kind of remove allocated memory from a virtual machine. But there's no way to put more in for net BSD at least and for the other BSDs I believe. So we said okay how do we take on this problem this is really you know the tentacles go really all over the place it's really hard to you know pull things out and separate them how where do we start you know I mean there's there's VM FISMEM is a global variable and it's strewn all over the place and it's used you know by every bit of the VM code everywhere. So the first job obviously was not to try and do any hot logging but to clean up. And so we said okay we're you know we want to use something more dynamic than an array but we want to clean up so that we have a hold on sort of you know the complexity otherwise it just explodes. So we said okay we'll clean it up and so that's when you know the idealist you know shows up and okay so now we've got a chance for a brand new API so I went away and designed this massive API with like tags and cache attributes and everything and then I had it all spec'd out we wrote ATF tests for it and then we ran it by people who actually had a lot of experience designing and building these things and they basically came back and said sorry I mean this looks interesting but so and we hadn't you know it hadn't got in the kernel and so Chuck Silver was really helpful with a lot of feedback he helped with the initial integration of UVM the virtual memory manager for NetBSD into the kernel and so you know idealism gave way to sort of pragmatism and we decided to kind of work the other way so we thought okay we'll try and put what exists and what we've cleaned up to kind of interface with the rest of the kernel through a simpler API and so that would mean that we'd separate out the existing API and expose it via header files and hide everything else in file scope and then most importantly have a way to test unit test all these functions. This is the first time in I think maybe 30 years since the BSD projects have begun that actually these functions were tested actually using unit tests so so so it was you know it's kind of interesting and and we yeah so so a lot of the a lot of the detail was basically trying to get this situation going so like clean up the code you know sort them into separate files and then try and organize getting the specific functions unit tested in a disciplined manner and we made the choice to kind of do this first so like this was in the live current tree so you know because you can you can go away on a limb and try and kind of you know create APIs and then everything breaks when you try and integrate so we use the approach that before we try and unit test everything we'll try and do the reorganization in the live source in a way that doesn't change functionality but then we can also sort of put the tests on top of them and so we initially got UVM 5 second dot c and dot h the code reorg into current before the tests were in place and now it was in a position where we could start looking at the unit tests and Suntouch actually did this entire project on a windows laptop with Sigwin so that's testament the FESD code cleanliness so so yeah I mean so the reorganization didn't really affect the ability for NBSD to boot and you know life went on as usual in current we didn't we didn't mess with that but then this is where sort of the modifications now started getting interesting so we essentially figured out how to now now everything everything to do with the array management the segment array management went into that file UVM 5 sec dot c and so now you've got like a little module that you can actually test and so we literally did a hash include UVM 5 sec dot c inside of a userland you know test rig and so now we had enough to compile a separate userland binary which then we could run unit tests on and the UVM 5 sec dot c that we're using was not a copy it was a live copy that was in the kernel so you know everything that we were testing was already in the kernel but we were testing it completely in userland which was pretty neat in that process obviously you know you have to export a subset of the kernel API to the to userland romp does this by namespace rehashing and so on and so forth if people are familiar with romp on NBSD but this is much simpler you know this this code doesn't really use you know a lot of API infrastructure so you know essentially it was came in malloc being stubbed by malloc things like that so it's fairly straightforward and so so so now we could focus on the guts of the of the move from you know static array to RB tree and so we said okay well you know what are the other options and we went through the iterations of that and and essentially boiled down the decision about RB trees boiled down to you know what was available that was easiest to use and gave us the best promise performance and literally you know NBSD's RB tree implementation was right there waiting for us to use it and it made a technical sense because the previous code had I mean an array if you want to insert you know things into an array you have to copy over you know bits of data and then insert and so there's a lot of overhead and so there were a couple of algorithms using hash defines so you could you know there was a hash define for binary searching for specific items in the array or for random search and so on and so there were three options and we said well you know all of that goes away and the RB tree takes care of that and so we just have one there's no compile time option now for searching in this array of segments of memory segments so there are no multiple strategies for maintaining segments and obviously less code clutter and yeah there were a couple of other options Q is anyway not a not an option because it was the worst of both worlds but yeah RB tree was there and we thought we'd go with it and we also thought we'll do some performance analysis from user space because hey that's cool so we'll come to that at the end some of the details so essentially the thing that's interesting for the rest of the VM system is you know what does this bit of what is this page offset in RAM point to what the VM page structure basically so I want to look given a given a physical address I want to have the pointer to the data structure that represents that page of memory that's essentially what the what this array gives you and so we essentially abstracted the idea of the index into the segment with a sort of abstract sort of data structure called UVM physique underscore T but initially we before we did that we ensure that this abstraction was sitting on top of the array itself and so so yeah I mean I went over this again it was quite interesting it was a huge number of architectures to port to so yeah so some of the challenges here and then obviously the performance implications so we look at that later so we introduced you know certain sets of abstraction so as you can see previously you had global variables being you know used outside of the module and then you would have sort of iteration through a macro and then we kind of hit everything behind explicit function calls and it can be argued that you know this is more less performance but then the setup and many of these loops are actually run only at boot time or during hot plug itself but when it comes to actually searching for things in when the system is running you know so this is not really so much of a hot path so we thought we'll you know we'll run with it and then we'll see how it goes in terms of performance this function came up because it was interesting to understand what a valid segment was a lot of systems code sort of ad hoc puts in a placeholder value like minus one or you know null or something to signify that you know an entry is invalid and it got interesting because we had to make this explicit and say okay what does this index point to is this you know is this a valid address or is it a valid index and why is it a valid index or not so we wanted to pull out that assumption in terms of tests so literally the approach was if there's anything that we had in doubt in terms of semantics or state we'd write a test for it and make it explicit and this was this was really useful because I think this kind of took care of the idea of the hero that we got that we got introduced to this morning because the hero can be reduced to ATF tests I think this is my discovery so you know a lot of the heroism is holding the state in your head and you know being able to process that data and make a call on design but I feel like if you can make it explicit in these tests and you can automate the open source hero into into tests by and large I'm not making this claim but at least from my own ego it was interesting to you know I became less relevant basically so so we you know it goes to doesn't need to be mentioned that we did quite a bit of test coverage and all the tests you know they're live tested using Anita in the NPSD build system so these are part of the formal test rig for NPSD and essentially what we did was we got the tests running so that the the objective was for the semantics and the state information to be exported explicitly in these tests and we made sure that the current implementation could be tested rigorously first before we touched it with arbitrary we said we want the current implementation to be you know running under these tests and and and so yeah and so sorry yeah we had some interesting situation so the original idea for VMFISSEG the array was explicitly meant for boot time so you boot up you populate your array after machine dependent code passes through your memory hardware dependent memory tables and then you populate the array and then that's it you don't touch it afterwards but we were interested obviously in you know being able to plug in new memory and pull out bits of existing memory and so immediately that brings a lot of interesting issues especially fragmentation and how to manage stuff and in the process of this integration you know there were certain assumptions like for example page first load was just expected to succeed because if you couldn't you know if you couldn't register a physical page during boot time then that's like something serious is wrong so you panic basically and so that was the assumption in the boot code it was avoid uvm page first load well that's not great for testing because we need to know if this function actually you know did the right thing or not and the function we should have some way to return that information so we essentially edited the function you know to return what happened to that load and so there were similar kinds of things that were you know modifications that we that we did so yeah so sorry i'm speaking i'm going ahead of myself here but essentially again just you know repeat that reiterate that point it was to make you know the test framework pull out all these assumptions that were inside of programmers heads you know and just you know put it down in writing and make it as explicit as possible um so um so so here's here's a like a slightly subtle one um we we kept getting this failure for get previous segment so given uh an array offset in that fizz sag array uh can you give the the function is asked can you give me the previous uh you know um entry uh and obviously it would be in an array it would be just you know minus index minus one uh but this was uh failing for us and this was kind of the situation in which that was happening and for a minute it had me going wondering what the heck is going on um and at this point we had the rb3 uh implementation as well so we were testing both together side by side we had the test running on the static array implementation and the rb3 implementation um and what we discovered was that um the reason that get prev was failing was because the assumption of what um of the of the property of the of the handle uh that we were passing through that to that function so for the array it would be the index value but for the rb3 it would be a pointer and there were certain implications for that um which i'll talk about in a second so this is the static array implementation so b is a loaded segment the system knows about it it's already been buvm fizz sag loaded and therefore the index if you were inserting segments would be in increasing monotonically increasing order so zero and then if a new one were a was inserted what would happen would be that that would get copied over and then a would go in and zero so you can you can see here that uh to refer to b initially you would want to refer to the index value as zero but then once the insert has been done zero refers to a so this means that the handle was not immutable we were making the implicit assumption that the handle was immutable but in this case the handle was not immutable in this implementation and so you know this brought it out um whereas for the rb3 there's no problem because the pointer remains the same so the you know the the handle is immutable um and so essentially again we exported that uh you know assumption into a test and said okay well we'll slap a test onto that so that we know exactly what's going on um so um yeah so now the the proper i mean the the behavior uh of both implementations is explicit and is explicitly tested for um right at that point of time we were also supporting conditional uh compiles of this static in fact we still do have conditional compiles of the static so you can use both in that bsd right now uh so you don't need to actually use rb3 you can also use the old static implementation um right so guess what happened yeah so um so at this point i was on my own sometimes um i wasn't very familiar with the net bsd system itself and it was um i was pretty pleased that you know i was able to break down the problem in um in a language and in a context that he could understand as a user space programmer and he was happy that he could actually get some you know uh work done on on kernel code uh but at this point i was on my own basically and i must give him a lot of credit he's an amazing programmer one of the best i've met actually um and um well that happened and normally at this point i'd be panicking because like if i didn't have all the state information out there you know it's the vm system there's like a whole load of things that could be going wrong uh but that wasn't the case i mean we had the tests and we knew exactly what was going on so we could actually flip assumptions inside the tests to figure out what was going on and we quickly realized that um the tests themselves assumed that malloc would always be available obviously because the tests run in user space uh but obviously the kernel uh doesn't have malloc running when it starts off you have to figure out how to present malloc uh you know to the kernel that's booting so that's the bootstrap problem that's very peculiar to uh you know boot up situation um i think freebsd has a uh a vm api kind of which does in a very clergy way i forget the name of the api now but um um anyway but that's in a different context um this um anyway so we essentially what we did was to kind of provide um so we tweaked the the the uh the code a little bit so that we could um have back end functions to do the allocation a little bit like the pool allocator i don't know if people have used the pool allocator but um pool cache allocator but basically your slab allocators i think have this backing um function thing where you can you know allocate either device uh addressable memory or actual you know system ram memory uh but anyway we use the same kind of approach so we had like a callback function that would get initialized at boot time which did the static uh allocation for uh boot time ram and then once we figured out that page in it done was you know done and kmem alloc could work then we'd switch the allocators to the regular kernel memory allocator um so that that was a little bit of a twist in the in the story but um um but yeah i mean again we got that uh so we again that assumption we put it out in tests so we explicitly put the you know the assumption of boot time allocation versus uh you know runtime allocation inside of tests um so um at this point uh more or less x8 is six was uh um working we hadn't integrated code yet mind uh because you can't do that i mean there's 70 architectures uh gonna get breaking if you start pushing code so um so um we started looking at okay so we're trying to you know uh fragment memory and uh sorry hard plug and uh and uh replug memory uh and we started looking at the at the fragmentation problem so um so you have a segment and then the um so how net bsd does this is that there is an array that essentially um holds the physical um data structures uh of all the system pages in memory now segments are not at page resolution segments are it can be like a one gig uh segment followed by uh one megabyte segment followed by so on and so forth but pages are 4k pages on net bsd i think are most architectures um so pgs is an array of vm page uh structures and not pointers these are actual structures that's where the actual data about the pages are stored so pgs is really important because again we we go back to the array problem where um as we saw in vm segments uh you know that was an array and then pgs is an array as well so now we've got the same problem coming back at us and uh we were like oh my gosh now are we going to have to use the arbitrary again have to go over the whole thing again but extents to the to the rescue so extents is a really cool um extent manager so any namespace you give it it'll manage the fragmentation insert remove uh operations on any any namespace it doesn't have to be memory so it doesn't make any assumptions about uh backing or you can tell it not to make assumptions about backing uh memory uh and so that was it we just plug that into the pgs array management so instead of manually going and trying to mess with the pgs array we just said okay well we'll oh sorry we'll uh we'll use extents we'll register the entire pgs array namespace into the extents and then just tell the extent manager to do it for us and it was brilliant just worked it was plug and play literally um and so at this point um we were ready um so yeah at this point things were things were going well and uh nick Hudson mostly and Maya helped uh me integrate most of the code and again like what could have been a real mess it was like two weeks and most ports were like done i mean 70 70 architectures i was pretty impressed i uh it could have been a nightmare but um you know the methodology really uh so the hero didn't do it the tests did it i think um performance is really interesting i mean uh it's really simple performance testing on for this uh codebase because all we all we are interested in is how fast can you find you know a segment given a physical offset that is literally the fast path operation in this whole api um and so it was really uh and there's a there's a essentially a macro that wraps over this function call so literally we just had to performance test one function and that was pretty straightforward um so what did we do well we had um you know these these these tests um had to factor in the fact that there were fragments memory um segments uh because this was not the case previously before unplug was available you know all the segments would be contiguous there's no big deal uh you know finding out the same algorithm could find them out but here if your segments were fragmented then your rb3 starts getting um you know filled up in not necessarily symmetric ways right so um so we wanted to see what impact that had um on performance and so what we did was we kind of faked the um uh so we used random to essentially uh fake the um the effect of a running system so we used the random system uh system called um essentially uh sort of spread out the the physical address offsets of also uh you could okay so you could test it saying okay from zero to the end of RAM you know run through a loop and see what page uh FISSEC find gives you but um in this case um you know that you know that's one way to do it or we could just sort of randomly look up offsets and that's that's what we did so um so we did a you know 10 you know 100 calls 10 million calls kind of uh kind of breadth of calls and and again you know random so it on a real running system uh physical addresses are not necessarily randomly looked up right i mean there's a lot of caching a lot of code that keeps running repetitively so this is not really um an indicator of the actual system performance and this is sort of work to do or maybe a comment about how this kind of testing can be done in a slightly different way load testing i think is not really um mapping straight on to atf testing um but um essentially um yeah we just you know we used what we had and all this stuff was done in user space um and so um yeah so we you know we applied different scenarios a fixed size segment fragmented segment just to see what effects it had on the performance and we'll get you some nice graphs but in a minute but uh yeah so this is what it would look like numbers will be pulled out like this and then um yeah and then we got tables and uh you're welcome to look at that later on but you can yeah i mean so the you can see the you know you can make a quick scan through the tables but the top one is rb3 and the bottom one is static area and you can immediately see that the rb3 implementation is taking more time uh you know to uh find uh segments so we wanted to see you know how bad it is um so yeah this is just a sort of uh you know testing between 10 million uh segments and 100 million segments kind of thing um um so yeah so this was the statistical kind of methodology we used because we were using random uh so we had to kind of compensate for that by using uh making a statistical approximation about how um you know how much confidence do we have in the actual number we're getting uh and so we kind of uh you know we stuck to a margin of error of 95 percent uh i didn't do this work so uh if you have any questions i'll redirect them to Santosh um but anyway um uh so that's the number 5.59 percent degradation and performance um which you know depending on how important it is for you to plug or unplug your memory live um is a design choice that you know somebody can a manager can make uh so um so there we are and um right um yeah so that's the details of uh the fragmentation and how we did the tests and colorful graphs but you can kind of get an idea um of yeah so those are graphs of the average maximum and minimum times for different um you know numbers of segments that were being tested and uh yeah just to go over some of the things that we were probably missing originally when i designed the um API the ideal API that had all the uh you know cash attributes and this and that uh we actually looked at romp testing uh testing on romp but the problem with romp was that there was a whole load of assumptions inside of romp and a whole load of dependencies that we'd have to bring in uh and so we abandoned that but i think for load testing uh romp is pretty good because it can uh interface with actual user space workloads and exercise your code parts so i think uh romp is interesting for load testing of this kind of behavior um yeah code well we could we could have a bit more code coverage i mean that's the question of how much time you have to um uh address but more importantly i think maybe if we could get some live numbers as well to make a comparison to um the numbers we got with user space um testing um with with detrace um i'm not sure detrace i haven't used detrace in net bsd but i don't know what the state of it is uh anyway maybe we'll get some feedback on that later so yeah this is the the big uh you know moment of enlightenment um you know uh existing techniques nothing fancy you know heroism required uh just you know apply interest you know standard techniques and you can do cool stuff um i definitely had a much less stressful experience than uh debugging zen intrapandlers so so so this is really cool um and uh obviously you know it did help that there were um apis inside of net bsd that made the least amount of assumptions about what those apis the context in which those apis could be used for example you know rb3 could be it's a you know it's a user space library but it can be used in the kernel or the extent um you know api does not assume anything about the nature of the backing ram for example so really cool to have that kind of tooling available inside of the kernel um so i mean literally this sort of pitch is for people who have access to or know about hardware that uh can do hotplug outside of virtual virtualized environment or even inside virtualized environment i think virtualbox um qmu has an acpi interface for hotplugging that i had to look at but it was way you know our acpi stuff is a bit shaky at the moment so a little bit more work required for that um zen is the easiest to do and i've done like a really um simple stub plug implementation uh what's missing is that if you want to uh unplug code your driver needs to uh kind of so there's a little bit more work required for unplug because obviously you can't just unplug memory that's being dma'd to or like you know memory that um you know is being used for something so there needs to be a way to uh figure out uh you know if if a page that you want to unplug is uh in user not um and that uh you know this can be this enables that but it it doesn't um do it for you so if you're writing a driver obviously you have to you know there's a little bit more work for that and also exporting this functionality to user space um you know uh user if you have a ram control kind of utility that talks to the kernel and says pull out this offset of ram or whatever so that api needs to be designed and so on uh but the basic uh interface with the virtual memory manager is in place and it's reasonably robust i think i haven't seen any complaints of weird page faults or panics on various architectures so far at least so i'm keeping an eye on it but um so yeah and the cool thing is that the vm system is probably the you know the the most one of the oldest in pedigree um because obviously all the bsd started off from a similar vm uh system so i feel like other bsds could actually benefit uh from uh this work so phibiasd especially i've had to look at their vm coding but uh you know they could benefit from uh this stuff uh open bsd i think uses uvm so um i think it should be fairly straightforward for them but phibiasd might need to put a little bit more work into it uh thank you all these people uh philips here and uh yeah the bsd foundation we coded this by the beach uh we spent four months it was brilliant highly recommended philips knows about it he's been to the venue um yeah and yeah that's uh that's the credits and yeah thank you everyone and yeah five minutes yeah we got five minutes for questions can we kill the balloon driver now uh well the balloon driver could use a hotplug uh so yeah right now the balloon driver uses the hack that it uses kmem alloc to reserve memory and then you know keep it away from the rest of uh uvm from reusing it uh but it also interfaces with the hypervisor uh you know so there's an assumption there about how that api works so we could reduce it to an api that's kind of named balloon but does something else should probably be called hotplug now but uh yeah uh but yeah the kmem alloc stuff would uh change for the benefit of the video can you explain what anita is and how it worked uh when you workflow um yeah so anita is a continuous integration um set up the net bsd has where um uh all the atf tests inside of the net bsd source three correct me if i'm wrong uh are a kind of so your source is built and then all the tests are run um i'm not sure for what the frequency is go on sorry anita is a python uh you know wrapper that actually uh takes a build and after that it uh spawns up either a uvm or another emulator runs a net bsd install you know from scratch and then starts running the test so it builds a new environment a new system make sure that everything works from you know the installer to actually running the full test suite and it completes and runs uh there is in the releng.net bsd.org you can go and follow the link and uh it has uh several architectures that run daily and others that run on emulations daily and others that run on real hardware you know weekly or whenever people get to run them the um e386 runs eight times a day um uh spark we aim to run twice a day and um others about it the same frequency all right i hope that answers your question now the question the real question is so first of all i think that we don't really unplug and plug memory all the time this is kind of a an event that doesn't happen too often so optimizing the whole thing to an rb3 seems to me like kind of an overkill right because you know you could just say stop the world and rebuild your array isn't that uh a feasible thing or what what what other thing does rb3 buy you uh that's the first part of the question and the second part is that the unplug is the most interesting part of it and you know the the reverse lookup is what you want to have really is to basically have the subsystem ask okay who's using those segments that i'm trying to unplug right now and if it's a device driver the device driver needs to relinquish them and if it's a process we have to wait for the process to finish or we decide to kill it or something right and that's have you given any thought of that yeah this is a trick question okay so i have fleetingly thought about it and and we when we did the work where we really had to have deliverables we wanted to you know put it at a point where we actually had some functionality and so initially i did actually go around and write a very rudimentary ram control tool just to think about how a user would interface with you know the kernel but it turned out that that is a house of cards that's going to fall very hard so my thought about this is that if we can incrementally start so the arbitrary question i'll come back to in a minute but my thought is that if we could have if we if we could have users so for example zen or any virtualized environment is the immediate one that i can think of and then you know there's heavy metal architectures out there that have a cpi based hot plug and i'm not sure if the other architectures spark or and so on but i'm sure that the server industry has these hardware mediated ram plug-on-plug things so if we can if we could have just the basic sort of plug-on-plug operation for specific cases that are maybe that's memory that is you know not dmaid or memory that is only allocated for a restricted set of things that can be tracked so for example things like maybe the some kind of cache maybe i'm not sure which ones but we'll have to you know do the analysis but a restricted set of these pages could then be looked at because the state tracking again it's you know it's that's a huge effort to figure out the reverse lookup of what page is used by what subsystem and then to keep track of all of that and then to make sure that this particular page is not being accessed by anybody that that is a significant search problem in terms of such space so yeah taylor is it often the case that you will want to use memory that you have hot plugged for say dma or kind of you know driver specific specialized purposes like that or could you prefer to allocate dma memory from what is provided initially at boot and prefer to provide hot plugged memory to say user processes where you could just you know you could unmap them and move the page data to another page and then remap them and let the user user space continue uh yeah that's that's a pretty uh that's a leading question actually so i think bus dma already has uh and this is a machine dependent question because perhaps one can imagine that you know there are architectures where hot plug memory can be used equivalent to boot time memory and then there are other architectures like x86 where the first 16 megs is you know only accessible to certain types of dma controllers and so on so i think that is a machine dependent question uh um sorry i missed the main part of your question so my question is um could you use this as a way to avoid having to do the search the reverse lookup problem and yeah yes make the problem simpler by pretending harder cases don't exist yeah more yeah so that's kind of what i was leading to with uh when i was saying that we should probably try and restrict where unplug is done inside of certain categories of memory or certain um memory management apis like bus dma or um i can't think of something else at the top you know at the top of my head but um yeah so restricted categories of of uh ram could be you know that's a start i feel like and then you know different subsystems can then decide whether they want to use this or not and then eventually we could kind of have a sort of global it's a complex problem i don't have all the answers right now but um it needs definitely it needs analysis but i would say i would like to actually when i get spare time this was a funded project thanks to the foundation but i would actually like to look at various use cases and start doing this you know bits of categories of ram and then see if this api can be exercised got two minutes to answer christos's original question which uh which was uh why rb tree um i think the simple answer to that was it was available it was easy to use um and uh yes we um yeah i mean we could use something that was already available so in in theory we could go back to the uh array implementation and make it do what the rb tree does now because we have the testing infrastructure in place to make sure that it doesn't fall apart so actually there's nothing stopping us from going back and reworking the array implementation to do exactly what the rb tree stuff does so yeah so it's possible it's just that that was convenient and we thought that it was it was not a very organized decision decision but we kind of asked around about the performance implications and we thought well we'll just find that number five point x percent and throw it out and see if people complain too much and if they don't then we're just gonna you know push it in but we're not forcing you to use it you can you know you can optionally use the uh array implementation without hop plug and then the rb tree implementation with hop plug and uh if someone's up for you know doing a hop plug implementation of uh you know using the array you're more than welcome i'm happy to to you know help with that so thank you very much


There he is, no, dude, that's a biggin. That's a biggin. That might be bigger. Grab him. Welcome to another video. I actually have a challenge for each and every single one of you guys watching right now. I want you guys to think about something for a second. Where, what is your dominant arm? Mine is my right arm. So when I'm casting, I'm way more accurate with my right side. Okay?   Okay? So my left hand, I want to go out and cast with my left hand as much as possible. Don't even use your right hand. Only left hand cast, only left hand skipped. Do that for a solid day or two and I promise you it's going to improve your casting skills. I've had a lot of comments of people saying, Noah, how do you skip? We're going to start off here. So go out next time, start fishing with your opposite hand that you're not really the best at. Get comfortable with that, then we're going to move into the skipping. This is going to be a great way to head start into all this just because you're going to get a little bit more comfortable and then when it comes time to figuring out that motion to skip, you're going to be able to do it with both hands and be more versatile as an angler. So anyways, we're out on this beautiful lake. We're going to hop on the John boat and go catch some big fish. Let's hop right into it. So if you guys are new to the channel, be sure to hit that subscribe button, hit the notification bell. Also, hit the like button if you guys have been enjoying the content. I got Fletcher behind the camera. You need to check out his channel too. We're about to go out here and catch him. If you guys are wondering about the conditions, overcast conditions today, it was actually raining the last few days. Pressure is slightly high. We're going to have a storm come in right now, but it pushed off for a few hours, but the pressure is still high. Usually on conditions like this, you know, the bite is going to be a little better, but the pressure is high, so I'm curious. I guess we're going to see. I think the fish are going to be roaming, but they might be a little bit slower. We're going to have to find out. Let's go catch them. No freaking way. Dude, that he ate it like a top water off the limb. Unbelievable. Good fish too. It's about the size of the last one, maybe a little bigger. Look at them toting, bro. Oh, that's a three-pounder. Get you up in here, baby. Oh, baby. That's a three-pound fish. Beautiful three-pound bass. We're getting bigger, getting better right here. Let's get them back in the water. You can tell they're not really back in these creeks and they've positioned out towards the mouth of all these spots, and that's a very important thing to pay attention to in getting more bites. That was three bites in about five minutes. Let's go, Fletcher. That's how we get it done. It's just crazy with the cloud cover. I didn't think as many would be, but they were on that bend, bro. We could duplicate that, though. Even that corner might be money. This water is a little clearer over here. Oh, baby. This is unbelievable. Look at the baby, dude. That is a pterodactyl anus.   It's freaking fat. Not what we want. Not about fish though. What are you doing, boy? They're here, though. It's not as big as the ones we found on that one bend, which makes sense. That bend is more staging up towards the pocket, where they're going to start bedding eventually. This one's kind of just a standard bend. And we're driving in front of the boat and you fear somebody because it's dead. Yeah, this one feels better. Oh, no, no, no monster. No monster. Oh yeah. Two pounder, two pounder. I think that just might be my best fish today. Solid, solid, a little brute.  Bye, baby. I got to focus more on my thing. It's been the best decision of my life, honestly. That's actually a pretty decent one. Two pounder. Not even. She's a thick girl, though. Wow. Look at that, guys. First fish on the provoke today. Awesome.  We fished around that dock. I swore that we're going to get one. Nothing, but through this jerkbait right past that laydown, where some wind's pushing up. If you guys ever see a good, how winds staging up on some spots, it's always a good thing to pick up a jerkbait. That is a two pounder, bro. Look at that.  Oh, there's fish. Yeah, I was just reeling that back in. It's a better one, too. Oh yeah, this is probably three and a half. Yeah, yeah. Good fish. Definitely my best one. She's chunky. Oh, she might be bigger than three. She might be bigger than three. That's a pretty fish. Wow. Here we go.  There she is. Great, great fish. First quality one that I've had all day. No had one that was probably about three, and this is definitely the biggest one we've put in the boat. But she is gorgeous. We're going to go ahead and get her on the scale. And we figured we'd come back to this first point where we were catching them on, because that was the only area of this entire body of water we were catching any size, came back over here. And in just a second, we stuck this one. And so our instincts were correct. And this sucker... It's three, seven something. Higher. Four, two, five. Four, two, five. Four, two, five. I told you, I told you, man. I told you she was four, man. I told you she was four. What? Gorgeous fish.  Super happy to get her in the boat. Let's go ahead and get her back in. Here she goes. Let her kick on. Off in a hurry. Good job, Fletcher. Yes, sir. Good fish. We were waiting on that one. I needed that. Man, the small ones that were getting to me, I just was looking for that big bite. And she came when I least expected. I was not trying to like work my bait at all there. I was actually trying to get it back in because I had a nice little loop in my line, as you can hear it coming out right there. And I wanted to cast that out. And she just came up and smoked it when I was trying to pull it away from her. Did you hear that? There he is. What? You actually have one? Oh my gosh. What? Dude, this bank is freaking... We both got a really good... I think yours is a little bit... No? I think mine's bigger. Look at this. This might be a three pound. Oh yes, sir.  Yours is just chunky. Mine's a little bigger. Holy... That was the same spot, dude. They're loaded. Look at that, guys. Right there. Hyper jig. Hyper jig. Freaking awesome double up. This is about two and a half pound. That's about pushing two.  This is a long fish. Cool. You get that cast up by the documentary. Yes, another day right here. You're going to get a mega feeling. There you go. A big... Right there. Oh, solid fish. Solid fish. Right where she's supposed to be. Right, hugging the dock. Oh yes. You didn't even move it. Didn't even move it. Just right on top of her. And she inhaled it, bro. Absolutely annihilated this crawl. Just a short fatty. Just a football. Just when I thought football season just ended. Just right back on them. Dude, is that not crazy? I know. I was like waiting for that cast. Bye, pretty lady. Dude, they're freaking stacked on this bank. But it makes sense. So guys, I mean, it makes sense that these fish are here. You know, we got this bank coming right back in this pocket. Pretty much these fish are staging up on this bank. That's fairly got a lot of water on it. Got some good hangovers. And it's this little corner back from the main channel. And these fish are staging up on this bank because they're getting ready to push back up and spawn. You guys know we saw a lot of beds. And this is just the perfect little transition point. And sure enough, these fish are just loaded here.  And we had bites coming back like earlier. We're getting twice as many now as we did. Yeah, we're getting a lot. Well, we're both throwing this too. They're just scouting in there.  I missed a couple good ones, man. But that one that you hooked ended up coming off. Oh, there he is. Dude, why are they hammering it that dang good? Dude, we could have doubled up again. Big? Oh, it came off. Dude, mine felt freaking good too. I think that was a good one. I'm going to catch this one long. Gosh, dude, this is crazy, man. They're on every little inch of this back corner. Like that, that right there, it just makes so much sense. Like they were obviously there, but when on this corner, dude, coming into the pocket, they're just stacked. Heavily stacked. We might need no way. Oh yeah, that was a fish. What in the heck, Fletcher? There's a fish. He's running with me. That's the litter probably the one. No, he was up on that corner, dude. That is insane. That's a nice one, too. It's almost a three pounder. Look at this fish. That's a good one. That might be my biggest today. That's a good fish. That's a three pounder. Wow. I ain't quite three, but he's freaking pushing up there. That's insane, man. I jacked him good, too. These fish right on the corner, guys. Like you said, pocket right there. These fish are staging up on this corner. Very important. And there's another corner right here. If you guys look at that, the problem with that corner is that it's not really a steep drop off. This one's a lot steeper. And look at the quality fish that's holding. Just good ones. We've been fishing for a while. We're finally getting on the good fish. We probably have about 15 pounds right now, but we still need that, you know, five, six pounder. We're going to keep on skipping. I think these next couple of holes are going to hold a lot more fish. Dude, that's a big one. That's a big one. Oh my God. Next cast, please grab this fletcher. That's a five, six pounder. Dude, that's like a six pounder. That might be bigger. Grab him. That's a seven. That's a seven eight. That's a seven eight. Oh my God. Next cast.   This is bringing us over there. Dude, next cast, fletcher. Next cast. Oh my God. Oh, dude, that's my biggest one in this lake. That's my biggest one in this lake.  Oh my Lord, fletcher. That's a megalodon. Oh my Lord. Hybrid jig in a freaking slanch. Dude, that's a seven pounder. Dude, look at his lipstick on his lips.  I need a backup to get this fish in frame, y'all. This is a megalodon. Guys, I'm not even kidding. That was next cast. That was next cast. They're on this edge. That just proves that the pattern that we're on. Like I said, it might take it. It took us a while to figure out this pattern, too. We figured it out, honestly, earlier than we thought, but we just didn't pay attention. And it's so important to pay attention while fishing. So we came back to the spot one more time, and that's... She's high six seven. Yeah, I think it's a seven pounder. Holy freaking cow. Dude, he's so heavy. That's a giant. Zeroed out. Come on. Please be seven pounds. I gotta get a picture of this one, too. I never take pictures. Why is she like six eight? Six seven two. Six seven two. Can you see it? We gotta get a new scale. People have been commenting. I've seen so many comments. We'll get a new scale for you guys. Six seven two. Almost a seven pounder. Gosh. Just six and... Woo! Easy. Easy. Six and three quarters.   We are on them right now, boys, and it is happening. Beautiful, almost seven pounder. That is what we do here on Kicking their Bass. We figured out a pattern. We figured out they're eating the hybrid jig. If you guys want to check them out, I'll link them down below. That is the type of bass that we're looking for. Oh my lord.  Let's actually get her on this side. Oh my gosh. Ain't that a pancake right there? That's a slab. All right. All right, baby. Oh, she's ready. Look at her tying down. Give me some, bro. Next cast. Not even kidding. That was next cast with the big jig. That's why I love fishing big jigs. We've been on the good bites recently, skipping those jigs up on lay downs. The spot right here, pocket, corner that leads into the pocket. These pre-spawn bass are so fat. We're just going to keep on catching them. Let's get it. It's like the bites getting better. Like we said, dude, the bites are progressing. Later in the day. Lucky fishing before the storm. I think it's finally, they're finally firing up. I think it's taking them a second, but they're finally getting comfortable with the conditions. Look at that. I'll let you get that money cut. What? Right up under the boat. Another solid monster. Yeah. I've had, that's like the fourth or fifth bite I've had.    There she goes.  Bye, baby.


Yo, what's poppin people welcome back to another episode of kicking their bass TV I hope you guys have been enjoying the content if you do hit that like button hit the subscribe button share this video with a friend I greatly appreciate it today. We're gonna have a lot of fun man We're actually going John boat fishing and we're gonna be on the hunt for some really big bass today It's been a second since I'm gone out on a little John boat We're actually at Fletcher's place today, and we're just gonna try to hunt for these giants man We're probably gonna do some cranking today. We got some blade baits with us So we're probably gonna try out and if we have to go shallow maybe even like a chatter bait or a square bill I think that'd be a good go around today So we're gonna go ahead and back in the boat in the water see what we can do And hopefully we hook some big ones say I got a scale with me too. So you guys can't call me out on that I got a scale with me prepared. So if we catch an eight pounder, we're gonna be ready for let's go ahead and get This boat in the water also before we bag this boat in I mentioned in the last video But I actually have a fan meet-up this Saturday, November 13th at nine line apparel here in Savannah, Georgia It's from 10 a.m. To 12 p.m. So if you guys want to come meet me shake my hand talk some fishing I'd really appreciate that I want to meet some of you guys So I really would like for some of y'all to show out and it's been a while since we've done a fan meet-up so if you guys want to come out nine line apparel you can type it in on Google that's the addy and From 10 a.m. To 12 p.m. This Saturday, so hope to see you guys there. Let's go ahead and get this boat in the water All right y'all we just got in the water We actually we put the boat in and one of the pedals wasn't working So we had to go all the way back pick up the other boat and now we're back in the water So we're about to get it started today brought out some dang chocolate chip muffins. Let me tell you man This is the best thing that's ever happened to me matter of fact These are the best muffins is from Publix and dude. They smack Pillsbury. They didn't want to sponsor your boy So I told him I was like, man, I'm gonna have to go muffin tasting These are out here man. What do you think Cody? They smack I think they're better they smack the Pillsbury ones out of the park So if you guys looking for some good chocolate chip doughnuts, I'm telling you these are the thin doughnuts chocolate chip muffins These are the muffins But we're gonna go ahead and get started today And tie on a few baits see what we're gonna be throwing and just go out here and try to catch some fish there's a ditch out here that there could be a lot of fish stacked up in I'm praying that they are and The fish are stacked in this ditch. We're probably gonna have a really good day So let's go ahead and get it started and see if we can catch a few fish We're gonna retie the spinning combo by the way if you guys want to check out any of the kicking combos They're on your boy's website kicking their bass comm link to be down below We still got some bait casters and spinning rods in stock right-handed converse about belt We're about sold out of them But as far as left hand and spinning go we're prime and we still got some right hand in stock So you should be able to go get them down below I'm actually gonna put on this blade bait On the spinning combo it's been a minute since I've thrown a blade bait This is usually like one of my winner baits. I like the throw But I just don't know how these fish are acting right now. We didn't really have like A fall, you know, it's got really cold and now it feels good this week So I don't know if these fish are gonna be Roman shallow if they're gonna be out deep in these ditches If they're gonna be on points, you know, so we're gonna try a lot of different stuff but I'm gonna tie that blade bait on and then I'm gonna get me on one of these crankbaits right here This is a 5xd by strike king if you guys want to get a discount on any of the baits Or any of the other loose combos I use I have my codes and links down below The other colors I have in there are like more of dirty water colors We're fishing some pretty clean water today. So I go with that natural I don't know what color that is. It might be Tennessee shad I'm not sure but that that color even in a lipless. I was catching some some tanks The only problem with this is I actually put heavy line on this baitcaster I wish I had lighter line for these crankbaits I can get it down a little deeper because I have 20 pound fluoro on this crank And I'd usually want to throw a 10 to 12 pound but It'd be all right. I get the job done for today I'm just kind of casting fan casting right now. Oh, look at that Gatorson See him right there some bait pop Oh, no, it looks like a turtle or something do they just pop bait right out there in the middle That's exactly what I want to see That's the bite I want to get on There's a lot of bait there man a lot of bait Yeah, it's got hammered. What do I have that's not a bass I have a Okay, dude I believe this is intentional, man I've never caught a bass this small in my life What a freaking tank we might like we need a photo with this guy like this is a Bro, this is impressive. That's what I'm saying. I need the scale on this boy Like have you ever seen a bass that small? Bro That's impressive. What a lunker to start the day. Thank you, Jimmy. Oh my gosh. I've just killed him Here let's catch another one Let's catch another one Is there another Dude, I don't even know the size of that. That's probably like a three inch bass. Maybe a four inch bass Oh, why does it keep messing up? Oh my god. Got another one. Why are they so small? He's bigger. He's bigger, but he's very small like very twinkie That's a twinkie bass Dude, that is a future 10 pounder Yeah, he's part of the double digit. He's gonna be part of the double digit club here shortly Well boys, we are on a two fish streak right here. Not really what we want to catch, but I swear if I catch another one right here, there's a school of them. I'm not gonna do this anymore, but That is officially the smallest fish I've seen in a minute See there's a big girl right here. There's usually a fish in this corner. It's a good little spot Can I see one underneath? Dude, holy smokes. Oh my gosh Dude, all right, so I was telling Cody I was like the transducer's not in so he moved to put the transducer in the water I said, dude, look at that. There's a fish underneath me. I dropped down and catch this huge sunfish that is Insane right there. That's the cool thing about a blade bait, man. You catch just about anything You might as well be filming a multi species right now, but that is a Chunk of a bluegill, man What a pretty fish I haven't caught a big bluegill like that in a minute He was fighting hard man a lot of fish down there They usually stack up like on this edge of this creek right there This is the guy talking about There he is, look at up on that sucker Run into the side. He's tiny Okay Well, we got on some fish very quick, but just not the fish that we're really looking for Um, it is nice to catch them on a blade bait out deep I don't think it's that time of year yet. So that that could be why these fish are a lot smaller We're gonna keep on hunting. You know, you could find we could find a stack of fish that are five six Pounders that are just hundled down in that ditch So we're gonna we're gonna keep on trying but I think we've already caught like four or five fish He's right in that ditch. I'm just throwing this blade bait I'll throw it out there Now count this thing down, you know, let it hit all the way on the bottom Then all I'm doing is kind of ripping it just like that Just kind of hopping it right off the bottom And you'll feel them slap it if they don't slap it, they'll just kind of load up on it Just kind of giving them the steady hops like that Really working that bottom good And this fish if they're sucked down in that ditch they'll slam this thing Another great bait to fish here, which I I meant to bring this morning Is an underspin Underspin's a killer bait to fish in ditches. I've had some of my best days on the water with an underspin Um, I've caught you know 100 fish days on an underspin multiple times So that's another bait if I had had it with me today. I think we can get on some good ones See all the bait flicker out there That's a better one I don't want to get some weight on him. I don't think he's a big in but he's a better one All right, it's a freaking bluegill. I got hooked in the stomach. Are you kidding me? Holy cow I mean dude Dude, those are some brute bluegill, man. I I feel so bad for that, dude. You won't even believe where I had him hooked Right in his bunghole, bro. Like Dead in his bunghole.  I don't know what he ate and see it coming out of him Slabs You see that Oh, it's just dying and I just got slammed. Come on fish eat it. It feels like a way better fish. Oh, yeah, that's a little bass Bigger than anything we caught today Just just trolling this sucker. I'm moving to another spot I was like, I'm gonna throw that blade bait down there because they should eat it Sure enough. We get us a little bass on it We've got a good little start to today guys. We haven't had any big ones, you know, we're gonna be searching for them the rest of the day Just gotta find that one spot that has some big fish loaded up on it.  Look at that, dude Small one They're so small. I don't understand that That's why I'm trying to move spots because these fish are just not what we want to catch today They sure didn't eat Any bass is fun to catch any bite There's a ditch right here to the left and this is a flat My god It's fighting so weird Is that a fish? Yeah, I might have a butthole catch. Oh, it's a fish It's your booty up in here, bud Dude, that's a fat guy There we go. That's our last little troll fish right now. We might go back to that. I just want to catch some bigger ones There's a flat right here on this point. You got a ditch that's in the middle of the pocket But this flat has a loon on it and he's over here eating bait So we might get lucky these bigger ones might be roaming up shallow today with these cloudy conditions Oh, that's a big one.  Not a bad one. He ain't a giant, but he's freaking good fish. I think it's like a three pounder That's what we've been waiting on Looks like a high two maybe That might be if that's a three pounder Let's get him in the boat though He's barely hooked Yes That ain't quite three, but he's a high two pounder right there. Boom, baby Get a starter with something good when he grabbed onto it. I knew I'm gonna tell you if we get a five-plus pounder This thing's gonna feel like He's about 15 pounds That's a good fish man. If he was a little more filled out, he'd be a three pounder, but he's a high two pounder right there Now we're getting somewhere.  Give me some on that Cody. Step in the right direction Oh my god, what is going on dude? Look at that. Look at that. They're having a feeding frenzy. Watch this. I'm catching 100% Look at this Oh my god.  What are we about to get into dude? What are we about to get into? That's a good one too better than what we've been catching It's two pound. Uh, not even All right, we're about to get on a crazy bite dude. There's no talking here We just need to catch as many as we can. I had that fish come off and there's another one with it There's a whole school of fish right here going crazy on bait Oh, that's a tank That's a tank. I don't know if I have them hooks weird. He's not fighting anymore Yeah, he's not. Yeah, he's not big I mean, it's not a bad one second best Figured in that last one Yeah, dude, we're we're about to get on a crazy bite guys catching fish every cast right here. You ready? I feel it catching bass every cast is about to happen That's a good fish man. Not a bad one not a giant but Great healthy bass Watch this. You ready? Oh, he's behind me right here. He's gonna eat it ready. It's crazy All right fish. All right.    Are you ready for something crazy? Yeah Watch this You ready? They're looking at me Oh Oh, yeah. Oh my god. He broke me That was a Oh my god.  Oh my god. That was a freaking monster, bro I could have been like a dang five pounder for all I know But we got we got these micro traps. I got like six of them in my box. So we should be good. I think we'll eat it Ah, they're they're not gonna seem like that glide bit or the blade bait But It should do the trick. I got a whole school behind me All right, it's all good man. They're gonna thought it I felt good about it They might buy this even better, honestly A little more finesse God dog. I was going on him. Oh, yeah Turned up a good little fight I still got some under me too. I'm gonna try to release this fish and drop under me We found the mother load right here boys. That's what we've been looking for And there's big ones with them because they were eating that bait. I saw them Not only that but I hooked that big one a second ago. That was not A small fish Oh, yeah, that's a better one biggest fish today You see how they fired up you see that look at that look at that Gosh, they're fired up right now.  That's exactly how you want one to eat it. That's how you know, you're in the right spot some nice fish high two pounder I haven't been able to catch one bigger than that I know I had one on earlier when I broke that off. That just sucks The trick is to get that fishing get them off the hook And throw back in there really quick That is not the one I want There he is That pop flutter I think that's what we needed to do.  Let that bait flutter down And they're eating it on the fall. Oh, that's a decent one You could feel it on your slack line when they hit it And this kicking combo is getting put to work Tell you look how he ate that sucker. See Eat it right on the fall. He just choked that thing.  I'm never throwing one of these And I I didn't I ordered them by accident. I thought they were the regular size and I got them in and I was like, well, I'm sure I'll use them one day and Today happens to be that day He's bleeding a little bit.  This one's got some stuff on Look at that. I don't know what that is Well, y'all that is a pretty fish right there and I'm gonna have to say this is gonna end off today's video I hope you guys enjoyed it If you did please hit that like button We got on a lot of good fish on a blade bait and a strike king red eye shad And man, it was a lot of fun today. I'm glad we could get on some big schools If you enjoyed it hit the like button guys Share this video with a friend hit the subscribe button if you haven't already and I'll catch you all in the next video


We continue today with chapter 30, the new beginning, introduction. The new beginning now becomes the focus of the curriculum. The goal is clear, but now you need specific methods for attaining it. The speed by which it can be reached depends on this one thing alone. Your willingness to practice every step. Each one will help a little, every time it is attempted. And together will these steps lead you from dreams of judgment to forgiving dreams and out of pain and fear. They are not new to you, but they are more ideas than rules of thought to you as yet. So now we need to practice them a while until they are the rules by which you live. We seek to make them habits now, so you will have them ready for whatever need. Rules for decision. Decisions are continuous. You do not always know when you are making them, but with a little practice, the ones you recognize, a set begins to form which sees you through the rest. It is not wise to let yourself become preoccupied with every step you take. The proper set adopted consciously each time you wake will put you well ahead. And if you find resistance strong and dedication weak, you are not ready. Do not fight yourself. Let's think about the kind of day you want and tell yourself there is a way in which this very day can happen just like that. Then try again to have the day you want. The outlook starts with this. Today I will make no decisions by myself. This means that you are choosing not to be the judge of what to do. But it must also mean you will not judge the situations where you will be called upon to make response. For if you judge them, you have set the rules for how you should react to them. And then another answer cannot but produce confusion and uncertainty and fear. This is your major problem now. You still make up your mind and then decide to ask what you should do and what you hear may not resolve the problem as you saw it first. This leads to fear because it contradicts what you perceive and so you feel attacked and therefore angry. There are rules by which this will not happen but it does occur at first while you are learning how to hear. Throughout the day, at any time you think that and have a quiet moment for reflection, tell yourself again the kind of day you want, the feelings you would have, the things you want to happen to you and the things you would experience and say, if I make no decisions by myself, this is the day that will be given me. These two procedures practice well, will serve to let you be directed without fear. For opposition will not first arise and then become a problem in itself. But there will still be times when you have judged already. Now the answer will provoke attack, unless you quickly straighten out your mind to want an answer that will work. Be certain this has happened if you feel yourself unwilling to sit by and ask to have the answer given you. This means you have decided by yourself and cannot see the question. Now you need a quick restorative before you ask again. Remember once again the day you want and recognize that something has occurred that is not part of it. Then realize that you have asked the question by yourself and must have set an answer in your terms. Then say, I have no question, I forgot what to decide. This cancels out the terms that you have set and sets the answer. Let's the answer show you what the question must have really been. Try to observe this rule without delay, despite your opposition. For you have already gotten angry and your fear of being answered in a different way from what your version of the question asks will gain momentum until you believe the day you want is one in which you get your answer to your question.  This can be very hard to realize when once you have decided by yourself the rules that promise you a happy day. Yet this decision still can be undone by simple methods that you can accept. If you are so unwilling to receive you cannot even let your question go you can begin to change your mind with this. At least I can decide I do not like what I feel now. This much is obvious and paves the way for the next easy step. Having decided that you do not like the way that you feel what could be easier than to continue with and so I hope I have been wrong. This works against the sense of opposition and reminds you that help is not being thrust upon you but is something that you want and that you need because you do not like the way that you feel. This tiny opening will be enough to let you go ahead with just a few more steps you need to let yourself be helped. Now you have reached the turning point because it has occurred to you that you will gain if what you have decided is not so. Until this point has reached you will believe your happiness depends on being right but this much reason you have now attained you would be better off if you were wrong. This tiny grain of wisdom will suffice to take you further. You are not coerced but merely hope to get a thing you want and you can say in perfect honesty I want another way to look at this. Now you have changed your mind about the day and have remembered what you really want. His purpose has no longer been obscured by the insane belief you wanted for the goal of being right when you are wrong. Thus is the readiness for asking brought to your awareness for you cannot be in conflict when you ask for what you want and see that it is this for which you ask. This final step is but acknowledgement of a lack of opposition to be helped. It is a statement of an open mind not certain yet but willing to be shown. Perhaps there is another way to look at this. What can I lose by asking? Thus you now can ask a question that makes sense and so the answer will make sense as well nor will you fight against it for you see that it is you who will be helped by it. It must be clear that it is easier to have a happy day if you prevent unhappiness from entering at all but this takes practice in the rules that will protect you from the ravages of fear. When this has been achieved the sorry dream of judgment has forever been undone but meantime you have the need for practicing the rules for its undoing. Let us then consider once again the very first of the decisions which are offered here. We said you can begin a happy day with the determination not to make decisions by yourself. This seems to be a real decision in itself and yet you cannot make decisions by yourself. The only question really is with who you choose to make them. That is really all. The first rule then is not coercion but a simple statement of a simple fact. You will not make decisions by yourself whatever you decide for they are made with idols or with God and you ask help of anti-Christ or Christ in which you choose will join with you and tell you what to do. Your day is not at random. It is set by what you choose to live it with and how the friend whose counsel you have sought perceives your happiness. You always ask advice before you can decide on anything. Let this be understood and you can see there cannot be coercion here nor grounds for opposition that you may be free. There is no freedom from what must occur and if you think there is you must be wrong. The second rule as well is but a fact for you and your advisor must agree on what you want before it can occur and it is but this agreement that permits all things to happen. Nothing can be caused without some form of union be it with a dream of judgment or the voice for God. Decisions cause results because they are not made in isolation. They are made by you and your advisor for yourself and for the world as well. The day you want you offer to the world for it will be what you have asked for and will reinforce the rule of your advisor in the world. Whose kingdom is the world for you today? What kind of day will you decide to have? It needs but two who would have happiness to stay to promise it to all the world. It needs but two to understand that they cannot decide alone to guarantee the joy that they ask for will be wholly shared. For they have understood the basic law that makes decision powerful and gives it all effects that it will ever have. It needs but two. These two are joined before there can be a decision. Let this be the one reminder that you keep in mind and you will have the day you want and give it to the world by having it yourself. Your judgment has been lifted from the world by your decision for a happy day. And as you have received, so must you give. And from the workbook lesson 234 Father, today I am your son again. Today we will anticipate the time when dreams of sin and guilt are gone and we have reached the holy peace we never left. Merely a tiny instant has elapsed between eternity and timelessness. So brief the interval there was no lapse in continuity nor break in thoughts which are forever unified as one. Nothing has ever happened to disturb the peace of God, the Father and the Son. This we accept as wholly true today. We thank you Father that we cannot lose the memory of you and of your love. We recognize our safety and give thanks for all the gifts you have bestowed on us for all the loving help we have received for your eternal patience and the word which you have given us that we are saved. Amen.


Alright, today I'm going to do a quick update on Achilles, the German shepherd that has tried to assassinate me many times. Alright, so protection, I always talk about this, and Achilles is also going through his process and showing the protection dog process of steps and what you should be looking for in the end, right? So I always said this bouncing on a leash stuff is not protection, it's beginner protection, it's getting a dog to learn how to turn on aggression and bite equipment, but it is not protection training, it's not a protection trained dog, it's a beginner dog. So here we started with Achilles on a leash and letting him blow off all over the place just to get the aggressive state of mind teaching him that state for a protection dog and learning how to hit at the same time, grab the equipment, beginner protection, that is not a protection dog. I say this all the time and you see so many places self-protection dogs that they bounce on a leash, there's no skill to that, right? It's just beginner work, okay? The next thing, testing his real aggression. Have we brought out real aggression? So no question, Achilles is absolutely coming for me. Equipment, no equipment, it doesn't matter, he is coming for me. So next step here, he's never seen anything of hidden equipment. I just put a sweater on with a little hidden sleeve underneath it. I had never done this with him before, so it was just a test. I knew he was going to do it, but I have to test it anyway. When I just put a sweater on and put that there, will he bite it and hold on just like he does with a regular sleeve or the suit? So another test just to make sure as we go along in the process, he will bite, not knowing what a sweater is, cannot identify the equipment, and no question, he does not care. Put anything out there and he is going to bite it, take it, and it's on. So we have that covered. Now the real game, and I always say this, the art, the skill of protection dog training is again not a dog bouncing on a leash, it's self-control, holding position on the body with no leash on and waiting for the moment of attack. That is when the dog is allowed to go attack in this particular moment. So real protection training, skilled dogs now, highly skilled dogs and real protection dogs are under the ultimate control, self-control and understand how to play the game and the rules of the game without blowing up and going crazy and over emotion and lack of discipline. So here's Achilles now that we got him to this step, holding the leg with no leash on and staying at here Stacey's leg and waiting for me to go and try to hit Stacey. Now the beginning here that we got in here will take these skills into sending him more self-control, but the end game of protection dogs is self-control and when they're in high state of aggression, I talk about this all the time, it's very difficult for them to hold when they're in high hostility mode. So it's them having to think about the game, their position on the leg while they're in that hostile, aggressive state of wanting to go hit the guy, tearing them between two things. But that is why it's called an art. It takes high skill to be able to balance that out properly and not kill a dog's drive while you do that. And I always say this is different than sport dogs. I say this all the time with sport dogs, all the sports generally, they're calm, quiet in the bites except for a bark and hold. But most exercises within protection of the sports, it's very quiet, they know it's a game, they know it's just chasing a toy, whether it's Schutzen, ring sports, it's not aggression and hostility towards the decoys on the field. So it's much easier to control them without leashes on because it's not about man aggression. It's just about going to play with the sleeve or the suit. But this game that we're doing for real home protection is complete opposite. When he is in that leg, you see, I mean, this guy's not playing. So we had to pull his highest aggression to make sure he understands this is not a sport. We expect you, when it's on to take the fight to somebody with high aggression to, you know, really fight somebody and, you know, you got to hurt somebody if ever needed. So we have to make sure, unlike sport dogs, that these guys are in high, high aggression but controlled aggression where it's not out of control dogs and that's why we don't allow this on the line bouncing all over the place. This is a highly skilled, this is making a highly skilled martial artist telling the dog, you don't just go out in life and fight everybody and anytime you feel like it, you just bite whoever you want. No, you only use it when we tell you or the circumstances we've taught you you're allowed. Other than that, you do not show your aggression, right?  And in life, you don't just go after people only when we say it's time that we need you. Then you're there for us, but in control while holding discipline, okay? So I'll show more videos of Achilles coming up with more control things. So there's Achilles update. So until next time, I'm Richard Hines, Mimey Dog Whisperer.