629 it's Wapping 82 degrees outside, so got a call. I'm a swapped call with somebody So let's go in here and see what's going on with this air conditioner It said the dining room is not working So I'm sure it's probably Something stupid I hope probably dirty Or whatever Get going and see what we find I cannot believe this meter bag three man. I just absolutely It's been doing awesome. It has been doing awesome. It's so small.  So anyhow, let's go All right, I think it's pumping the heat out oils luckily are clean I've cleaned these before These are three layers thick massive pain in the butt over here was the worst I don't think it's an air flow issue See whether or not we're getting condensation very well This is not the greatest deal here Which surprised me the belts probably loose Wow, we are well out some massive condensation Well, when in doubt, let's check the belt And our builders probably one of the most common things is a freaking belt Meow Let's see if I'm tightening these up Checking filters. Oh Geez really?  That's That's a major freaking wear on it. Yeah, this other one looks yeah, I mean, it's not horrible, but it definitely Definitely probably another month Maybe two months max. It's gonna need it I don't know whatever it is it don't seem to fit very good one other thing I want to check real quick Make sure this isn't sucking a crap load of outside air in Which a little hard to see on this one Should probably done this with a filler door off, but whatever It needs a job And a little better. Let's see if the compressors are all running. It's pulling really hard on that door Only one contactor is pulling in right now. I'll hide the stats cranked up You should be a two-stay stat on it because the other one this one here is doing its job as best it can calibrated hands we're not going for The full pony show today. We're just trying to get him going and always come back later It all seems to be working This belt wouldn't surprise me. Now. Let's go check that other one out Only one benefit to being up here on this section going up here and So you can find the other one I think it's Trying to remember where it's at Oh, I think I remember it's on the Backside of the building here lots of heat there and it's slippery belts, but it's running They take care of a lot of this themselves Yep, there's the other one. So I think that one there does the kitchen now. It's cranking out some water too You can see it. I have a good idea when you see water Dripping out of the bottom of the unit They ain't good because they're watching that musical group stomp Where they play the trash Trash cans have a feeling it's the same ordeal here. Let's check these belts same freaking thing Filters look good Automizers clothes drain pan is nasty is all get out Just one blower. They plugged up the scum That's what it looks like to me then blast that thing out, but all we can do I don't think I can get this part Sometimes they don't glue it, but you can see there we go. There's a little slime. There we go Possible some goodness for everybody Look at that. Heck. Yes Something satisfying about seeing that come out. Not sure what it is, but it just is Now that's gonna help out quite a bit there.  We've got two compressors on this one So we're good on that putters this one right here We're at 11.6 amps There's something kind of cool about this one Run right at 60 Hertz So they can do that with freak drive Accurately that's the key accurately so 11 and a half 10.2 So it's it's over real close to that like magnetic coil It'll throw your clamp off. The fluke's pretty good about not doing it But it definitely can happen. I'm gonna pull it away from it Pretty sure this does not have a capacitor for that blower motor I only see two legs I have a feeling there. Yeah, there it is the black. I think they took one of the legs and bypassed the Contactor and just went hot with one leg Let's make sure here Yeah, I made it pretty tight so might loosen that up touch Uh Yeah, it's three phase What sucks is I hoping that up God it's already freaking about as far as it can go Yeah, and the blower wheels I've seen worse, but man, oh man Look down through the heat exchanger and stuff Here's that nasty pan. It ain't so bad over here. Mainly got it right here on that section There's all right here Loosen this up a touch. It's a little tight Their instructions usually tell you just to tighten it up enough that it doesn't squawk when it comes on Same freaking thing It's four inch pulley. Here's another little check for you. So back and forth. We're good. Listen to this This motor is going out. I know how this will go So they'll wait until it's completely gone. Unfortunately Get it too tight, that's what takes out these bearings and everything else that and just age is what we got going on here Gonna get my information off the motor They definitely need a pulley It's pretty tight, but I don't know at this point All of our compressors are running everything looks pretty good Blower wheels all that stuff all that ain't happening today. We just got to get them going.  All right, I don't suspect this is gonna make a humongous deal.  That's a compressor. Oh my god All right. Well, let's look at this one here. All right. We're only pulling five 5.5 amps, so we're nowhere near it. Let's uh, let's speed that sucker up a little bit So try hitting it some heat see if we can get it out of there That pulling each changed anyway, so if I can't get this we're gonna get it going They're already dying so bad that they opened up the door for the kitchen and it wasn't that bad in there All right, could not get that loose pulling needs replaced either way We're just gonna have to get it up and going away. They had it. Let's go see what we're getting on the inside now that it's been run I think Just the second stage came on. So let's go to the front where we were first at All right, so We got 67 back here, and I've had as low as 66 It's 89 going in on the return Out in the dining room. We've got 72 going in and 57 coming out. We got what 15 degrees there and 23 degrees air. So obviously the fan speed needs to speed up for the kitchen. You can see with that Grill there is just a mat. So we're back out here at the kitchen Just wanted to see if my laser thermometer is accurate 88 and a half degrees coming in not going near as fast as what it needs to be going 62.6. Let's just take it to 62.5 All right, so we got 26 degree delta T. We're nowhere near as fast as what we should be going with that fan Problem is that that pulley is jacked and it's war so it probably worked really good when it was first installed Now that it's all wore down from everybody letting the belts go loose You know, it's not doing its job. It's not moving the air and getting rid of the sensible heat We're definitely removing the humidity Which is a little difficult to do in your drain pans full of water But now that we've got that pan drained out That's gonna help that out a little bit and that belt being loose. I mean it makes a huge difference I've seen it time and time again. You're like, well, that's the only thing just a little bit loose So yeah, you can see it's doing pretty good So I didn't do a temperature drop. Well, yeah, I did on the other one So that's 15 degrees in the dining room 15 degrees on the dining So that one's a little more respectable So I'm gonna let them know here in a minute give them a call and let them know what's going on But it's doing as good as it can do for right now. It'd be a lot better if that fan was going a little faster


Hi, here is Mario, build reps, back again with another video about poles, ancient poles, pole shifts, cross-stool deformations, and of course the expanding earth. Today in this video I'd like to talk about LIDAR scans, and not just LIDAR scans. These are LIDAR scans that are done all for the jungle of Guatemala, Mexico, and specifically the Yucatan Peninsula. What is so special about these scans? Well, when you fly over these jungle areas, you only see jungle, you'll see nothing. Just forest trees, and some city towns scattered along this vast stretch of jungle. But what engineers have done, they have constructed a system that can scan what is beneath the jungle, beneath the soil of the jungle even. And it looks like this, and this, and this, and this, and this, amazing, isn't it? One thing that stands out particularly is when you look for orientation, you'll see they're all, without exception, clockwise oriented. And if you know where the ancient poles are that I have discovered, you will notice they are almost, without exception, exactly oriented to these ancient poles. Or this pole, or this one, or this one. Sometimes even the oldest pole I have discovered, pole 5, it's this one. Now we all know that in Mexico and Guatemala and Yucatán there are lots of ancient sites to visit and to discover, we know this, they are scattered all over Mexico and this whole peninsula of Guatemala and so on. But what we didn't know before these scans were done, there are tens of thousands of cities hidden in the jungle we didn't know of. How is it possible? How is it possible that no one ever knew this? No stories, no legends, no myths, of course there are myths about lost cities, cities of gold and you know this. Something similar is just recently discovered in the Amazon forest. Lighter scanning is very intensive and costs a lot of time and money and you know you need to use a plane and every plane hour is expensive so they have to meticulously scan an area in a sort of grid and it requires some skills of the pilot of course and of the equipment and resources in countered in money of course. But okay, this is what we now are discovering and by the way the Amazon rainforest is you know this deforestation, of course deforestation is not good but what we discover is these kinds of things in the Amazon rainforest. What is that? They call this, they call them geoglyphs. Google for geoglyph Amazon and you will be amazed. I have also a database of these geoglyphs and lots of structures in this and they are oriented to very ancient poles by the way. But okay what is interesting about these lighter scans that I show here and here and here is that they are most of them are oriented to these poles I have discovered. So what is the probability that this is just coincidence? It's about this number, this just collection that I just scanned, I take them randomly and I correlate them with the poles I discover there is no pattern, no correlation, officially there is no relation between these two patterns but the probability is this number you see here on the screen, it's an amazing high number. These lighter cities, I call them lighter cities that are completely hidden under the canopy not even canopy under the soil of the canopy. So you have these structures and they have a large layer many feet of soil and then you have trees and canopy so this is why they are virtually invisible. What is interesting about them is that estimations archaeologists they think they say these cities are 2,000 years old, you know these numbers and they estimated that some cities especially in the Guatemala rainforest inhabited a few tens of millions of people in an area of the size of Mexico City so imagine this, this is a very dense population and tens of millions of people just living 2,000 years ago there are, these are a lot of bones and skulls, where are these skulls? There are never skulls found. So it's unlikely these cities are just 2,000 years old and it's also unlikely when you look at it from the perspective of the poles because these poles are dated in the hundreds of thousands of years old with a probability of almost 100%. So the likelihood that these cities you're looking at, these cans, the lighter cans you're looking at are 2,000 years old is almost 0% and that is the reason why never seriously bones are found because they are completely dissolved over time of course in hundreds of thousands of years. Not much bones will be left. I think you get my point. If you like to know more about my work, you know you like to support it, please do so. I have a Patreon page where you can support my work. I'm not very active on my Patreon page because I have no time, I'm busy researching, I'm busy talking with my research partners over Zoom, I'm writing a book, I'm very very busy and I'm not the guy that likes to entertain you on my Patreon page, I'm sorry. But you can support my work. That's really important and there are good supporters on my Patreon page, yes I'm very thankful to them. So I leave you with this note of wonder and mysteriousness, wonder over the ancient world. We have had probably many many more advanced civilizations before us that left hardly any traces, only in stone and of course in orientation, that is orientation appears to be a very powerful tool when it comes to measuring the age of a structure. Thank you for your time, bye bye.


