So I'd like to know a little bit about you. So please raise your hands. Who's Java developer? Isn't it? Anyone else? Who's not? There's a marker. Everyone of Java developers work is Java, right? Crazy. Thank you. How many of you already drive Java 9? Okay, that's good. I want to focus on common Java developer, so I will not go too much details, but I want to mention things that I think are important for everyday Java level. So two more questions for you. What was Java 8 about? Main feature. So you're in the London. Yeah. These things are possible because of London. And what was the key feature of Java 9? Jigsaw. Modularization. Okay. That's great. There are many models. There are new tools. New APIs, some language changes. Some internal changes. Also some variables and deprecations. And many more. So current state of Java 9 is in random phase, which means that it's feature-complete. Just some, my priority bugs are approved. And it should be available 27th of July. It was actually postponed, I think, two times, but it should be really delayed. And I have another really fresh information that actually new forests for JDK 10 was created just yesterday. So I don't have to do it because it's really fresh. Okay. I would like to start with version scheme that was changed because this is example from Java 8. It's numbers of versions, 74, 77, 91, 92, 101. It doesn't make much sense. And it's more wrong. It's the long version. Because, as you can see, it's 1.8.0 and it holds just one information. It's Java 8. Actually, the 101 holds two information. It's security update and Maya update. And it's just wrong. So Java 9 has no Y 1.9.0. Because after 20 years there probably will never be version 2. So it's just nonsense. And it doesn't have two information, two things, in one number. So new scheme is major dot, Maya dot, security, and in long version it's plus real. And we also got this nice object. Actually, in Java doc, MC, which is version object and you can get major, minor, security. You can compile two versions. You can even parse a version to get instance of this object. And you can get this object from runtime class for your runtime. Okay, so example is first version will be 9. Then like 1, it's first security, second security update, then minor update. And you can always see what's really in there. Another like minor update in Java 9 is HTML in Java. And especially, you know how it's hard to find something in Java. It's basically impossible. And we got nice little input here. And I can set, for example, this. And I did this. Go down this. And I can jump right into the class. So it's like one implement, but I think it's nice. Internet changes, change. Java 9 got default garbage collector called G1. And G1 is available since Java 7. And by the time it got several improvements and development, so it became default garbage collector in Java 9. And what's important for Java developer is that it's oriented to minimal causes. So you might expect faster latency. But the little lower throughput.  So it was a parallel collector that was before the garbage collector in previous versions. Annotation deprecated some improvements. So it has now two elements which says since when the API was updated, it's simple string. And for removal means if it will be removed in the next major version of Java. So if compiler shouts to you that you are using some deprecated method, you now know if it's going to be removed. I've got a little demo for you to show new tool, new tool, JDPerScan. So, G1 online. It's a little tool that tells you which classes have something deprecated. If I do simple list, I can see all deprecations in Java 9. If I do list for removal, I can see all API that's going to be removed in Java 10. So I'm going to use this. Another thing, we got JShell, our repo for Java. And why we want something like this? I think there are several reasons. If you want to show Java to someone who doesn't know it, you may want to use repo because if you start to write in class and there are many buzzwords and you say or the person who is teaching asks you, what's a public class? And she'll say, it doesn't matter now.  And there are many buzzwords like that. You can start the repo and show how Java looks or you can learn yourself. You can do some micro testing to explore possibilities of some API. So you can try it. And JShell will also API. So you can use JShell from your application. And I think it's a way where new tools may become reality for IDs and so on. This is how API looks. It's just a simple example. So I have eval function and I create integer A, integer B, and in integer C, I add them together. And then I just print out all variables. Output is probably expected. And just like that, you might expect some tools for your ID that is this API. Okay. I've got a demo. So let's start JShell. And this is how it's looked. So I may want to create variable A, but it's not working because, of course, I need integer A. As you may notice, I'm not using semicolon. It's just not needed, but required for the first time in Java. So let's create B. And I have variable B. I can, of course, change the volume. Now I don't have to use int because it's already declared. And if I do A plus B, it's A. Makes sense. Now I can use some commands for JShell, which start with slash. And if I enter slash B, it prints out all my variables. So you can see there's some doler for, which is if I don't specify how to save the result, it's just create some doler and some number. I can create methods here. So for example, this one. So now I have my method. And I can add A and B. I can change, for example, this method by another command, which is edit. And I can edit that. And this beautiful IDE. And, for example, this thing. Like it jumps out from 90s straight into your face. So I edit, edit, and try to just modify it. So now if I call it IDE, it stands because I edit it to get another do. Could you actually take the terminal and make it a bit smaller so that it's not clipped? Uh-huh. Sorry. Thank you. Okay, I can create classes, for example. Let's edit this again. So, for example, I can create methods in this class that just prints my code. I can create an instance of my class. And I can see it's some doler, doler, file. And I can go now. And it's this one as well. Okay. You may be noticed that auto-compete works here. So if I press stop, I can see all my thoughts. Some other commands that you are turning to JShell, as I with slash, for example, writes all methods. I can use all types. So I create a class A in types. I can use list. And let's call snippet sky entered. I can use history. These commands I entered. So you can do this. I can save everything that I need to file, for example, from XT. And now if I exit from JShell, I can see the file is here. And content of file is really simple. Just commands I entered. And I can, again, load this file if you see it. List is empty. And I open the file. You can see that everything was processed. What's interesting is all our inputs. Now every part of this I can use by default. Or I can use the type input that I have. Or add some jar in class class, for example. Reset for something state. And now I'm clean. So this was a really quick demo for JShell. So we have some images of JShell now. We have some language changes in Java 9. Everything is under project coin. Which is a project that, like if developers of Java want to introduce some minor change of language, that's under project coin. So it's now safe, works. And annotation, you can use it on private instance. It was not possible, and it didn't make sense. So it's possible now. You can use effectively final variables and try different sources. I can show you in next slide, I think. You can use diamond with animals class, which wasn't possible, but why not? You can't use underscore as identifier, because it's a new keyword. Just equal. The last change is you can use private methods in interfaces. In Java 8 there was introduced default methods. So just to support them so you can hide the implementation. This is how it looks like in Java 8. You have to create new variable, and it's called automatically for you. In Java 9 you don't have to create new variable. You can use just like this, or even like this. And it's possible. So in my update, same as in diamond, in Java 8 you have to define in this example stream here, in Java 9 you don't have to. Okay. New APIs. There's a lot more, but I choose this as well. So I show you in slides or even demos all of them. Process API, list map, setfactory methods. There are some new methods in stream and some new methods in optional. So this is... I find it all stuck on the floor, so I don't think it's the best solution. But if you want to do HTTP get request, that's what you find. And so for so simple things, quite complicated. You have to create some connection, and especially this line is... you have input stream reader, buffer reader, and now we have to do a loop, just some join result, and it's quite complicated for such a simple task. So in Java 9 you have a new API. It looks like this, and it's much simpler.   Okay, it's not good. You changed the background to white, or the theme, or whatever. I can't. I'm sure it's possible, but I don't know how. Pre-Francis and Fondi, I guess. Pre-Francis and Fondi, I would say. Sorry. That was cute. We're not... where is the solarized light? This is light. Very good. So, as you can see, there's nothing more than a Muslim slide, but here is HTTP address for my presentation, and I have some storage here, and I just send the request to my presentation, and I write five lines of the response. So, as you can see, it written 301, so there are specifics for that. And what I'm saying here is just to reply and that I want full redirects always. So, it returns something. And if I want to asynchronous request, I can do it just as easy, and not call send here, but call send async, and now I get future. And just call it red and body, and five or tiny. If you look at the times, in the first example, the 400 milliseconds it was to send the request, and now it was the 200 milliseconds after I send the request, so it was really simple. So, just a simple example of this API. Unfortunately, it's in Incubator, and that's also new thing in Java 9, that if developers of JDK are not sure if the API is ready to production, they put it in Incubator, and you just don't know if it will be promoted to official API or if it will be completely changed or removed. So, unfortunately, I don't recommend to use this API, but it's okay. Quite nice. Any idea if it's going to support HTTP2 because you're already in the headline and you didn't speak about it, as far as I remember? Yes, you can probably read it somewhere here. Yeah, I'll say it right there. It implements HTTP2 and web sockets. It's it. Yeah, so I guess it should, but I meant it. Another new API is Roses API, so you can control processes in your operating system. This is how you get all running processes in Java 8, of the Java. You have to execute a command and then somehow, somehow parse it. So, it's not very good. It's also from Stack Overflow, so I think there are better solutions. It's platform-specific, moreover. It works on the line of the list. Yeah. So, now we've got something like this. We've got the process handle and we get all processes just like that, and we get stream of all processes and we can do what we want with them. So, another demo one. Here I get all processes. I filter the ones that contains top. I kill them. So, I start top and for example, I stop. It invites that it's killing some of the processes and as you can see, we have also some info about them like command line, and so on. The processes are really good. I have another demo, but I don't want to do it now because it kills all processes but not Java. I surely didn't try that, so maybe I'll end up with presentation. You'll see. I think this is really nice because I think the list sets or collections of some variables was really fine and you have to special libraries for that and in general you don't want to do that. So, we've got some nice filtering methods. I think it's pretty clear. Just here, in the map, it's key, value, another key, second key, second value, third key, third value, and it's basically the same like this. We have some new methods in Spring, so another demo here in JShell. If you look at the first method, it takes some seed and some predicate and some unary operator and it looks a lot like for loop really closely. So, you might see it better now because first value, I got 0. Now I say I want to, if i is less than 10, just i plus 1. It's basically a for loop in Spring. Another two methods are Can you by any chance make it bolder and change the background because the symbols now are not very much visible. Okay. Bolder method. Another method is take while. So, you can now say that you want to take the elements while it's less than 5. And the similar method is drop while with the same but from other side. Optional get I think 3 new methods but this one is I'm really excited about because now I can do if and else and the same line basically. And it looks just like this. So, it's really simple and I think it's really useful. Very So, now let's move to the modules. The biggest feature of Java 9. So, it's developed under project Jigsaw which was started I think in 2009. It was still when Java 7 was still under development. So, it's really old project. I think it should be a project just to modules should be in Java 8 but it was postponed to Java 9 and it's biggest reason for the postpones of Java 9. Big project and big thing in Java. So, what are goals of modules and project Jigsaw and these are strong encapsulation reliable configuration scalability and minus scalability down and it does these things in two layers same JDK is modulated by the system and same system is provided for your application what you can use it's actually used in JDK. Fight talk mentioned strong encapsulation I think the Jigsaw fix this table because if you look at it if you take private it's in class default package protected subclass but public is world this step is huge and you basically don't want to do that. So, I think that Jigsaw fix the table and it will look like this yes, it will if you write public it's no longer visible to world but just to the module and you have to explicitly explore your package to be visible to the world. I put it in quotation marks because it's not it's not a modifier keyword so it's just okay, so there should be no more class partner and that's what I meant if I said reliable configuration and how will you go through some of this with module partner but we'll see module partner is basically it replace class paths and problems with class paths are everything is out there you can put any jr file and everything is public everything is available and you have almost no control what's really loaded and what you are using so on module paths you can have each module just once and visible is just what that module explores and you have to specifically read the module to use it and you have control both compile time and run time so you can't basically you you have to just once both compile and run time so with this module it's defined by new file module for the Java and you can read other modules you can export your own packages and this is quite important because I want you to remember that you export packages and you read all modules and if you read other modules you read every packages that other modules export and you can use and provide services so last demo a module application here which use Java 9 modules and to keep it simple now I just assume I have some random generator and I generate 10,000 random numbers and it returns to this and I print how that this is big and where I get this random generator it's from another module which is here and it's really simple just returns random numbers and use module info for the application app and as you can see I require the random generator and random generator exports that package so I have some simple build script that first compile then package and run compile is nothing unexpected I think just Java C and I specify out there and here I can see for the first time the module pass especially a more precise module source path and I define so literally and then I just find all Java files it's mighty quite complicated but it's not I just loop through folders and create JAR files and I create JAR file with main pass so it's nothing more and for run I get this one it's nothing more than now I just modify module pass and then directly where all JAR files are and I specify that I want to run module app and this class so hopefully it will run yes it writes then it also if I modify for example module info for app and I move this line I got error in compile time and it says that that my module does not read it and same happening if I edit module info in running generator and I don't export my package so it's exactly very similar error but the class is not visible so I have some I have ensured that everything is on vice and already in compile time so I want to show you very interesting thing which I'm really excited about and it's new tool called J-Link the script to write run J-Link is new tool and in a minute or two I will show what it does and you will get specify module pass and now we will folder your Java with modules of JDK and J-Link directory and I edit my module up so I specify launcher to be again named f and module f and my pass and I specify up to there you can see that here this is my directory or exact directory it's this link directory and you can see that there's been called new tool legally it looks not like JDK and if I enter to my directory there's app which is Java in Java 9 it writes 10,000 so what J-Link does is that it pack everything that application needs and it creates runtime for you for your application so there's nothing more all dependencies need it and you can take this folder pack it and deploy is the app actually a binary file it's not, it's a script that run Java with some parameters and and if I run Java with modules you can see that there are Java base which is a module which you get implicitly in every case and there's my app module and new generator and some others and if you see it has 44 max so it's not smallest it's not like if you build it in C but I think it's about 70 have something about 70 max so I think this is really nice it goes with IoT you can take this deploy and run so that's all I got can you go two slides back one more okay we have somewhere else anyway you wrote that you can have the same module depending on module in version 1 and other modules depending on the same module but in version 2 you know how it resolves yeah but unfortunately versions are not solved so you can't have two versions of same module so you have to choose so it is not a runtime thing it's not based on class loaders it's a compile time thing if I understand it it's not you can for example compile with one module and at the runtime put another OSGI works the way that you put class loaders and each module is loaded by by a class loader and that's the way how they manage to shield the modules is it the same way on the other sorry yeah it isn't really it isn't if you look on some presentations it's usual questions how it solves the difference I just want to say that it's work for Maven it's not for Java it's not for presentation all the models that might happen so you don't want that okay thank you