Let's write an assembler again There is some method to the madness here. I Have been working on this operating system Called CPM 65 it's a port of the venerable CPM To 6502 based machines and here it is running on an emulator to BBC master Unfortunately, there's not a lot of software for it. In fact, there are these four commands Asm.com I will get into later. It's the thing in the window over here So there's not really a lot of point having it if you can't do anything with it There is an asm file on the disk which you can type But you cannot actually assemble it So it desperately needs an assembler in addition When I was designing CPM 65 I made it use relocatable binaries because CPM systems are very unhomogenous So having simple memory images that load out a fixed address would mean you'd have to rebuild everything for every platform and I'd also dramatically underestimated how difficult it was to generate relocatable binaries So our assembler needs to both Run on CPM 65 and generate CPM 65 binaries Now I have done assemblers in the past They've always been very heavyweight disk to disk assemblers Which use like proper parsers and they do multiple parsers through the source code reading it from disk each time And it works and they're quite memory efficient, but they're also excruciatingly slow Reading and writing from the disk at the same time on a system with no buffering means you constantly have to seek backwards and forwards across the disk So I am going to today Prototype a different way to do assemblers. We're going to do a RAM based assembler However, unlike the traditional CPM assemblers of the past Which generate a simple memory image at a fixed address. We're going to have to generate a relocatable File so this is going to be interesting So I've got here a That should be that a Boiler plate program written in C that compiles for CPM 65 I want to That's to that and then it will build it's been compiled with the six of O2 port of clang and LLVM it then generates a CPM 65 executable and bolts it into the Disk images so we can run it through this emulator It doesn't actually do anything yet. It opens the Input and output files, and it just copies stuff from the input to the output before closing it But we can demonstrate by doing Hello.asm out Don't know if you can hear the disc noises, but you can hear it seek backwards and forwards That's because I haven't saved file. Okay So you can see that this is showing that we have 22 odd K of memory With no actual program. However, I'm not going to use the emulator this emulator to test with because I have written a User mode emulator with a debugger in it so I can just run asm.com like this In this emulated environment we have loads more memory and If I do Here's a random file and It should have done it It has copied this file to this file and the size is a bit different due to the way CPM does blocks So all we need to do is just fill out the rest of the assembler so what we're going to do I've been thinking about this is Read the source file and parse it Construct in memory a data structure representing the source file We can then do multiple parses through that data structure before writing the result from memory to disk So we read the file once and we write the output file once the We do not have a heap all we have is an array of bytes from There we go from CPM RAM to RAM top so the This value It's just what you get from the difference between those that that's our available workspace We're going to have to put into this All the data that our assembler is going to need so including symbol information information on the the instructions we've actually read and Label information that we're going to use to actually generate the The resulting machine code We're going to make some simplifying assumptions, so we're not going to support the Where did I put the so this is the test program That should be assembled with I think LLVM moss We're actually going to change the syntax to make it easier to parse a little. I think this is actually all perfectly fine So we're not going to be fully compatible with the existing assembler. It's going to be simpler. It's not going to be a macro assembler It's not going to support stuff like arbitrary segments and so on Also for the purposes of this prototype, we're not going to support full expression parsing So an expression has going to be either a constant number or The address of something plus or minus a constant This should allow us to Demonstrate that the thing works so the place to start is always with these things the lexer What this is going to do is read symbols Well read words from the disk into a Pars buffer we wish to save memory So because we know that we are The parsing and writing the result will happen at different times we can reuse the output buffer as a Pars buffer, so we're going to have a Function that reads a single word from disk Into the pars buffer okay, so that was the really boring bit now we have to start actually thinking about how things are going into memory and The way we're going to do this is We start at the bottom of memory and we're going to call this Top and we are going to write a series of records I'm just reducing the syntax right this was the bit I was interested in So going to write a series of records Represented by yes, I do want this to be a struct this will contain the length of the record Because this will then allow us to walk the list to find specific records This is basically going to be like a sequence of Instructions that basically each instruction will turn into one of these We are going to So the simplest record is just going to be a sequence of bytes fact, we don't need that at all so One of these records means Amid these bytes as a literal into the output file We will be using this for constant like this also Instructions that do not contain any interesting parameters We know as soon as we see it how this is going to be encoded We do it like this so that we don't end up storing masses of information trivially This for example, we don't know how message is supposed to be encoded until we see it Which happens later So we're going to have to store this as a reference to something but this is Just bytes now for these This is going to be an instruction with a variable reference or rather an instruction with an expression I said earlier that expressions can be a constant value a Label plus or minus constant. We're also going to have to add High and low so So what this is going to go in what this is going to have in it is the opcode and The expression itself that is going to be a pointer to the variable There's a reason for having it as a UN 16 which I will explain later and the offset and Also, I have completely forgotten that to go alongside the length. We are going to have to have What kind of record this is? so in fact, we are Going to encode the We're going to encode the record to type and the length into Desker here All right So what are we going to do for parsing? So this will be a loop that will It will attempt to pass instructions from the input stream So this is actually fairly straightforward. We need to read a token Did I make that a char or a? You know, it's a charm. Okay. If it's in the file Stop I got that union all wrong. I'm gonna have to read go look at that again. But anyway So the things it can be at the beginning of a line is a Instruction that's and be an ID or eventually a Dot pseudo op at this point. We know that Yes, I know I used to go to It's because you can't break from the for loop from inside the switch statement That is perfectly allowed Okay, so we know it's an ID What we're going to have to do now is to go look at the The Contents of the buffer and try and do something with it So essentially we can need to find out if it's an instruction If it's not then we know it's a symbol reference and you know, just do the appropriate things Otherwise give up those warnings are because better Okay, let's go look at these records again. Now what I did wrong here was that I made made this a union what this means is that the The outside record is going to be the largest of the union members in length Which we do not want because we want to take we want to pack these tightly. That's why I did that Let's just do So this is going to be a minimal record This is going to be our bytes record. Can I do that? This is going to be our expression record. I can do that nice. Oh, yes, and one more that so Once we finished parsing we want to add a EOF record to the bottom of the list So this is going to be Very simple like so So this is demonstrating how to add a record to the The buffer. So if you build that we run it, that's not working We don't need EOF record. You can just do this So we get unexpected token here because it's just read an ID and we don't have any of them so if we actually copy this to a new file and we just put LDA9 in it we get a I forgot to do a thing comment. I'm going to use the backslash character as a comment, which is relatively standard in places So if we get one of them, we just want to keep reading until we hit a new line or the end of the file so Okay, that should be all we need So if we take our test as an and we comment out that line then Nothing should have happened because it should have read one token, which is EOF We got a 59 Which is a semi colon. Oh, it's the end of line Okay, that's fine. We just go around again if we get one of them That means we've reached the end of a statement Good So we've now successfully parsed our empty file So we can now say So our end of file has given us one stored byte in memory We are now going to have to start thinking about actual instructions So let's put that Let's go for a RTS Unexpected token, right? So over here I have a table of The 6.02 instruction set this is not sorted by opcode the It's sorted by instruction encoding the fields of an opcode are divided into these Each opcode byte is divided into three fields a b and c B is used mostly for the addressing mode while a and c These two fields here tend to describe What the app opcode actually is so for example? LDA is C equals 1 a equals 5 this row You see all these are LDAs and They be changes according to what addressing mode they are so In order to parse an instruction we have to read the instruction So for example in our case that was a LD why No, that was yes, of course hindsight that's not a brilliant example because this has no addressing modes, so let's pretend that was an LDA We read the fact it's an LDA, but then we then don't know what opcode it really is Until we read the rest of it This does actually simplify parsing a lot because you notice that all these instructions Except for STA here are very similar. They all follow the same model So we only need one routine for dealing with all of these except for STA Which is nice So instruction matching we are going to So I'm gonna have tables of instructions, so These are going to be each one of these is going to contain three characters worth of Opcode and one byte worth of payload. So for the simple instructions We've got Brooke, which is a zero the HP, which is oh eight not that CLC which is one eight not that not that that You notice there is a pattern here. I think I've missed two zero. Ah, that is not one SEC is three eight. I is four zero HA is four eight CLI is five eight RTS is six zero six eight SCI is seven eight. I missed that one A is nine eight. What's eight eight? eight eight DUI TAY is eight and the next one will be B eight B8 CLV Yes, C8 INY CLD D8 E8 INX SED F8 Okay I should add the reason for these patterns is because This the the opcodes were very carefully chosen to make it easy to implement in the silicon so All these values will be wired to the various logic gates that basically cause the Processor to do or do the right thing. Oh There's more 9a that's an exception and there's these as well But these are actually part of The logic op instructions, so I don't want to implement them right here Okay The in a function to actually match one Really, we want to return the opcode but We also want to be able to distinguish between a map a proper match and a failed match FF is illegal. So let's return that and we also want to tell it where to Stop so this is going to be a helper that given an instruction table will scan the The table Attempting to match what's currently in the pars buffer. So you just want to make a few Slight adjustments. So we're going to store the token length in a global Okay, I don't think we've got to lower. We've got to upper But not to lower Fine Let's just use uppercase So for each opcode Now for each one of these I think this will generate decent code. I don't think it's worth Unrolling this I didn't think it's worth turning this into a loop. Yeah, this means you've got a match So we return the opcode value Otherwise go on to the next one therefore Otherwise, it's a illegal instruction like so right now you want to do something with it. So if The reason why I wanted the token length be public Is it if the token length is three then this might be a An opcode we know that if the token length is not three then it cannot be an opcode so So this is actually going to be The address of the last array member We're gonna have to define length of the total size of The type divided by the size of the member of a type the member of the type so if The opcode is not illegal This means we have found An instance of this instruction. So we're just going to print it for now and Then we continue from the We do not continue from the top We now want to match a New line so we're just going to do a break So here we're going to want to read another token and then we go around again So now if we run it. Ah, right It printed 96 Then it printed one bytes of tokens. So 96 is 6 0 which is Where's RTS on this table, this is the wrong table. Okay, hi 6 0 RTS Good, it's the right one So output byte is going to do the work of adding a bytes record to the to top I'm going to want to be reasonably smart about this So this is going to add a record of the appropriate type This is going to emit a simple byte the reason for doing it like this. Oh Yeah, I know we need to change this to be record add record takes care of Advancing top so right now the reason why we're doing it like that is Here we are going to keep track of Whether there is a half completed Byte Object on the at top. Yeah, we can do better than this. We okay, so We're going to wipe all our memory from RAM top to So all our RAM will be initialized to zero Okay, so when we add a record we are actually Going to look to see if Is there a bytes object on the top of the heap if there is And there is free space in it each record can be 16 bytes long Hang on I'm doing this wrong This conditional actually wants to be down here Okay, if there is a partially completed record If there is a partially completed bytes record on the top of the heap then We take the length we advance top and we update R So this will skip past any half completed record and return a new record if so when we want to omit the bite if the thing on the top of the stack is Is Not a bytes object. We have a bytes record byte record record desker If it's not a bytes record, then it's going to be nothing therefore add one which is of zero length if if the If the length of the record Is 15 bytes and this record is full and we need a new one So we actually want to do this again. So this is going to be like so This will then create If if the thing on the top of the heap is not a bytes record or it's full Create a new bytes record Then get the length right to the byte Increment the length right So what this should do when we do omit byte it should create a new bytes record Put the byte onto it and then when we get down here add record We'll close the bytes record and append a EOF record bad token 12 12 See that's not so great. That suggests that in fact We've corrupted at something it has not read any tokens If I get rid of this mem set does it get better? Yes, it will get better because in fact ram top is the top of memory you want to start writing here There we go Two bytes worth of tokens. That's not right. That should be three bytes So what this should have done is added a record Of zero length so it hasn't advanced top at all, but it's advanced it over. It'll advance it over any previous Record but there aren't any it creates a record This should then Write a byte value To the right place That should be a one all records must be at least one byte Because of the desk or field so this should now give us three bytes Two bytes That's not working because this is actually advanced top by one Which we don't want to do so in fact. We're just going to Do that to bump the field correctly to bump the length correctly right Three bytes of tokens Good, so I think that is working How are we doing for size? Yeah Could be better So we are now emitting simple byte operations. We know She actually probably dump this Okay, that's actually just going to dump the The records buffer into the output file So that when we text dump it we can see that that's an octal. Why is that an octal? Here we go So here is our records to The type is bytes It's two bytes long and that's a zero that should not be a zero That should be a six zero Well, and things are 96 is there This is our end of file record is zero one One byte long of type zero meaning you F Here so this suggests that It's right into the wrong place So the first time through We add a record of length zero We bump the length so it's now one this will be one one in memory We write the value. That's why I forgot to take into account the length of the record header There we go one two six zero and if I change my asm file to put another RTS in and run it six zero six zero, which is exactly what I want the reason why I'm being so anal when it comes to combining bytes records is I Expect to see quite a lot of these and We want to make storage of raw data as efficient as possible Because there's going to be a lot of it Okay, let's go with Full ALU instructions So these are This column essentially I need to find that table again this one So that's going to be these luckily. There's not very many or a One See SDA is a bit special because of course, it's right only so trying to store a store to a Immediate makes no sense We're looking to ignore that for the time being LDA a1 Cnp c1 to be C E1 Okay so if it's Not a simple instruction One thing to think carefully about So I'm passing in the start and end of the table here The extra code needed for passing in the end of the table and doing the comparison here It may actually be faster and smaller To waste an entry at the bottom as a terminator So, you know if the first character of the opcode is zero then just give up We'll look at that later. In fact, this is going to be ALU because that's going to define the How we're going to change the opcode Once we have resolved the argument so here We actually want to pass The parameter Wonder if there's a way we can get away without it for the name being so you need to pass the argument Which will put the result of this somewhere then we're going to add our record and Copy the stuff in whatever it's going to be We can reuse the same type for lots of things So this pars argument is going to have to record what type of argument it is so that it can correctly set be and also If it happens to be one of these or Reference to a absolute address which it knows directly that it actually wants to emit bytes So looking at this table. There's actually some annoying exceptions. So For the ALU instructions immediate are at B equals two for these It's B equals zero So we're going to have to have multiple argument multiple pars arguments routines. This is actually going to be pars ALU argument This is going to return B So the cases when we actually want to change the dressing mode after we resolve all our symbols are Basically turning absolute values into zero page values Zero page values take one byte fewer to encode Also, we're going to have to emit relocations for those so We don't need to do it for this Because these are always two bytes or this or this and in terms of instruction encoding This is identical to this. It's the opcode byte followed by two bytes Likewise, this is the opcode byte followed by one byte So in fact, we can turn one of these into one of these by just clearing a bit and it's Always the same bit It's the bit with value to it goes from 111 to 101 or 011 to 001 so that is in fact So that is going to update the opcode to be the complete opcode Pars ALU argument is also going to have to decide whether The argument that's just been parsed is a simple value like one of these or One of the others that uses a constant or a complex value Which requires the full expression record so we're going to have That's going to be a reference to a variable for and value actually actually Value offset can be stored here in token length. So that's going to be Variable so if token variable This is a reference of something that's using a variable Otherwise It's a simple value and we can do this from bytes So in its bite opcode Amit bite value low bite Amit bite Value high bite and the let's just This to be token variable zero token value equals Now run it Four bytes of tokens and what did we get? Nothing because I've got to actually put anything here So that's going to be LDA and Nothing you haven't that we're not actually parsing anything yet Unexpected token break at the end big to indicate that this is the end of a statement Seven bytes of tokens and we have a Single bytes record containing RTS a one is LDA One of the LDAs followed by our parameter Followed by another RTS followed by EOF excellent Okay, this is beginning to make progress and the size is Yeah Right the next thing to do is to Actually start parsing things Actually before I do that I said earlier about Using terminators here rather than a end pointer. Let's actually put that to test How big are we? to 407 bytes That work I've taken a break and my windows have moved very slightly Okay, that should add an empty element and that should add an empty element So that should have put us up to 243 30 15. Yep. So this now becomes like that like that How big are we? Quite a bit smaller. Yes, interesting Format everything Okay. All right, let's have a look at parsing things Let's go for Um-hmm. Let's just add a another helper here Go here actually That's it Char here It's reading a character from the from the input stream. That should be a char and That is not a char. Okay So we're going to do By which is very simply Because in our parse code, we are going to want to figure out what we're looking at next so If it's a constant value Then we do read it and we read in a constant and then we return The b value for constants is Two we want to shift it left to pressing mode so this is going to be read token C is not a Token number we were going to extend this to deal with variable references later That will have put the value into token value So that should now work Change this to LDA 23 now this is actually going to do the wrong thing unexpected garbage at end of line So what is it complaining about it should have fetched our constant? And that's has put us at the end of the line hmm or so I'm actually going to need to change this a bit. So the reason why Actually, I can do this slightly more cleverly is that We only want to omit a single byte of payload as constant bytes if It's this column We might want to extend this in the future to this column and this column because I'm assuming these are returning Known constant values in fact that we do so if B is 1 2 4 because this has to be in zero page It's there should be brackets around it, but this table doesn't show them 1 2 4 or 5 So in fact the only places where we don't are 0 3 6 or 7 It's four of each that's convenient. Let's stick it like that for now So are we getting this unexpected garbage end of line is actually here 35 that's a hash sign So it must have been through here. We have not been through here. It has not found our instruction Did I get this wrong? Out, okay, so it is searching for LDA in ALU instance Should have found it. Huh? That is wrong. That should be in some name zero There we go bad addressing mode It's not seen the hash sign. I got a space Yes, okay That's because we're peaking a bite rather than an actual token. I'm gonna have to do this differently So this will read and consume a token So if it's a hash sign It's already been consumed Therefore expect constant will have to read another token if however, it's a ID or a number Then we're going to have to deal with it immediately Anyway, this should Solve our immediate problem. There we go. We get a nine Hex seven two, let's change our test file D e that is not the right number Yeah, that is very not the right number. That's our F e Okay, our Lexa up here is that will probably do better I'm Misconverting character into a digit Still wrong. We are starting with token value as zero, which is correct We multiply it by the base which should be the 10 or 16 And we add on the digit this entire expression is complete is bogus Okay, do this way around because we're going down in Numerical ASCII order So at the top is lowercase, then we have uppercase then we have digits Oh five, right. That's not 5d. So the D is Very wrong. So C minus a Yeah, if this is Lowercase a Then D minus a will be 4 plus 10 is 14 or 13 5d. Okay, right that is Moderately incompetent, but still kind of but now it is kind of working. Oh all right, so if it's a Number it must be This form this form or one of the x indexing forms I've got to the other table This also does not show the correct The correct mnemonics ADC should show them Here we go right indirect is Yeah, if okay, if we see a natural number it must be Zero page zero page comma x absolute absolute x absolute y it cannot be Indirect anything with a parenthesis or an immediate so go back to our original table So this is indirect. This should have parentheses This should have parentheses But none of the others do so if this is if we are seeing a number at this point This will eventually become a parsed expression Then it must be One of these so the next thing we want to look for is A comma I am not sure we can do this without adding look ahead to the parser That is being able to cache a token. I don't really want to do that because he can't It's it's like unwieldy in the cache to Cash these things as well, so I think we're actually going to have to do that if you want to say Is the next token a comma? If it's not a comma, we don't want to consume it The thing to be aware of is that peak token will actually update various token variables so if the next thing is a Identifier or a variable Then we'll overwrite the number that we've just read here, but in that situation It's going to be bad anyway invalid So let's just peak it if it's a comma then It's going to be one of these forms. So we want to know whether it's comma X or Not if it's not and the value is small then this is a Zero page form this one That's B equals one otherwise It must be in the abs form B equals three so If it is a comma Then it must be an X or a Y if it's not Then that's a failure The token lengths must be one or is this not an X or a Y how to arrange this let's go for this one if see is the token ID and The token length this one Then we look to see what the value is If it's an X This is the This one abs or zero page comma X Zero page comma X is B equals five Abs comma X is B equals seven If it's a Y Then it must be B equals six because there is no Zero page comma Y option Otherwise, it must be bad. Did we get errors? We did get errors. I should have a return in front of it Okay, so let's edit our test file. So we have LDA So that has actually produced a five five five oh Yes, we did not modify this stuff down here, so zero page zero page That one bite one bite one bite two bites one bite one bite Two bites two bites. So let's see one three six or seven so a five five five a D e five five So a five is LDA zero page a D is LDA abs. Good. That is working So let's go for Go for that right expected X or Y So I mean there's plenty here. So I think we got to here. I Know what I did wrong So we have peaked the comma, but we haven't read it So we do want to read it good. So we have LDA e five five Bd three four one two Bd abs comma X that is correct B nine Two one four three B nine. Yeah, that's abs comma Y. That's correct B five one two. Don't think that's right. Oh wait, that's the end of a bytes record. So yes B five Then we start a new record one five that is Wrong value zero page comma X is this one. So it's got the right opcode. It's got the wrong value Followed by B nine Two three Oh, oh, which is correct because this is the 16 bit abs form there isn't a zero page version of that Oh, hang on. No, no B five one two is the opcode Followed by the the operand the address zero page address then we get the bytes record Then we get B nine two three. Oh, oh RTS and a file That is working Okay, right the next thing indirect This is this form Or this form And syntax It's not entirely obvious Yeah X comma in it's got the parentheses around the whole thing in comma Y does not so We consume the parenthesis. No, we've already consumed the parenthesis. We now need to read a number That's who read number It's not a constant You can use an expression there that puts the value into token value we now read the Next following token it can either be a closed parenthesis or a comma. So if it's a closed parenthesis Then the next thing must be a comma and here in fact If it's not a closed parenthesis, then it's going again. It has to be a comma So this should read the X or the Y. I think actually I'm going to put some helpers in So this is going to return a if it is X or If it is Y Return otherwise produce a error So this then gets simplified to expect X or Y And we know it cannot be anything else So here we can say Z equals expect X or Y if C is not This is closed parenthesis comma Y. So it's this. So this has got to be a Y So we know that this is now this column, which is B equals 4 right this one round We have the comma Then we have the X or Y This has to be an X Therefore this must be This one We need to consume this closed parenthesis Oh, yeah, and after we have done that We need to Consume the closed parenthesis there All these expects can be commoned out with a great deal of ease Yeah, Klang doesn't know that fatal does not return Probably There's probably no attribute for that Okay So where is our print i coming from we've got some debug tracing Not there Here Here right that looks like it's worked Let's double check B1 1 2 is B1 1 2 indirect comma Y a 1 2 3 a 1 in direct comma X. So let's just put a This in see what it does Bad addressing mode. Yep, and let's change this to a number Expected X or Y good Uh, yeah, we're going to put line number information in eventually Right So this gives us parsing constants in ALU Operations We're also going to want to put labels in and symbols So let's go down to here parse So if it's an id then it's an instruction and we go down the instruction code path If we reach here Then we know it's not an instruction Therefore the only thing it can be is a symbol definition But yeah, it can only be a simple definition So we have the Currently the parse buffer contains the name So we need to add a symbol. We haven't done anything to the symbol table yet So that's just going to That's just going to add a symbol That does actually assemble. Okay, so record management And symbol table management Our symbol table is going to be really simple What we're going to have let me actually just define that is Hmm actually and I might change my mind about what I was going to do there So what I was going to do was have a record which contains the symbol type The variable value of it that is if it's referring to another symbol The offset And the next symbol in the chain This allows us to Do a fast backward search Starting with the most recently defined symbol This will be important when we want to implement scopes that will happen a lot later and probably not in this video the other thing we could do Is to walk the the records forwards Starting from the bottom of memory This means that we don't need a next variable It means that looking up symbols is slower because we have to look at every single record but Because we're walking the chain in that direction. We can't implement scopes by simply uh Moving last symbol here to the last symbol of the previous scope Thus making all the symbols defined since then uh inaccessible Okay, and of course the name Let's leave it like this and Let's make these all packed on the 6502 You shouldn't need any alignment, but I have observed that uh LLVM must up will occasionally to align things which is kind of strange So we take a look for If there are no symbols to find Then you don't find anything. Okay. We start with the last symbol Get a pointer to the symbol Uh certain thought certain thought Our records are limited to 16 bytes The record header can names one two three four five six seven eight So that means we get eight byte symbols, which is not enough I can change this easily enough. We don't have very many types three bits will do So we then also do need to go through and change a whole bunch of o x f So that actually wants to be an e one Okay, that means that a record can be 32 bytes So 32 minus 8 is enough name So this should get the length of the Do we have an offset of we should say pointer So this gets the length of the string that we'll want to look up If this is different from the token length Then it's obviously not the right symbol So we only need to actually do any kind of comparison if they match and to do the comparison. We are just going to Buffer the name and the length. Okay, this means that we have found our symbol Return r otherwise Go to the next one on the chain Just like that so in fact We're going to change this to While s is not null iterates like that Right adding a symbol If it already if there is already a matching symbol Don't add it. There's also going to be a separate maybe add Then is going to be The length of the token Plus actually The length of the token Plus the overhead we can then add a record Which is going to be the record symbol Or the length we copy name in The fields inside the symbol Will automatically be initialized to null So we have now correctly added Created a new symbol We now need to know what we're going to do with it To do that we need to look at the next token If the next token is a colon, we're defining a label The symbol needs to be initialized to the current program counter If it's an equal sign This is a normal variable So we're actually going to read a number and initialize the This needs to change to expect value actually Like so and in fact, I've forgotten a bit in Add symbol which is We need to initialize Uh Or we need to add it to our linked list So how's this going to work? Let's get rid of our instructions. We're just going to keep an rts in place And we are going to define A value All right, I forgot to put Equal signs into our lexer Unexpected garbage at end of line So we should have read the number We have read and consumed the token, which is the id We then read and consume the Thing after And then the number Oh end of the file That is a valid Expression terminator Okay, 18 bytes of tokens So uh 2260 is our bytes record Two bytes in it Followed by 6d Which is a symbol record 00 is the variable reference 01 It's easier to see is the value which is One Followed by Wait a minute, wait a minute Flags Yeah, okay flags Variable reference value Next symbol Name F N O R D Byte record rts Finish That looks good So the next thing Is Uh, well we've we'll have various different types of symbol Such as label definitions that will be defined to the current program counter Uh Label definitions where we have not seen the label yet Constant values like this one. I don't think there's anything else actually That's nice Oh, uh, and we're also keen to keep track of what Memory area the variable is referring to So it can be in zero page Or in the main memory Or be an untyped constant We need those in order to generate relocations and that will be Done there The other thing is we're actually going to need to start parsing these so these expect numbers should actually turn into an expect value So if it's a number Then it's a number if it's an id Then we need to look the symbol up And return a variable reference But I think i'm going to do this next time because this is a multi-part series I don't want to make these too ridiculously long See you next time


For more videos on people's struggles, please subscribe to our YouTube channel. And we also want to thank Cuba, because without Cuba, many, every single Caribbean country would have had great difficulty in fighting this COVID pandemic. We have Cuban doctors and nurses and technicians working in our hospitals, ensuring that we can do everything possible to keep people alive, those who have been infected by COVID-19. And so we want to thank the heroic people of Cuba for the usual generosity. And therefore, we cannot consider the help that Cuba gives to us in all of need and to define it as human trafficking. What is still exposition on this particular matter? This is a fundamental question that we have to ask ourselves. And we also want to thank the heroic people of Venezuela, who in all of their challenges with these sanctions have been able to reach out to us with PPEs and testing kits when many of us in the Caribbean were running very low, or unable to access those testing kits and PPEs because they were blocked in other parts of the world. America para los americanos que nos consideran patio trasero, eso sigue intacto, sigue así. Más allá de lo que hoy se puede decir. Y el bolivaranismo, el latinoamericanismo, el unionismo y la celad es nuestro camino.


Florida National Guard soldiers from the 53rd Infantry Brigade Combat Team prepare to mobilize as part of an army exercise called Defender Europe. The primary exercise that we are affiliated with is Immediate Response 21 which takes place in Croatia, Bosnia-Herzkovena, North Macedonia, Greece and Albania. We are training with partner nations as well as completing our annual training objectives. Captain Britton, the 53rd Assistant Training Officer says that they are taking many safety measures to prepare. We're mitigating risk with regards to COVID by conducting rapid antigen tests, PCR tests prior to deployment, as well as implementing other mitigation factors such as wearing masks and trying to social distance wherever we can. From the 107th Mobile Public Affairs Detachment, this is Sergeant Jacob Turenna.