34th lecture in the course design and engineering of computer systems. In this lecture, we are going to study more about the concept of caching. In the previous lecture, we had said that you know, if IO is your bottleneck, if fetching data from some device is your bottleneck, then caching is a common technique that is used to improve performance. In this lecture, we are going to study more details about what is caching and how do caches work. So the basic principle of caching is, you know, you have some data that is located at some, you know, so called far away location and you need it here, then if you have to fetch that data from that far away location all the time, then that is going to impact your performance. So for example, whether it is disk or some other node or something. So then what you do is, you store the recently fetched data in what is called a cache in a nearby location. So that the next time you need the same data again, you do not have to go all the way here, you can simply get it from the cache. So a cache note that it has limited capacity, the cache could accommodate all this data, then why not keep everything here itself, you know, that would solve your problem. But typically caches are only used to store the recently used data because they can only store very limited amounts of data, not all the original data. And if fetching from this far away component to this is your performance bottleneck, only then will a cache improve your performance. If something else is the performance bottleneck, adding a cache may not be useful. But if this IO is your performance bottleneck, then instead of most of the time if you are just fetching from this cache and not going all the way here, it will improve your systems, performance and capacity. So we have seen many examples of caching multiple times in the course so far. And across all of them the principle is the same, you know, you have CPU caches, you know, the CPU needs some data from DRAM, whether it is instructions or program data, the CPU needs it from DRAM. And instead of going to the DRAM all the time, the CPU has many levels of caches. And it will store the data from DRAM into caches so that in the future it can directly access data from the cache. Similarly, you have the disk buffer cache, you know, whatever you read from disk, you will store it in memory in the disk buffer cache so that you can avoid going to the disk most of the times. Similarly, TLB caches, they store the recently accessed virtual to physical address. So the MMU will check the TLB cache first and if it cannot find the address translation the TLB cache, then it will go to DRAM and you know walk the page table. So these are all examples of caching we have seen so far. So in this lecture we are going to see more examples of caching and more importantly we are going to try and come up with some general principles to design caches so that you can design them in any system. So one popular cache is what is called HTTP cache.  What you can do is you can store this response in a cache so that in the future if this client or somebody else wants this same URL again, the same web page again, you do not have to go to the server, you can simply get it from your HTTP cache. So HTTP responses are frequently cached. So these can be shared caches, you know, for an organization you can have something what is called a proxy server so that all clients in the organization will go through this proxy server to access the internet. So that if some web page is already cached at this proxy server then if suppose one client access the web page and it is got and you know stored in this proxy cache then other client wants to access the same web page, it can simply get it from this cache, you do not have to go all the way to the server. So you can have such shared caches for multiple users in an organization. And this cache, this proxy server will if it is not there, this proxy server will get it from the remote server for you and serve it to the clients or you can also have private caches within browsers also just for one user so that if the user wants to access the same page again immediately it is available, these are not shared with anybody else. So all of these types of caches are frequently used in computer systems today. Note that one thing to remember is you can only cache plain HTTP, you cannot cache encrypted HTTPS content that easily because you do not know what is inside that HTTPS content. So that has to be remembered. So now then the question comes up, you know, I have stored some web page in a cache, what if the server changes the web page, you know, it is some news website, the news has been updated. I do not want to be looking at this old stale news all the time, right, when the news gets updated I want to access that fresh news, not this cached old news. Then how does caching work in such cases? So normally what happens is the servers will indicate how long this caching can happen. So when the server sends a response back it can say, you know, the maximum age of this response is say, you know, 10 seconds or something. So the server will say for the next 10 seconds you can use this response but after that I may update this response. So therefore do not use it after some maximum duration. So there is an expiration date that the server puts on HTTP responses or it can also, you know, say there is something called cache control header in the HTTP response where the server can say do not cache this at all, I am constantly updating this page, please do not cache it, right. So there is HTTP response headers like cache control and max age that the server will set, you know, the HTTP response consists of all these headers and the actual content, right. So these headers will be set to control the behavior of the cache and what these caches will do is if the cache has some expired content, you know, the user, the client has requested some web page and the cache sees that within its storage it has some expired web page, then maybe but the server need not have updated this, you know, this might still be the valid web page. So how will the cache know what it will do is it will talk to the server and do what is called a conditional get that is it will fetch the page from the server only if required. So it will tell the server, hey look I have a copy of the page that was last modified at so and so time, it will tell the server some information about its cached copy and ask the server is this the most recent one or do you have an updated version? If the server has an updated version, it will send the updated version otherwise it will send a response indicating what you have is okay. So there are ways in HTTP protocol to do this conditional HTTP gets where you will fetch HTTP response only if your cached copy has expired. So HTTP caches frequently do this, okay, all of this is done in order to avoid going to the server multiple times because the server might be far away and it might be slow and hurt your application performance. So the other type of caches are DNS caches, right? We have seen that DNS is a way in which a domain name for example like nptel.ac.in is resolved to the IP address so that your client can actually send data to the particular server IP address and these DNS records are stored at authoritative name servers that is you know you have a top level domain and then under this you have you know name servers for .in then you have .com various top level domains and under this .in you have ac.in which is academic websites and under this you have nptel, okay. So you will first talk to this authoritative name server the top level domain get the IP address of the server then you will talk to the server get the IP address of this server then you will talk to the server and get this IP address in this way DNS resolvers do this hierarchical name resolution to find the final IP address. Now that you have you know found out this IP address after this long process you do not want to do this all the time therefore these DNS records that map from a name to an IP address these will be cached, okay, they can either be cached locally in a machine or once again shared at the DNS resolver. If there are multiple clients in an organization all of which are using the same DNS resolver then this DNS resolver can itself cache these DNS records or each machine can also cache the DNS records, right. So the DNS records not just of this final resolution but you learnt of the IP addresses of many intermediate nodes in between also. So all of these can also be cached because tomorrow if you want you know some other dot in you know government dot in then you can you have cache the IP address of this name server you can directly go there instead of starting your resolution from the top. In this way various intermediate IP addresses as well as the final IP address all of these DNS records are cached and caching is very important because you know as you can see DNS resolution involves multiple network communications and you know it can take few tens of milliseconds. So therefore caching is very critical. Now again the question comes up what if you know this IP address is updated and I have some value in my cache but the actual server's IP address is updated then will I suffer by using an old version of the cached DNS record that is why DNS response once again for any cache you will have this time to live. There is a field in a DNS response called time to live that the server will set saying okay this IP address is valid for so long. After sometime you have to once again do this resolution and fetch the latest DNS record. So this time to live field allows us to update the DNS record after some point of time. So apart from HTTP and DNS caching in general any application can do its own caching. For example you know we have seen this web application architecture where there is a front end, there are various application servers, there are various databases right. This is how a typical application looks like a real life application. So at every stage you can have caches. For example the application server is if it is sending the same queries to the database all the time it can just have a small cache of you know recently received database queries. The front end can keep a cache of the responses received from application servers. If some user has just searched for a certain product and again another user searches for the same product then you can simply send the cached response back. Okay. So in this way between any two components you can have a cache to reduce the communication between these components and improve performance and anything application level data objects, database queries anything can be cached. And all of these caches are again separate software components that sit between various other components. So you are adding extra complexity into the system with caches because you know you are bringing in new components into the system but they improve performance. And frequently for these application layer caches you use what are called in-memory key value stores. That is simple databases that keep a mapping from some key to some blob of data. For this key this is the data, this key this is the data. So such stores of key value stores and they store them in memory. So there are popular software like Redis, Memcache, D that serve as in-memory key value stores and these are often used as caches. Note that it makes sense to keep cache in memory, right? I mean if you are going to disk and you are bringing something again storing it in cache on disk is again slow. So the whole point of cache was to quickly access it. Therefore usually these caches store all of these recent application data in memory. And you know examples are for example if you want to cache the recently obtained images there is an image database you are getting some images. So you use the key as the image name the value is the image contents or the key is your database query and the value is the result of the query you know all the rows of the database table that were returned, right? So in this way use some key to identify the value. The next time a query comes, a request comes for the same key instead of going all the way to the next component you can simply look it up in the cache, right? And we have also seen other examples like CDNs you know whenever there is a web server has some web pages it will push this content out to CDNs, content distribution networks which have replicas throughout the globe you know they are geographically spread so that any client can instead of going to the server it can directly fetch a web page from the CDN itself. So CDNs also cache various application layer objects, web pages, images so that clients do not have to come all the way to the system they can directly get the data from the CDN. In this way at every level you know between application layer components between clients and the system in the form of CDNs, in the form of HTTP proxy servers, DNS caches all through you have various levels of caching happening in computer systems so that you can avoid this extra expensive communication. Now across all of these caches there are certain common design principles you know common things to keep in mind that I would like to point out in the next few slides, okay? So the first question is when do you cache? Just because you know you are fetching something from another component you do not just put it in a cache there are certain guidelines to help you decide is this worth caching is it worth putting an extra cache component between these two components or not and what are these guidelines? So you will only cache when the workload will lead to high cache hit rates. For example you know you have accessed some piece of data from some remote database and then this data will be needed again immediately in the future, right? Only then it is worth putting it in a cache when there is high locality of reference. Suppose you have accessed some data you will never again use it in the future or very less likelihood that you will use it in the future there is very low locality of reference then there is no point caching it. Similarly it is worthwhile caching when there is a skewed distribution you know where some items are very very popular some images are being repeatedly fetched from the database then it is worth putting them in the cache. But if you know once you access an image you will never use it again then what is the point? You know such popular items if there are heavy hitters then you can cache it. So you have to think through does your workload lead to high cache hit rates or not.  The other thing is the cache has to be faster access than or you know somehow closer than the original copy of the data. If your cache is also here you know as far away as your original data or it is slower than accessing the original data then what is the point? There is no point in caching. Therefore usually caches are in memory caches so that instead of going to disk you can get it from memory CPU caches are a different kind of technology called SRAM that is much faster than the DRAM that is used for main memory. So in this way caches are useful only if they are faster and or closer. Then the other thing caches need is you need a good eviction policy of course if your cache is big enough to store all the data then why not just store all the data here right that will never happen because your caches are somehow different technology they are more expensive you can never store all the original data you can only store a subset of it. Therefore which subset of the data will you store what if you know the cache is full I have to throw away some older item therefore you need a good eviction policy which will help you decide once my cache is full then I want to store another item I have to throw away an old item right. So your cache should be in such a way that you can implement a good eviction policy which will ensure that you do not want to evict a very useful item as soon as I throw this away immediately if somebody asks for it what is the point it is a bad eviction policy. So my eviction policy should be good like LRU least recently used is a common eviction policy used in all of these caches you know something has not been used for a long time most likely nobody will need it in the future again let us throw it out. And this eviction policy should be able to implement it easily without too much overhead for example finding the least recently used item should not take like you know 10 millisecond then it is very inefficient. So things like that your eviction policy should be good and the other thing is your cache has to be large enough to accommodate the working set size. So suppose the application is using some subset of this data frequently that data should be accommodated if your cache is very small whenever you want anything in it it is not there it is not very useful right. So there are all of these guidelines that tells you for a given application for a given workload given system is it worth using a cache or not. Now the other thing is where is this cache located right suppose you have a client and you have some server from which you are fetching some data which has the original copy of the data know that these are general terms you know this client can be the CPU server can be DRAM client is basically something that is requesting data from a server and now you have a cache in between. So the question is where is this cache located relative to the client and the server. So there are two types of caches okay one is what is called an inline cache what is an inline cache an inline cache is a cache that sits directly on the path between a client and a server that is between the source of the data and whoever wants the data that is an inline cache what does this mean the client will never directly talk to the server the client will always check the cache if the item is there in the cache the cache will return it if the item is not there if it is a cache miss then the cache will talk to the server fetch the item and then give it back to the client. So the cache is always in the middle that is an inline cache the client will never directly talk to the server examples are most of the caches we have seen so far like the CPU cache is an inline cache the CPU will always check the cache first and then whatever has got from memory is put into the cache and then return back to the CPU write the disk buffer cache all of these are inline caches the other kind of cache is what is called a write a side or a look a side cache that is the client will first check the cache and if the item is there in the cache well and good if the item is not there in the cache the client will directly talk to the server and get the data item and later on update the cache. So the cache is not in the middle it is on the side it is not on the direct path the client server can directly talk to each other the cache is only on the side and the client or the server they will update the cache whenever some data changes. So for example if the server changes the data it will tell the cache hey you know update your copy or invalidate you know this cached copy has to be either marked as invalid or it has to be updated. Similarly the client can update the data at the server and then the client will tell the cache hey update your copy but the cache is not involved in this communication between the client and the server. So what is an example of a look a side cache we have seen one before the TLB right if you remember so the TLB is sort of on the side the MMU will check the TLB and if it is a TLB miss the MMU will directly access the page table get the address translation and then update the TLB. So the TLB is a look a side cache that is why it is called a translation look a side buffer it is not on the path between the MMU and the page table. So these are just two types of caches for you to you know when you look at a cache you should be able to understand what type of a cache it is. Then the next question comes up how do you populate the contents of the cache ok you have a master copy of the data somewhere at the server and some clients need this cached copy how do you populate this cache. So again there are two ways ok. So there is what is called a demand filled cache that is the content is populated only when needed you know if the client is there the client will request some data only then the data will be put into the cache only then the data will be fetched from the server and put into the cache that is a demand filled cache that is the client will pull the data when needed into the cache. Things like CPU caches, HTTP caches are all demand filled caches and when with demand filled caches it can so happen that if you have multiple caches you know this client is requesting some data and this client is requesting some other data then these copies of these different caches might diverge. For example this CPU core has requested some memory locations they are there in this cache this CPU core has requested some other memory locations they are there in this cache. Now the CPU core has updated some memory location but that would not automatically come here because why it is a demand filled cache only if the CPU core requests it will come into this cache right. So if you have multiple caches the contents of these caches might diverge in demand filled caches because based on demand only you are updating it you are not generally all the time updating the cache contents ok. And then you have proactive caches which is the server will actively push whenever any data changes the server will actively take responsibility to populate all of these caches and keep them consistent. For example in some CDNs you know the server has distributed its files to CDN the server will update the CDN replicas whenever you know a web page changes it will push it to the CDN replicas. So in such proactive caches it is easy to maintain consistency across these multiple caches but otherwise if it is a demand filled cache you know some CPU core has updated some item here so then this CPU core may not have the updated copy of that item because it may not even have the data in its cache line right. In the case of CPU caches when you have you know private caches to every core in such cases if it is demand filled it is harder to maintain this consistency. So now the important question with any cache once you have multiple copies of data you know you have your server that has the master copy of the data and then you have multiple caches throughout you know and each of this is caching some subset of this data. Then the question comes up how do you keep all of these cached copies of the data in sync you know if some data changes here it has to be updated in all the caches if the server changes some data it has to be updated in all the caches otherwise if you have old values of data in these caches then it will be incorrect for the application to use an old value of data. So with caches this challenge comes up that now instead of one copy of data you have created multiple copies of data all through the system and somehow you have to take the responsibility to keep all of these multiple copies of the data in sync and that problem is what is called cache consistency. Anytime you have multiple caches and clients are accessing data from multiple caches you have to ensure that everybody accesses the same consistent version of the data. So the question comes up how do we guarantee this cache consistency? So we will see some of the ideas to do that. So let us take the example of CPU caches you know this is something we have seen a lot. So in a CPU if you have two different CPU cores each CPU core has its own some private caches like the L1 cache L2 cache they are private to this core and then you have a common this L3 cache is a shared cache and then you have DRAM right. You can have some structure like this some caches only this core has some caches are shared across cores and so on. So now across all of these caches you have to maintain information for example if this cache has certain memory location x stored here and this CPU has updated this memory location x then when this CPU also wants to access x it needs to know the information that oh no the updated value is here. So this information of which cache has which item this needs to be tracked and how is this tracked? There are two ways one way is what is called looping that is whenever a cache gets some data item all the other cache is also snoop oh this guy has obtained this memory location from RAM this core has obtained this memory location from RAM right. So everybody is snooping around to see what the others are doing and based on this everybody knows now this core knows oh in the past I have snooped I found out that C0 has this memory address x. So the next time I want it I should check with C0 for its latest copy in this way you can snoop or you can maintain a directory that is all CPU cores can keep a directory which has information about which CPU core has cached which memory locations right. So these are two common techniques used at the level of CPU caches to keep track of which cache has which memory location. And in some systems of course it is easy to keep track for example in CDNs the server has all the master copy of the content and the server is distributing you are you know entering into a contract with a CDN provider and saying oh please cache this content in all of these different places. So it is easy to know because you are the one who is actively pushing content out to CDNs it is easy to keep track of which CDN replica has which web page. And in some systems like HTTP caches it is very impossible to know you know if people are caching web pages in their browsers it is very impossible for the web server to look at the caches of all the billions of internet users and see who has this web page and whose cache. So therefore in some systems like HTTP caches it is impossible to keep track of all the copies of the cache data. But in some systems like CPU caches you have to keep track of which cache has which memory location so that you can consistently access the latest copy. Now the first problem in cache consistency is keeping track of the replicas. The next problem is updating all the replicas how do you keep these replicas and sync with each other. So that is what cache coherence protocols do. So now when one CPU core you know the CPU core in its L1 cache has you know cache to memory location X a cache line X and this other CPU core also in its L1 cache also it wants to access the same memory location X. Then what will you do? Then there is some cache coherence traffic that runs between these two CPU cores in order to synchronize the value of this memory location. So whenever core C0 updates this memory location then C1 will either update its value also or it will invalidate its value. It will say fine let me delete this thing from my cache. So when one CPU core updates a value in its private cache all other copies of that data and all other CPU cores have to be synchronized in two ways either all the other cores also update the value. You know they will also write the value and you know update it to the latest value pushed by C0 or they will invalidate that value. They will mark it as invalid and say later on if the the CPU core request the same memory location then I will fetch it. I will not worry about it for now. So you have to keep these multiple replicas of a data if you know a data item is cached at multiple locations. If one copy is updated all the other copies also have to be kept in sync they all have to update or at least they have to invalidate. They have to remove it from their cache so that the next time they need it they will get the latest value and not use their old stale value. Now this you can do in CPU caches because you have kept track you know using either snooping or a directory you know if this memory location is there in all these caches. What about things like HTTP caches where you do not know where an item is there a web page in which all browser caches it is there all around the world a web server does not know. In such cases when a web server changes a web page then how do we ensure that all the replicas are kept up to date it is very hard. Therefore in such cases what we do is we usually identify the latest copy of the data in some way using some sequence number version number. So whenever the web server updates a web page you know it has made some changes to a web page it will keep some time you know the modified time the last modified time or some version number something you will maintain for the data item so that when this there are multiple caches that might have older versions of this data item when a client requests some HTTP cache then this cache can go check with the server saying hey I have this version of the data or I have a web page with this modified time is that what you have also. If the server also has the same latest version then this cache can simply return its value or if the server has updated then the cache will get to know that you know oh what I have is the old web page the newer web page has a higher version number or a later modified time let me fetch it. In this way you need some way of identifying this is old data this is fresh data so that when the cache is of course the server cannot you know push these updates to all the caches all over the world but the caches themselves can check oh this is my version number that is the latest version number let me update. In this way you have to put some kind of a identification number like a sequence number version number time stamp something on these data items so that whenever caches have to access the same data item again they can compare is their version number is their time stamp the latest or not and if it is not the latest they can either update their copy or invalidate their copy or something like that. In this way these are some of the techniques available to maintain cache consistency. So that is all I have for this lecture in this lecture what I have shown you is many different examples of caching in computer system from CPU caches to disk buffer cache to TLB to HTTP caches to DNS caches application layer caches we have seen many different examples and in addition to that we have also seen some common design principles across all of these caches like you know where is the position of the cache it is is it in line or is it on the side how is the cache filled is it demand filled or is it proactively filled how do you track all the replicas of cached content how do you maintain consistency across cached content. So we have seen some common principles that are widely used across all of these caches. So the next time in a computer system you have to design a cache keep all of these in mind and see which of these patterns will fit your requirements when you are designing a cache. So one exercise for you to do is you know you can examine HTTP headers in Wireshark and observe these you know last modified time cache control max age there are several HTTP headers that are used that decide which HTTP pages which web pages get cached in your system and which don't. So observe these things to understand how web servers today control caching in HTTP proxy servers and HTTP caches. So thank you all that is all I have for this lecture let us continue this discussion in the next lecture. Thank you.


So I gotta be honest with you guys, I thought I was done today.  Be sure to stop on by, we'll be celebrating 50,000 subscribers. The drinks and shots will be flowing.  Talking about all the latest news, all that jazz. It'll be fun. Hope to see you there about 730, 8 p.m. Central Standard Time now. This news that we have today is, oh well right now, is about potentially more N64 games coming to Nintendo Switch. Maybe an HD, maybe not. That's the question here. Before we get into it, I gotta remind you, we do have two giveaways going down. We have one for three copies of Super Mario 3D All-Star, so three winners. Winner will be announced on October 1st to enter. Head to the gleam.io link down in the description. You can also join Patreon at patreon.com slash 10-hour prime for as little as $1 a month. It gives you 15 entries into every single giveaway we do. All right, beyond that, of course, we have a second giveaway for a Switch Lite and then two second place winners will win a Switch Game of Choice. In order to enter that, there's a laundry list down in the description as well where you subscribe to the channel and a whole bunch of other stuff. Go check that out. Be sure to maximize your entries every single day, every single video. All right, let's get into this news. So, we know that Super Mario 3D All-Stars has leaked, right? I did a video on it earlier today. And as it's being datamined and all that jazz, you're gonna discover a whole bunch of stuff. Now, this was always going to happen. It was always going to get datamined. But what's interesting here is, according to YouTuber, at LB Dashing, there are six games in the N64 emulator. So, for those who don't know, Super Mario 3D All-Stars, all the games are running on emulators. And there's an N64 emulator in there that's potentially made by Nintendo of Europe. And inside that emulator, inside the files for that emulator are Kirby 64, Mario Golf, Mario Story, Mario Tennis, Perfect Dark, and Pokemon Snap. Now, it's interesting that you see these in here because this is believed to be a custom Nintendo created emulator. This emulator, based on what people are finding out in the files, has been completely rebuilt and redone. So, while these games could have just been test games that ran with the emulator, it's also entirely possible that this is hinting at Nintendo adding N64 online, or N64 games, I guess, to Nintendo Switch Online next year. Now, next year is the third anniversary of the Nintendo Switch Online. And it might make sense, at that point, to release an N64 online with, you know, 20 games or so, or maybe just starting with six and that these will be the first six. It's also possible since this is running in an emulator that's clearly running Super Mario 64 at 720p, that these could be individual 720p eShop releases, kind of like a virtual console in a way where they charge you about 20 bucks a pop or so, equalling out to the value of each individual game in Super Mario 3D All Stars. It's also possible that they end up packaging these together and selling it as like a best of N64 collection, although there's obviously some best of games missing in there. But the games that are missing are ones that they could literally release on their own for 60 bucks and probably sell, you know, like Ocarina of Time or something. So it's interesting looking at these, these mentions within the emulator and within Mario 64 because I honestly always wondered what Nintendo was going to do with N64 games on Switch. I never thought they were actually going to release an online thing with N64 games, at least not at the current 20 bucks per year for Nintendo Switch Online because it's almost too incredible of a deal at that point. Some already think it is an incredible deal for the SNES and NES games we get, let alone adding N64 to it. Now, obviously the downfall of the SNES and the NES is that we haven't gotten a lot of games added. There's way less games available on those services than there ever was for virtual console and that would be even true for N64. If that was added or Gamecube or Wii or any system, they had Game Boy Advance to the thing. Like it would always be less games than when they used to be on virtual console. But the fact that I see these in this emulator tells me that if these games are to come, and Perfect Dark's maybe the one that's like most interesting here because Nintendo doesn't own any rights to Perfect Dark, what I find interesting about these inclusions is that this does mean that Nintendo could have N64 games coming to Switch in one form, even if it's not the Nintendo Switch Online service. They could be packaging these games in HD, you know? What would it be? So, out there for Nintendo to do that? I don't think so. I don't think it's crazy or anything to imagine Nintendo doing this. So, I don't know. That's just something that I kind of wanted to throw out to you guys and get your thoughts on it because out of all those games, out of those six games, Perfect Dark is the one that really has me tickled. Now, Pokemon Snap would normally get me super, super excited, but we're getting a new one on Switch. Like, I can't believe I can even say that. We're actually getting a new Pokemon Snap. So, I'm more interested in the new one than replaying the old one. But, I mean, Mario Golf, that's back in the day, right in smack dab in the middle of when Mario Golf was at the top of its game. Kirby 64 was amazing. You know, Perfect Dark is one of the most, you know, it's one of the best, you know, first-person shooters or whatever, literally, like, best FPS games out there on any platform at that time. Now, maybe it doesn't hold up as well today, but still, like, it's amazing. It's right there with GoldenEye back in the day on N64. So, it's crazy to see these on there, and I honestly hope it means something.  Like, what are we talking about? Nobody knows. Nobody has any idea what the hell Nintendo's doing. Sometimes we wonder if Nintendo knows what they're doing, let alone could we even venture to guess what any of this actually means. But, the guy on Twitter does go on to mention, you know, this isn't the full list of games, of course. This is leftover data that should have been removed, meaning the N64 emulator used in 3D All-Star is the same one that will be used in N64 Online. So, if it is available at N64 Online, there are more games than just those six. Again, who knows? And I guess someone told them that the data from N64, we use emulator, so, you know, whatever. The point is, nobody really knows what the hell is happening here. I just hope, beyond hope, that this isn't it.  Whether it's Super Mario 64 or whether it's, you know, I don't know. Like, this entire 3D All-Stars collection pack, I just don't want this to be the last time we get N64 GameCube and Wii games. I want to see more. Now, I assume we're gonna get a 35th anniversary pack or something for Zelda. Maybe that's a little presumptive of me, but I assume we will. I just know that I want to see all of these games release at some way. The fact that Xbox is going to have a way, with the Series X, to play literally every game that's ever existed in the Xbox library, going all the way back to the OG Xbox, just makes me more and more want Nintendo to have some way to do the same. I realize, with cartridges and discs, like, you can't just plug and play, you know, different architectures, but man, can a future exist where everything's playable, even if you buy it individually, like, virtual console days, or, you know, release collection packs like Crazy, you know, remember Rare Replay over on Xbox? Like, even something like that.  Just something. I know there's something that can be done. I just know that, man, I'm hyped. God, I'm hyped. I'm hyped for these hypothetical games. All right, folks. Catch you tonight for the stream. Peace out.