So, the first thing on the threat landscape, so according to this website, WordPress vulnerability database WPvolumDB.com, it identified the 11,647 different vulnerabilities in WordPress, the core software in plugins and in different themes. So, there's thousands and thousands out there of different vulnerabilities that hackers can take advantage of in order to gain access to your website. Just as a recent example, you know with the GDPR regulations, there was a plugin that was created to easily help website owners make their websites GDPR compliant and that plugin was found to have had a vulnerability that would allow a hacker to get admin access to the website. So, a hacker could simply scan your website, find out you have this vulnerability, take advantage of it and next thing you know, your website is down and it's been defaced. So, these are some of the threats that are in the WordPress landscape. And WordPress, as we all know, is a market leader in the content management space. It powers almost 60% of content management systems which translates to 32% of all websites on the planet. This is according to WPvolumDB.com and therefore it's a huge target for hackers. Hackers will attack WordPress websites, both big and small, with over 90,000 attacks happening per minute. So, you have two things at work here. You have a software that is very popular, that is used by all sorts of people, that therefore means it's a huge target. If you want to take over a website and you invest in exclusively attacking WordPress websites, your chances of success are going to be higher. It's kind of like why there's more viruses on the Windows platform than there is on Mac and Linux because the target is much smaller. So, because we're using the most popular website software in the world, it makes it a big target for hackers, right? Sorry, go back. So, therefore, it's a huge attack and then we have those 90,000 attacks going on every minute. So, what some of these hackers do is they have automated software that simply scans the entire Internet. So, for example, if you are running that vulnerable GDPR plugin, what these hackers do is they simply have software that is scanning every website. So, it checks, do you have this plugin installed? If you do, it's going to automatically attack your website, right? So, the landscape for attack is huge and as well the people who are out there who want to take advantage of you, they have lots of opportunity to do so, right? So, the top threats that we face, we have these brute force attacks where simply the attacker would try different passwords in order to find one that works so that they can log into your system. There are these file inclusion exploits. This is simply say, for example, on your website you have a facility for, say, it's an application form, say you're running WordPress for a school, for example, and people can apply and they can attach their school certificates as an attachment in their application. So, a hacker can attach a malicious file. So, something that's not what you're expecting. Maybe you're expecting a PDF or a picture or something and they attach something else like a PHP file with code and then that ends up exploiting a weakness in your website and granting them access. And then there's also XSX and SQL injection which are different methods of taking advantage of the way your website is built in order to gain access or to infect users of your website. Right. Next slide. So, in order to protect your website, given this huge threat, what do you do? So, there are a number of different things that you can do. There are a number of different practices that you can use in terms of how you create your website. But today what I'll be addressing because we want this to be useful to people of different skill levels regarding WordPress. An easy solution is security plugins. So, there are a number of different types of security plugins. For example, there's Jetpack. Also, Jetpack being one of the general sponsors for this word camp. Yay, Jetpack. There's security. There's Vaultpress and also WordPress security. Now, this is just a handful of different examples. I tried picking the ones that had the most downloads and the most stars on the WordPress plugin repository. But there's loads and loads of different plugins available for WordPress. So, I would encourage you to also do some research in addition to this list. Right. So, if you do choose to go with one of the plugins on the list or any other one that you find in your research, there are some common features that you'd want to look for that make the plugin as helpful. Right. So, number one is automated site backups. Right. In as much as we may try to protect your website or, you know, implement all the measures possible, you know, sometimes you may still get hacked. So, it's important to always have up-to-date backups of your website so that in the worst case scenario you always have something that you can roll back to. Right.  Right. The second thing is also malware scanning. Again, you may already be infected or you may still get infected regardless of the measures that you may take. So, you want to pick a security plugin that has malware scanning features. What this means is that, you know, the different files in your WordPress where you have your different themes, what some of the hackers will do is they'll change some files in your themes or they'll change some files in your plugins. And then those changes are the ones that allow them to continue to hack your website or have access to your website. So, what the malware scanning does is it lets you know if any of your WordPress files have been tampered with by a hacker. Right. So, this will give you early warning of that. The third thing is IP blacklisting. Right. Which I think is pretty useful especially regarding how a lot of hackers use automated attacks. So, with IP blacklisting what that means is the plugin will block access to IP addresses that are known to be carrying out malicious activity. Right. So, an IP address that's been used in other attacks if that's known about the plugin can block it automatically. There's also anti brute force. As I explained earlier, brute force is when a hacker will try password after password after password essentially trying to guess your password. Right. That's why we are advised to not have dictionary words in as a password like, for example, having yesterday as a password. Right. Because these automated systems will try all the words in the dictionary. They'll try different combinations of numbers. So, you want to have a feature called anti brute forcing where after a set number of failed attempts at logging in, that person will be blocked for a certain amount of time. Also, there's the issue of automatic updates. So, again, a lot of, as indicated earlier, there's thousands and thousands of vulnerabilities that are out there and you want, and in order to, oh, I guess. Okay. There are thousands and thousands of vulnerabilities out there and a lot of them are patched. So, for example, if you have that vulnerability in the GDPR plugin, it was updated and it was taken care of. However, in order to benefit from that patch, you need to update your plugin. So, you need a system to make sure that everything is continuously updated and a lot of these plugins do handle that for you. So, now onto the meat and bones. We'll be doing a deep dive into the word friends security plugin. Basically, it's a firewall and malware scanning plugin for WordPress. It's available for free in the WordPress plugin directory. So, it has a freemium model. So, some basic features are available for free and then for other features, you have to pay for it. However, the free features, I think, are quite extensive and you will benefit a lot even if you don't get the premium one. It has over 2 million active installations and it is regularly updated. And when looking for not only security plugins but any kind of plugin for any purpose or any theme, you do want to look for a theme or plugin that has a lot of installations so you know that there's going to be a lot of support. If you run into issues with that plugin, you know there's a big community of users that you can ask for assistance with. And as well, being regularly updated means that the next time you upgrade your WordPress, it's likely that that plugin is going to continue working. So, the first useful feature of word friends is site scanning. So, as I indicated before, it will automatically scan your website and your hosting for things like back doors, vulnerability. So, if there are vulnerabilities that haven't been exploited yet on your website but can be exploited, it will alert you to that danger. It will alert you to other malicious things like, for example, malicious comments. So, there's this technique that hackers use that they can use against your website where they can comment but with a funny link. So, it's not necessarily hacking your website but it was hacking users of your website. So, it's also something that you want to guard against because if people are coming to your website and end up leaving with viruses, that doesn't bode well. This is after a scan and it's basically showing us here that this plugin has a vulnerability and sorry, yeah, this plugin was removed from the WordPress database meaning that you probably don't want to use it anymore which means because it means that it's no longer going to be updated and will eventually become a security danger to your website. Also telling us that the particular theme needs an upgrade. So, basically it gives you a summary and makes it easy to digest what the security issues are with your website. It also has live traffic monitoring. So, you can see in real time the visitors to your website and all the traffic that's going on. So, here you could see someone from Brazil try to access the website, someone from Zim, etc., etc., and the times. So, if you were attacked or an attack was happening, you would be able to see here you can see like funny traffic. If there was a single person or a single IP address continuously accessing the same resource, you can have insights into this and you can then take steps to stop it from happening.  I believe you can set the frequency of this to weekly or monthly. I had mine on weekly and it basically summarizes what has been going on on your website and just gives you an overview. This was all of the protection that's happening. It's done automatically and in the background. So, you can even ignore these if you want, but it basically just gives you a summary of what's going on. Well, probably not a good idea to ignore it if you are being attacked, but it's not as intensive in terms of upkeep. So, here in this summary it tells us these are IP addresses that WordFence automatically blocked. You can see this one tried to access 700 times, which is not natural. So, we can tell that this is malicious activity that should be blocked, right? It gives us regular email updates and the status of our website. There's also a useful feature called rate limiting. Again, it automatically blocks users after a certain number of failed login attempts. So, blocking those brute force attacks we were talking about earlier. Here you can see it gives us a summary of the login attempts. You can see successful attempts to login. So, you can even have auditability in terms of who was accessing your website. Are these IP addresses of people you know, people who should have access to the back end of your website? It also has IP address blocking, which is a very useful feature. One useful application of this is if you are really security conscious, for example, what you can do is you can block access to your admin area and say, for example, you can have geographic access. So, you can say if you are based in Zimbabwe and all of your admins you know that they're in Zimbabwe, you can block anyone who's not in ZIM from accessing your back end, which will dramatically reduce the opportunity for anyone to attack your website. It means that any hacker who's not in ZIM can never have access. One also really good feature about WordFence is they have the WordFence network. So, basically everyone who has the plugin installed in their computer is part of this giant network that is powered by artificial intelligence and shares information. So, each website running the plugin shares information about attack threats. So, for example, if I'm attacked by a particular IP address and someone else, you for example, are using WordFence plugin but haven't been attacked because I've been attacked and WordFence has blocked that IP address for me, it blocks it for everyone. So, even attacks that you haven't been subject to, you are protected from as a result of being part of the WordFence network. And you can see here this graph that's showing it blocking about 5 million attacks an hour from the entire network of everyone who has the plugin installed. So, some further resources that you can use to protect your website or to audit the security of your website. There's wpscan.com. Basically, you just put in the URL of your website and it's going to automatically scan your website and let you know all of the different security issues that you may have. For the developers in the house, there's codex.wordpress.org. You should be going there anyway but they have this special section on how to harden WordPress and to make it secure. So, this goes much further in depth than simply installing a plugin but here you're securing it on the server level and on the code level. And we have wp beginner.com. They have this article called the ultimate WordPress security guide. This one being more friendly to users of all skill levels so you don't necessarily have to be a developer in order to benefit from this. Basically, this again guides you on different steps that you can take to protect your WordPress website. Make sure that it is absolutely as secure as can be. There are some sources that are used in compiling this presentation. Thank you very much for your attention. If there's time for any questions, I'm willing to entertain questions. If not, then we can speak during the break. Thank you very much.