What's good, Josh, but Ross back again with another video. So I just finished checking out a W revolution. And I actually ended up watching it. I want to say right when I guess the it was probably halfway through to John Moxley, Cesaro, Claudio versus FTR. I had started watching it halfway through that match and then from there, I was, you know, pretty much watching the show for the most part, so I didn't really catch the beginning of it. But the main reason why I wanted to check this show out, obviously for Sting's last match, and that's why I wanted to dedicate a video strictly talking about that. It was a solid show. There was some good stuff on there. Will I spray versus to Kesha? That was fantastic. Damn near, I guess you could say it would probably be a lot of people's match at a night. But I actually really enjoyed this thing and Darry versus the Young Bucks match. I really enjoyed this and I think I enjoyed this a little bit more because of just knowing this is Sting's last match. The crowd was hype and electric. And this is wrestling at his Hokiness right here. This was a nostalgia trip through and through and they brought all the nostalgia works out there. Young Bucks come out there getting a whole bunch of hate as they should for the stuff they've done to Sting the past few weeks and attacking his sons and attacking him and and now they want to pull the EVP roll and stuff like that. So they're getting good heel heat.  People that has been associated with Sting for so long.  I thought that was cool. That was a nice touch and it's like, yep, this is you know this is it show time for the last time and he comes out there and this was really cool.  He straight on business dies through the ropes attack attack the Young Bucks damn near falls through the table. That's that ringside and chaos ensues. Why this is why I say this is one of the most wrestling nostalgia matches you can possibly have because it hits on all the beats of what made steam steam steam being sometimes no selling sometimes getting hit with moves. He just no sell but people loved it because it was steam him like getting hyped up people loved it because it was steam you know him using the bat and boy oh boy they they made it so this was just I think they said it was a Texas tornado match or something like that so really they just could have said it's just a no rules tag team match for the tag team titles or whatever and technically it was a four on two match because steam and his two sons and Darby proceed to beat the hell out of the the Young Bucks and of course people loved it. It was literally a four on two handicap match but that quickly changed very quickly super quickly. It became a one on two handicap match. We're going to get to that ridiculous spot but they started bringing out the weapons early as they started bringing out the toys. They brought out some tables and then they brought out some glass and I was all man where's a where's Jack Perry where you need them. They started bringing out some glass and start setting them around the ring.  Why not? They brought out chairs and y'all know that infamous power Darby jumps from the top all the way down to the chairs. Well this time they they they enhanced it. They made the the spot that more deadlier. They put another sheet of glass onto the chair. So I'm knowing oh yeah no one else is taking this bump in this match except Darby of course but we were just waiting for it. There was a glass sheet on the side of the ring apron and Sting had his back. He's about to use it and he one of the bucks can't even remember the name right now but one of the bucks moved out the way right Sting hits the glass but it doesn't break on the first time.  So it breaks on the second time then they chase them through the crowd and there's some conveniently place tables on like each side of the ramp. So Darby's fighting with one of the young bucks. Sting's fighting with the other young buck on the other side of the ring Darby ends up going through the table with the plethora of unnamed water bottles just you know goes through the table and then the same thing with Sting he ends up going through the table and it's once again the fact that Sting has been taking all these bumps y'all at the age that he's at is, is, is insanity.  It's ridiculous they at that age he's at taking these crazy bumps so after he took that bump he was out for the match for a while Darby was kind of by himself essentially but that wasn't gonna be, Darby wasn't gonna be around for long bro so you knew how this spot was gonna end for Darby. Darby proceeds to climb up to this huge ladder one of the young bucks is laying on the glass that's also has chairs under it we've seen this spot before with just the chairs but now they add a glass to it and of course one of the other young bucks brothers able to move him you know kind of move him at the last minute Darby flips off and back just crashes right through the glass through the glass through the chairs bro just just if you haven't seen the clip I don't even think it'll be safe for me to even one try to post on YouTube clips on it's on my Twitter bro it's fucking that was a holy shit moment that didn't even need to happen bro you want to know what he was going to remember this match about is more so Darby trying to kill himself legit he tried to kill himself through the glass spot and bruh his back was just one second they're looking at something else like the carnage and then they cut back and his back is just bleeding out bro like they had to get some officials out there to kind of plug it up to stop it but his back was just bleeding I'm just like huh and now staying out there literally in a 2v1 situation getting packed up the rest of the match and kicking out of everything because Darby Allen Darby killed himself Darby Allen killed himself bro while entertaining oh my god he killed himself I don't even know like I just it makes no sense but it was a holy shit moment that people will always remember Darby Allen killing himself in Sting's last match and like I said it didn't help out Sting because Sting was getting packed up super kicks fucking you know knees to the face there was even one part where they did kind of like if you guys remember when HPK and Ric Flair had their match and honestly I wish that was Ric Flair's last match because I was literally one of the greatest retirement matches of all fucking time and he didn't he unretired but on this spot right before the last super kick he tells Ric Flair that I love you and he kicks him and it ends match beautiful storyteller right they do the same thing as Sting is kind of days in the middle of the ring they're about to hit him with the super kick both of them and they say we don't love you well we're not sorry we don't love you because in Shawn Michaels HPK at the time he said I'm sorry I love you they decided to say we're not sorry we don't love you and I thought that was a nice touch that was a nice little callback considering Ric was rings I kick him kicks out at one point he kicked out at one it was just just ridiculous then all of a sudden they end up putting Sting through another table because they end up getting he was trying to go through he was trying to seem like Sting was trying to kill himself to go up to the top or middle of the ladder to put one of the bucks to table but they end up throwing him through the table then they end up I want to say I forgot what ended up oh yeah they ended up picking up one of the tag titles and they was going to hit Sting while he was down Ric Flair comes in there no don't do it don't do it no and as I fuck you Ric Flair and they both super kick him at one point Ric Sting both try to stop them but he ends up getting hit in the chair this was outside the ring before they went inside the ring and then for good measures they end up super kicking him out to make sure Ric Sting both don't get in the ring himself and kicking him getting whole much just a lot of heel heat you know they're there to try to help Sting out as much as they can or building up some good heel heat and then once again ultimately after all of that Sting still kicking out bro and what like I said beginning of this video this was those old school wrestling you know you like the the baby face is just overcoming everything that he really shouldn't be overcoming but it was just such a good moment the crowd was so electric and this is why it for me it's I enjoyed this match just a little bit more than the Osprey and Takeshka because one is just Sting's last match I was gonna like I'm I was here for it that's that's what really sold me on this pay-per-view in the first place I wanted to see that match in particular and it was just fun this was this was fun nonsensical but fun ultimately Darby's able to rise from the ashes after the medical officials perform surgery on him outside to cover up the bleeding he pushes off one of the the young books off the top because they're trying to hit him with one of their patented moves I forgot the name of it where it's like it's like one jumps from the top he has the other one held up over his shoulder and it's like a he'll end up how driving him at the same time it's a cool finishing move tag team finishing move but Darby pushes him off falls through the table and then Sting finally hits his last I don't know how true it will be but as of now his last scorpion death drop and he kind of vast in like the moment of it crowds going crazy boom hits it for the one the two and three and Darby and Sting retain the AW tag team championship huge pop that pop was huge man that was a good moment good moment and then afterwards they decided to talk you know Darby said we got three minutes left and Sting's talking he's saying thank you interacting with the crowd it was a good moment a wholesome moment because we knew you know this was it for Sting this is this is you know kind of how he wanted to go out in his career and he went out on top got a lot of thank you Sting chance and it was a cool moment but then for whatever reason because AEW doesn't understand the concept of timing they had to cut the feed they had to cut the broadcast because they ran out of time they ran out of time now some may think oh well we got what he said was cool but he obviously he wasn't done you know I'm saying it it didn't give no final notice like no finality to it it was just like oh well you know I'm saying we you know here we're it's about the end now pretty much and then they cut they fade it out so they didn't have enough time and I think that's just bad time management because you could have cut some stuff down on this show now you could have cut that John Moxley and Claudio versus FTR match now could have shaved 10 minutes off of it crowd was damn their quiet majority of it when I started watching it was quiet you could have cut some time off of a few matches if you needed to to give steam obviously that last imagining to give them a little bit extra cushioning so you don't cut off whatever he has to say because this is his last time you know this is this is supposed to be his final match so give give that wrestler at least 10 minutes out there if that's what you want to do and I would have did that so they got to work on any time management that's still an issue because the lasting image if you don't check social media or whatever is steam pretty much getting cut off that shouldn't be happening so but outside of that I enjoyed this man this was this was fun it was chaotic it's it makes a lick of no sense Darby killed himself for no reason but I enjoyed it because it was stings last match and I'm okay with steam winning I think that was I personally think that was the right choice the only time I would have been okay with steam losing in his last match if it was against Darby but I think this was the right choice it get it got the crowd to go home happy they paid money to see steam's last match and it was it was fun bro it was fun and I think steam yes he has a loss of match in AEW so he he will retire from wrestling undefeated man I believe his record in AEW he has not lost a match and I think he you know going out on top I know some people say you could have put him over you didn't put him over steam losing wasn't gonna get them any more he'll heat than what they got now maybe a little bit more but I just don't think people are as invested with the young bucks considering they had an opportunity to really be over with the whole CM punk feud and what they could have did there I think people care but they're not as over as they once were even as heels it's kind of it's okay it's like it could be better but that's just my personal opinion on it I don't think giving them the win there over steam would have really done nothing in the law in the grand scheme of thing unless it was Darby but outside of that the right team won this was fun I would suggest if you want to see stings last match it's worth watching for sure go watch it I think you'll enjoy yourself it's it's fun it's wrestling hokey-ness at its finest and it's fun it's fun I can't even take this one too seriously because it's fucking sting what are we talking about now people love the undertakers last match now it's just a cinematic match people love that shit that shit was fucking entertaining his technically you know his last match was against AJ in that cinematic style and that shit was fun was entertaining so same way here this was very entertaining I enjoyed it and before I end this video I just want to say I wasn't really well versed in steam during his WCW days but I knew who he was I had seen the clip seen the footage and the guy is also another face of wrestling I know people like to think Hulk Hogan and the the stone colds of the world the Randy savages the Ric flares of the world the rocks you got to put sting in that category you got to he is another face of wrestling he will always be a face of people who didn't watch the WCW like that knew who Goldberg was they knew who sting was they knew who those guys were they knew they knew and I wish he would have got a solid run in WWE before he got injured that's all Vince McMahon right there but we have another discussion about that another time you guys want me to talk about the debacle on how Vince and them just fucked over steam before you got injured but man I'm I can always appreciate someone's career and what they've done for the business and who he is he is one of the faces of wrestling and he deserves to be remembered his career deserves to be remembered and respected so I had to take time to make this video just to talk about this this is what I wanted to see the paper before and I got what I wanted this was fun match it's definitely worth checking out comment down below let me know did you guys enjoy stings last match that's all I care about you want to talk about the rest of the show and what you felt like was to match in the night you can do that down below but just specifically to this particular match did you guys enjoy it yes or no let me why why not let me know why or why not but I appreciate all love sport wrote to him 50k and I'm still yes be the YouTube rest and shampoo the world appreciate y'all can you name me see y'all next one peace


Hello, my name is Tim Sarawitz. I'm a trainer and course developer for the Linux Foundation. Today, I'd like to talk about the Kubernetes Security Fundamentals course. This course is intended to help you secure your Cloud environment and also prepare you for the Certified Kubernetes Security Specialist or CKS exam. This is not a brain dump type course focused on just passing the exam. Instead, it is meant to touch on the topics you will need to secure your production environment. Keeping a cloud environment secure is an ongoing and wide ranging task. As more moves to the cloud, we must learn how to secure more than just Kubernetes to include the hardware, operating system, configuration options, including the many possible open source projects you may end up using. Starting in the design phase, care must be taken to secure safe hardware, firmware, operating system, and cloud software binaries, and creating secure repositories to serve images to the cloud once installed. Various tools probably should be configured prior to installing Kubernetes, including centralization of access and policies. You should also harden the operating system. Once the platform is hardened and Kubernetes installed, the Kube API server has a list of considerations, tools, and settings to limit access and configure the Kube API server in an easy to understand manner. As a network intensive environment, it becomes important to secure the network, both inside Kubernetes, as done with a network policy, as well as traditional firewall tools and pod to pod encryption. Minimizing base images, insisting on container immutability, and static and runtime analysis tools are also an important part of security, which often begins with developers and is implemented in the CICD pipeline prior to an image being used in a production cluster. Tools like AppArm and SE Linux should also be used to further protect the environment from malicious software or users. Security is more than just initial settings and configuration. It is a process of issue detection using intrusion detection tools and behavioral analytics. There needs to be an ongoing process of assessment, prevention, detection, and reaction following written and often updated policies. There is also a self-paced version, Kubernetes Security Essentials, that is available. Go to training.linuxfoundation.org and sign up today.


Don't mistake the Holy Spirit's correction for condemnation. The Holy Spirit only corrects what He wants to heal. He only corrects what He wants to help you overcome. Conviction is not a punishment. Conviction is God's grace, because He loves you too much to leave you to your own compromise. So the Holy Spirit convicts us of God's righteousness. He calls us to higher places. He doesn't just tell us when we're doing something wrong.