The study used response surface analysis to optimize the composition of an Al-7075 green composite. The results showed that the optimal composition consisted of 7.2% rice husk ash, 6.2% glass powder, and 695 degrees Celsius stirring temperature. This combination produced a desirability value of 0.910 indicating that it is highly suitable for predicting the desired responses. This article was authored by Olanrawaju Sona Desana, Abiyomi Adewale Akinwan, Al-Yawadisana Biedin Balagan, and others.


From Soldiers Radio and Television, this is the Army Now. Women gathered in a rose garden selling their wares is not a typical occurrence in Afghanistan. You will see 30 women who have received training on business setup, bookkeeping, customer service, marketing, and so on. While this bazaar was held in a secure compound for the women's exhibit, a typical market in Afghanistan is composed of rougher edges and men's faces. We rarely see women in the shops in the main market. One of the topics of discussion was the Dawa has recently acquired some land that she hopes to make a women's market in order for these female entrepreneurs to go and sell their wares over there. Although plans have not been finalized for the women's market, this could be a sustainable option for Afghan women's economic growth. Army Sergeant Rachel Badgley, Parwan Province, Afghanistan. That's the Army Now.


Hello and welcome to the session. I am Shashi and I am going to help you with the following question. A survey was conducted by a group of students as a part of their environment awareness program in which they collected the following data regarding the number of plants in 20 houses in a locality. Find the mean number of plants per house. This is the given data. Which method did you use for finding the mean and why? First of all, let us understand that mean is equal to summation f i x i upon summation f i. Now in this formula, x bar is the mean, f i is the frequency and x i is midpoint of the class interval. Or we can say it is class knock of the given class interval. This is the direct method of finding the mean and we will use this as our key idea to solve the given question. Let us now start with the solution. First of all, we will rewrite the data given in the question. Now the given data represents number of plants and number of houses. Now first of all, let us find out class mark that is x i for every class interval. Let us recall that class mark is equal to upper class limit plus lower class limit upon 2. So 2 plus 0 upon 2 is equal to 1. Similarly 4 plus 2 upon 2 is equal to 3. Here also midpoint of this interval is equal to 5. Similarly 6 plus 8 upon 2 is equal to 7. Here 10 plus 8 upon 2 is equal to 9. Here midpoint of this interval is 11. Similarly midpoint of this interval is 13. Now we know number of houses represent the frequency so we will denote it by f i. Let us now find out the product f i x i. Here 1 multiplied by 1 is equal to 1. 2 multiplied by 3 is equal to 6. 1 multiplied by 5 is equal to 5. 5 multiplied by 7 is equal to 35. Similarly 6 multiplied by 9 is equal to 54. 2 multiplied by 11 is equal to 22. And 3 multiplied by 13 is equal to 39. Now we will find out summation f i by adding all these frequencies. And we know this is the data for 20 houses. So sum of these frequencies is equal to 20. Let us now find out summation f i x i. Summation f i x i is equal to sum of all these products. And sum of all these products is equal to 162. Now from key idea we know mean is equal to summation f i x i upon summation f i. Now substituting corresponding values of summation f i x i and summation f i in this formula. We get mean is equal to 162 upon 20. Now we will cancel common factor 2 from numerator and denominator both. And we get mean is equal to 81 upon 10 which is further equal to 8.1. Here we have used direct method for finding the mean. Here clearly we can see given values of f i and x i are small. So it becomes easy to multiply these corresponding values. So we can say direct method of finding the mean is used when values of f i and x i are small. So the required answer is mean number of plants per house is equal to 8.1 plants we have used. Direct method for finding the mean because the numerical values of x i and f i are small. This is our required answer. This completes the session. Hope you understood the solution. Take care and have a nice day.


Since we are going to heavily use the notion of Coindistopology and in particular the so called Compactly Generated Topology, let us recall a few fundamental facts about them which will be useful for us throughout especially while dealing with CW complexes. It may be recalled that a special case of Coindistopology was introduced as well as used in part one. So, we assume that you know these things but let us recall these things in somewhat quick fashion. That is one of the reasons why the module 6 is released to you before module 5 that we are going to use is Coindistopology in module 5. So, let us begin with the general theorem here namely start a family of topological spaces. I have denoted them by xi comma tau y because I want to specifically mention these tau y's here. Be a family of topological spaces and look at some family of functions from xi to x. So, which is denoted by curly f. These are just synthetic functions because I have not taken any topology on x right now. Now, you put tau f is equal to all subsets of x such that for every i their inverse image belongs to tau i. So, inverse image must be an open subset in tau i for every i. So, that is a collection and the statement is that tau f is a topology on x with the property that each f i is continuous. Moreover, it is the maximum topology on x with this property. The proof is very straightforward and elementary and straightforward means whatever you are supposed to do you have to there is no trick involved here. So, look at this for example, continuity of f i follows because f i inverse of an open set by definition open set in tau f by definition f i inverse must be tau i in open in the x set. So, it is very clear that if this is a topology then with respect to this one each f i is continuous verifying that this topology and the maximality of this topology etc is easy. Following the above theorem now make a definition. The topology tau f defined in the above theorem is called topology of an x co-induced by the collection f i. To indicate that it has something to do with f we will denote it as x comma tau f. So, we can have a shorter notation by x f. So, it is the coexist topology with respect to this family f. Most of the time we will be considering a special case wherein each f i is an inclusion map of the sets x i to x where x is a larger set and all these x i's are subsets of x with their own topologies. So, that is the situation that we want to apply this one. So, let us see in this special case what are the properties of this topology. Let x be the union of x i's where each x i is a topological space. Let tau equal to tau of eta be the topology on x where this co-induced by the family eta which is eta i from x to x are all inclusion maps. I have also assumed that union is precisely equal to x here. So, that is a special case here. A subset A of x is open or respectively closed in tau if and only if A intersection x i is open or respectively closed in x i for each i. So, this is the first statement of the theorem. The second statement says that if you take the disjoint union of x i's then x being the ordinary union will be automatically a quotient set. It is a quotient map. So, that let us take the quotient map q of x is nothing but the inclusion map whatever x is in some one of the x i's. So, take eta i of x for x belong to x i. Any surjective map or surjective function is a quotient function set theoretically.  So, when you take disjoint union, the co-induced topology is the same thing as the so-called disjoint union topology which is nothing but a subset is open if and only if you know each part in each A intersection x i is open inside x i. All those open subsets from various things take the union they are the open subsets of disjoint union x i. So, that is the simplest case of co-induced topology. From there, we take an arbitrary union and get this one. Once again, verification of A and B are very straightforward.  So, and then B is an immediate consequence of A because in the quotient topology is also what the definition definition of quotient topology is that something is open here if and only if it is inverse image in each x i is open, inverse image in the total union is open which means intersection with each x i is open. So, you get this one. So, now, we would like to make one more special case in which you can extend the neighborhoods. So, for that, we go back to proposition. Let me just recall proposition 1.1. So, here we had this family of attached cells attached to a y. So, x was obtained by attaching cells to y. Then we had these extensions of neighborhoods. So, similar to this, this is much very much elaborate and much more structured. But there is a very simple extension of this one in the purely topological spaces and that is what you would like to draw to your attention to. So, let us see what is that. So, come here, let y contained at x be a closed subset. That is all I am not, not that x is obtained by attaching cells and so on. Suppose A contains at x is any set and B is an open subset of x such that A inside B. Suppose U is an open set in y such that A intersection y, U is an open subset of y.  Then there exists an open subset V prime in acts such that A is contained inside V prime, contained inside V and V prime intersection y is precisely U. So, what I have done is that for the part of A inside y, U was a neighborhood inside y that U gets extended to a neighborhood of A, extended neighborhood of A inside the whole of x, but contained inside the original neighborhood V. So, that is the meaning of this. The V prime is contained inside V, V prime intersection y is U. So, this is what I mean by extending neighborhoods. Okay. You can extend the neighborhood, but at the same time you can control it so that it is not too large. So, it is contained inside and already it is a neighborhood. Okay. So, this is an ordinary statement for subsets from a closed subset from y to x which we can now generalize to a large extent. So, that is what we are doing there. So, the proof of this one is very straightforward though it looks somewhat complicated and all that. So, here I have drawn a picture. So, in this picture, so whole area is you can take it as the whole plane as x and this square is y. Okay. Then this hexagon represents A. Okay. A intersection is part y. Okay. This part y that is contained inside this U intersection y. Okay. This dotted thing is U intersection y. I deliberately return now like this because U may be as an open subset could be anything that is you do not know where it is going. Okay. But it must be intersection which you contain inside V. V is this ellipse. The area close by ellipse. Okay. So, under this situation what I am doing here is the proof. Let W contained as x be an open subset in x such that W intersection of y is U that is the meaning of that U is open inside y. So, y is a subspace topology. So, there is an open subset like this. After that you just take V prime equal to V minus y. So, this part, open part here. Okay. Union W intersection V only the portions, you know W intersection V part you have to take. So, this part for example is outside V. You should not take. Okay. So, once I have written down this one, all that you have to verify that this V prime is open and A intersection y is containing A, V prime intersection y is exactly equal to do and after that is very clear. V prime is containing that V is very clear. Okay. You verify that one. Yeah. So, that is just one set at a time. Now we want to generalize this to a larger extent. So, here again take x to be the union of all the x i's, each x i is a closed subset of x i plus 1 in the next one. Okay. So, they are subspaces in some sense union, I have taken subspace is closed subspaces. Okay. And x is given the core induced topology with respect to the family of inclusion maps from x i to x. x itself may have no may not have topology to begin with. Each x i is topological space and each x i is a subspace of x i plus 1 and it is a closed subset of x i. So, this is the hypothesis. Okay. And then we will give the topology x eta to tau eta to x. Okay. That is the core induced topology. Now suppose B is an arbitrary subset of x contained inside W. Okay. And W is such that intersection with each x i is a neighborhood of B intersection x i. If B is a subset of x, B intersection i will be a subset of x i. This W intersection i is a neighborhood of B intersection x i and x i. Then W itself is a neighborhood of B in x. Recall that a neighborhood means what? Okay. Something is W is a neighborhood of A means what? There is an open substitute such that A is contained inside, U contained inside W. This is what we have to prove finally. Then W is a neighborhood of this one. I have to find an open subset. Now here neighborhood, W intersection x i is a neighborhood. We are not given any open set. There is some open set. So, each time you take open subset, they may be different. When you intersect with previous x i, they may not coincide with the old one and so on. That is the problem here. Otherwise, suppose I change the neighborhood to open neighborhood here and open neighborhood here, then this is obvious from the definition of coidist policy. W itself is a open set. So, point is that open neighborhood has been replaced by arbitrary neighborhood here. That is why you have to prove this state. This comes from step by step by the previous lemma. Okay. So, we have to the previous lemma with each time take x equal to x i plus 1 and y equal to x i. Then x i, then y is a close subset of x i, x and A equal to x i intersection B. B equal to x i intersection W for each time. We then have, this is a neighborhood now.   This is the statement of the lemma. This is the lemma gives you that one. So, this you do for each i, then you take u equal to union of u i's. When you take intersection of this one with x i, it will be precisely equal to u i.  Intersection with that one will be again u i and so on. So, they all will be equal to u i. Therefore, what happens is this u difference opens up a sector. So, B is contained inside u because P intersection x i is contained inside u i and all of them are going to double intersection. So, finally, it will be contained. Now, we shall study what is the relation if at all. It is not a complete answer, but what is the relation between the topology on x and the cohesion topology on x. Suppose you start with topology on x and these x i's are subspaces. Now, you can come back and give the cohesion topology on x. Is there some relation? This is what we want to study, but we are not going to complete answer here. But some sufficient conditions on which this happens is our, is this theorem now. So, start with x equal to u n of x i, where each x i is given a topology tau i. Assume that the following compatibility conditions are satisfied. Namely, this one is for each pair i j, the two topologies on x i intersection x j tau j, induced from x i tau i and x j tau j are the same. So, this is subspace topologies on the intersections coming from the two different sets must be the same, that is the first condition. Second condition is a more generous condition. For each pair i j, intersection x i x j is an open subset of both x i and x j. You can replace open by respectively closed subsets. So, that is a separate statement. For all of i j's, you have to do that. So, either you take all of them open or all of them closed. So, that is cc2. With these two conditions, now if tau is the induced or coinduced topology on x, with respect to the family eta i, that namely inclusion maps, then the subspace topologies tau x i, you see tau i's are already given topologies. Now, subspace topology tau x i is coming from tau eta. For each x i coincides with tau i, hold a topology. Moreover, each x i is open or closed in x according to condition cc2. So, this is the beginning of our attempt to understand what happens to the x itself on x i's. So, what we did? We have started with some topologies, gave the coinduced topology on x, then look at the subspace topology. Will those be the same? That is the question. Whatever topology you have on x, if these are subspace topologies on each x i, then you go to intersection. There will be two different ways of doing this. Namely, first come to x i and then go to x i intersection x j or secondly, come to x j and then take the intersection. Both of them will be subspace of the original x. Therefore, they must coincide. Therefore, condition cc1 is a must. So, this is not, this is a necessary condition. We have to put this one, no matter. But this condition is not necessary. This is a generous condition. This will actually imply whatever we want. But whatever we want may be there without this strong condition. Okay? So, we have to be somewhat apologetic about this one. That is such an affirmative answer. Conditions cc1 is a must. It is a necessary condition. Second condition is not necessary. But it is sufficient. It is, it is a stronger condition. Okay? The proof is very straightforward. We need to check that the original topology tau i is the same thing as tau eta restricted to x i's. Okay? For each i. Of course, by the definition of tau, what is the definition of this tau, this tau eta in coin topology, each eta i is a continuous function from where to where, from the original tau i to tau restricted to x i. Therefore, tau little x i is contained inside tau i. Open subsets of this one will have to be open here. Okay? The inclusion map itself is continuous. Therefore, this must, one way is clear. Now, let us prove that tau i is contained inside tau restriction x i. Okay? So, first consider the case when x i intersection x j is open in both x i and x j. So, we are using the second condition also now. And second condition has two, two different cases. One is all of them open, one all of them close, second one. So, let us take the case when x i intersects x j open in both x i and x j. To begin with, this condition itself will imply that each x i is open in tau. Right? Because fix x i, when it is open in tau in the coin superpower by very definition, intersection with each x j must be open. And that is what it is. So, each x i is open in tau. But then if a is open in x i, it will be open in x also. Right? Open subset of an open subset is open. Okay? If a is an open subset of x i, that will be open in x i also. Therefore, tau i whatever you take tau i, okay? tau i means what some open subset in x i must be open inside tau. So, it means x i is contained inside tau restricted to x i. Okay? The same way now you can use for closeness also. Okay? The second case is similar. x i intersect in x j is closed in x j for every j implies x i itself is closed in x tau. Hence, each closed subset of x i, closed subset of a closed subset is closed. Okay? So, it is similar. All right? So, there are nice theories here about the first question that I raised here. But we will not need them. So, I am skipping them. So, let us now go to another special case of this coinduced topology namely compactly generated topology. Okay? So, we make a notation here. Take any topological space to start with. Okay? Then look at all the compact subsets with their induced topology subspace topologies. So, there is a family of subsets, right? Topological spaces. And look at the inclusion maps. So, those maps will coinduce a topology on x. That topology is denoted by x w. This is the classical notation is referred to as weak topology for some reason. Okay? So, that is why x w usually one calls it weak topology. Topology coinduced by a set of compact subsets of x. Okay? So, what is the relation between x and x tau, x and x w? That is what we would like to understand. This is going to be very, very important. So, pay your attention. So, take start with any topological space. The very first thing to notice that is identity map is continuous. What is the meaning of this? Every set which is open in x is already open in x w also. So, in other words, there are more open sets here. So, x w is final than x. Though it is called weak topology, don't be under the assumption that it is weaker than the original topology x. It is not that. It is finer. Okay? Identity defines a bijection of compact sets in the two topologies. Though there are more open sets here, the set of compact subsets is the same as set of compact subsets of x. That is the beauty of this topology. So, that is part b here. The third condition is that, third statement is that if f from x to y is continuous, then the same map f, when you change the topologies on both sides to weak topology x w to y w, it is also continuous. Okay? So, let us see how a and b work out. Then I will leave c to u to work it out. All right? Recall that a subset S of x is closed in x w. I am just recalling the definition of weak topology here. If and only x intersection k, where k is a compact subset, it is closed in k. This should happen for every k. That is the meaning of that x, something is closed in x w. That this topology is compactly generated or co-induced by the family of compact sets. This will be the case if S itself is closed in x. If something is closed in the whole space, intersection with each subspace will be closed in that subspace. So, in particular, intersection with each compact set will be closed. Okay? So therefore, this proves a, namely something is closed in x, then it is closed in x w. By taking the complement, it is open in x, it will be open in x w. Okay? Now the second one, if k is compact in x w, you have to show that it is compact in x. But identity map is continuous. Image of a compact sets is compact. Therefore, k is compact in x also. The converse is important. Take k, which is a compact subset of x. Why it is in compact in x w? Okay? That is what we have to show. Let k be a compact subset in x. Let f be a family of subsets of k closed in x w with finite intersection property. Now I want you to remember that to show something is compact is the following. Namely, take a family of closed subsets, which is finite intersection property. Then show that intersection of all these is non-empty. Okay? By De Morgan law, this is the same thing as saying that if you take an open cover, then there is a finite sub cover. Okay? Just by taking De Morgan law, these two are equivalent. So, I just wanted to recall that. So, I am going to use that property here. Let f be a family of subsets of k closed in x w with finite intersection property. By the very definition of x w, for each f in f, these are closed subsets, we have f equal to f intersection k. Okay? Just of k after all is closed in k. Okay? See, they were closed subsets of x w means now f is a closed subset of k. Since k is compact, in the ordinary interpolation, we have passed through the ordinary interpolation here, an original interpolation. k is compact, follows that intersection is non-empty. So, this is set, intersection of all f is non-empty. It is what we wanted to prove. All right? So, we will use part three, how to show this is continuous to you. Okay? However, let us make now this definition. A space is said to be compactly generated if and only this identity map, which we have seen that it is continuous, must be a homeomorphism, which means that identity map the other way around is also continuous, which just means that the original open subsets remain open and nothing more comes. The topologies are the same. Okay? So, this x w is compactly generated always. If x is equal to x w, then x itself is called compactly generated. Okay? So, here is a remark. If you use this one, everything will be easy for you. So, what are these? Take a compact subset k, then a function f from k to x is continuous. If filled only if k to x w is continuous. Okay? k can be any compact space and f could be any function. Suppose now x is compactly generated, then a function from x to y is continuous. If filled only if every compact subset k of x, the restricted function f restricted to k from k to y is continuous. This fact b is going to be the key to understand compactly generated topology and its use in constructing continuous functions. Okay? So, this will be used again and again in the CW complex. I have emphasized this one several times. In the situation of this theorem, theorem 1.6, I want to write this, let us say. So, this is an exercise. Theorem 1.6, assume that x i is half star. Then prove that x is half star. Let me just recall what is this exercise? What is this theorem? The theorem was that union of x i is one contained in the other and so on. And then extended neighborhood you have to. So, you may have to use this to prove that exercise. Okay? It is not very difficult but you have to work out. So, that is roughly what we wanted to tell about coinduced apologies and compactly generated apologies. Okay? Thank you.


The Maritime Theater of Missile Defense Forum conducted the At Sea Demonstration 2015 on the North Atlantic Ocean under a multinational effort. It's historic and it's doubly historic because it's not just the United States Navy, but it's a group of eight nations that have come here with 11 ships that are totally interconnected and interneted that have demonstrated this capability today. It's extremely significant that we've demonstrated with a live test the ability of a flotilla of ships to simultaneously take out a missile threat, a ballistic missile threat, and a cruise missile threat that's never been done before. The goal of the Maritime Theater of Missile Defense Forum is to provide protection against a proliferation of short, medium, and long-range missiles.