All right, welcome everyone. So the schedule's a little bit different. You might have been expecting frienders, let's put Wi-Fi and everything talk, but unfortunately she's sick. So thankfully we've got Graham here and he will be giving his talk, here no evil, see no evil, patch no evil. Please save your questions to the end. We'll have 10 minutes for questions then. So please give a warm welcome to Graham. Thank you. So as you hear, Brenda is sick and one of my colleagues at work knew I was coming to this conference and I was chatting to him earlier. He pointed out how the president of New Zealand had recently said something about the problem of New Zealanders being too lazy and bringing in foreign, cheap, unskilled workers. Well, I'm the cheap, foreign, unskilled worker that's been brought in at the last minute to fill this slot for you, okay? And really good idea to plug these things in when you need them. So I'm gonna start off with decorators to talk about monkey patching. We'll start with decorators. You should all know what they are. It's that little at symbol at the front there, which they stole from the email addresses. If you've used decorators, you have to say decorators are useful, yes, no? Yes. They're easy to implement. They're not easy to implement. Yeah. So typical decorator, it looks simple. You can write them using a nested function or function closed, what do you wanna call it? We just create that internal function there and we're gonna use it with our bit of magic decorator syntax and we apply that, that's a typical pattern for implementing a decorator. But for those who said no, this breaks introspection. That means that if I try and get the name attribute or the doc string from that function, that will no longer work. But you might say, but doesn't func tools wrap else help fix that problem? Now the idea is we've gone and used this func tool model and we're gonna put an actual decorator on our nested function and then use that. So yes, it solves the problem of name and doc but it doesn't solve all the problems. There are still issues with introspection related to things like getting the signature of the function and various other things. It doesn't work that general thing of using a function closure when you're doing wrapping a decorator on another decorator where that inner decorator is implemented using a descriptor. And there's a whole bunch of other things as well where that sort of used a nested closure, the typical way to do things, it doesn't really work. Now, a few years ago is in Auckland. Who was in Auckland? I went to the park on a few years ago. Did you go to my talk then? One person did, I'm very sorry, okay? I killed various people's brains that I try not to make my talk so intense and full on nowadays, but I did in that one. I went into the whole details of why decorators have done wrong. And yeah, I had people come up to me later, mum's later and said, yes, I very much enjoyed your talk but I had to watch the video six times to actually understand it. So I'm not gonna do that again today. There are lots and lots of complicated details about why that basic pattern for decorator doesn't work. If you go to my blog, off on the right hand side, there's a quick links section and there's a little thing there for decorators and monkey patching. You'll find a series about a 10 or so or a dozen blog posts there which go into that whole problem of why that decorator pattern doesn't work and also talks about some more in depth the monkey patching stuff I'm gonna talk about today. So please try not to implement decorators itself. But what is the solution? The solution is this module I've written called wrapped. Now you may have used one in the past called decorator module. Don't use that one, use wrapped, okay? It's sort of taken all that lessons learned from what was wrong with that one and done it correctly and sort of hides all the details from you so you don't have to worry about it.  And we got a few magic arguments here which is the thing that was wrapped, an instance which I'll mention in a minute and args and keyword args and you can do what you want with that. You can change the arguments that they go in or change the result as it comes back out, substitute things, put timing things around that or print things, you can do whatever you like in there just like you would normal decorator, it's just we're gonna use wrapped and wrapped to worry about all the details of getting it right for you. Instant point and that's where what wrap does is actually very, very interesting. If you familiar using decorators, you might have come across the problem of having to write one decorator which you can use on a normal function versus writing a decorator that works on a method of a class. A method of a class has a self argument so it's actually quite hard to in some cases to write a decorator which you need to apply in both cases because well, how do I know that I'm being called as my wrapper function and I'm applied to a method of a class? How do I know there's that magic self argument in there? And wrap takes care of that because it gives you this instance argument and if you are called on a normal function, if your decorator was applied to a normal function, instance will be none. If you're called on a method of a class, then that instance argument will be the instance of the class. If it is decorator was applied to a class method, that instance argument will be a type object and it will be the type of the class that it was applied, the class method was on. And finally, is that all we run out of options? So function, static method or function, and the class that's top on is the class itself. You can apply decorator to a class itself and you'll get, what will you get in that case? Decorator is a class, this instance, I've marked something up there, but you can determine the difference. Ah, the wrapped is a class and that is a type in that case. So you can actually work these things out and it's what's called a universal decorator and you can make those calculations of when a thing is applied to and that becomes really useful in certain things. And one of those things is in wrapped as a bit of a bonus. It's mainly there as a sort of an illustration of what you can do. I've got this implementation of a decorator for doing mutex locking, synchronization. Now, if you're familiar with Java, they have an actual synchronized keyword which you can just essentially whack on a function and it'll do all that locking for you. This synchronized decorator I've got here works in very, very similar way. So I can apply it to a function and it'll apply a lock to that function. I'll apply it to a different function while that function's got a separate lock. But if I can also apply this to a method of a class and this is where I can use the fact that in wrapped you can know that it's a method and I can do something special. So if the synchronized decorator was applied to an instance method then I can lock that instance of the class. Now, if you've come across these synchronized decorators in the past, often the problem in here in that context is that they're only are still applying it to that one function or you have to provide an argument somehow of what you're gonna lock and all sorts of weird stuff. We can apply it to a class method in that case it'll lock the class or we can apply it to a static method in which case again it's locking on the function. And one of the key things I've done with this particular decorator is it's not just a decorator, it's actually a context manager as well. So we've got our synchronized decorator on function IAM went up there but at the same time and that's locking on the instance of the class but same down further on if I need more fine-grained locking than the function as a whole, the method as a whole, I can within there go with synchronized self and that'll lock on the instance just for that bit of block of code. And similarly down the bottom if I wanna lock on the whole class because I wanna block out something that's happening in a class method then I can do synchronized on object on the type of class. So it's a bonus thing and that shows you the power of what, well you won't be able to see it because there's a lot of magic happening underneath and the implementation of that but this would not have been possible with a standard decorator pattern but I can do this with wrapped. Now, so do you wanna trust me when I say that you should use wrapped? Well, I've had many, not many but a few core developers of CPython come up to me and say can you please work on getting this in the Python standard library? So if they're saying that, believe me, it must be awesome. So if you do do decorators, have a look at wrapped but wrapped, the primary purpose of wrapped wasn't actually for writing decorators. Most people know it before that if you have heard of it but the primary reason for it was for doing monkey patching and this is because I used to work at a company called Nurellic which did performance monitoring and who used Nurellic, who's heard it, use it. Jeez, I don't know why you guys wanna use it. If you understood the horrible stuff I'm doing underneath with monkey patching into code which you're running in production, it works. But oh my gosh, you just, obviously people trust me. They'll do the right thing. I don't work there now, but anyway. So decorators rely on similar principles to monkey patching and that's why even though this library wasn't designed for decorators, all these problems you have to solve for monkey patching are relevant to that problem of decorator because when you monkey patch, you need to have all those similar things to things. You need introspection to still work. You need all those things. You don't wanna break descriptors that you may be wrapping in that because as soon as you do something like that and break the code, I'll break your production code and you don't want that and that's why RAPT has to do this very, very well. So now, what's the difference between decorator and monkey patching? Who's used Python 2.3 or earlier? A few. So back in 2.3 and earlier, there was not the concept of decorator syntax. That at there didn't exist. In Python 2.3, you had to do this down the bottom here. Function equals function wrapper function. So instead of applying at function wrapper, you actually had to do this explicit call to apply that wrapper. That could have been a global scope or even in the body of the definition of your class, you're gonna do that. So you're actually making an execution call while the definition's been read in to apply it. Now that down the bottom is what we were more commonly referred to as monkey patching because it's like more obvious, right? It's not the special decorator syntax. But the difference is decorators are applied when the code is defined. So that at thing was a part of when it was being read in. The Python language interpreter actually worries about it for you. You'll notice with that functional call, we did it after the function being defined. So that's sort of site difference. So monkey perfection is performed after the fact and essentially we can't use that decorator syntax. But why would your monkey patch in the first place? Now I mentioned performs monitoring, which is what New Relics doing is one down the bottom there. But you may need to do it if you're using a third party package, say Django. And this man here is lazy and they taking a long time to put a fix in Django and get it released. But you need that fix straight away. And you don't wanna carry the burden of running your own fork of Django code for a while. But you need this fix. So one way you can do that is use monkey patching to apply your fix in place into the code. So import normal Django, apply monkey patch and you're good to go. And then you can wait for them a few months later to get a new version Django. Is that right? The other one where you can use monkey patching is testing. Who here uses mock or whatever it's called in Python to free our current one that's called now. So it's actually a version of it in Python 3.4 onwards something. So mock is a thing where if you wanna do testing of your code and imagine your application does an actual call out to a backend web service. But you wanna test the bit of code that does that. That web service may not exist when you're doing testing or you can't have it do that. So what you can do is use monkey patching to stub out a bit of code. So rather than actually go and do a call out you'll just return some dummy data. And that's enough to then satisfy your test. And you can compartmentalize everything. And so test a little bit of your code and not really be doing end to end testing where you're having to involve all services. That's another use for it. So monkey patching with wrap, how would you do it? So what do we have here? We have our example class. We wanna apply a wrapper around this name method in here. So we're gonna define our wrapper. I'm just gonna parse the result. We can import our example and we're gonna say we're gonna wrap function on class example with that name and we're gonna apply a wrapper. And that's all we need to do. And you think, well, but I've done this in the past. Why can't I do that? Please don't do that. Okay. That sort of direct patching of methods breaks in certain corner cases. And this is again gets back to decorators things. Is Raptors designed to worry about all these things that you probably don't know.  And in this case, wrapped worries about it for you. If you wanna know what the corner case, you can ask me later. Now that particular example, we imported our class module for the thing we want to patch and we applied that patch using that wrap function wrapper. We can start to make that a bit simpler again. There's more decorators than wrapped. So we can essentially just, in this case, we're not even going to import that module we wanna patch. We're just gonna say patch function wrapper on this module, that class with that method name. And it'll go and apply it for you. Nice, simpler. So what about testing where we do not want to apply permanent patches? So those ones go and apply a permanent patch as if we wanna fix Django, cause he's messed it up. But if we wanna do testing, so for example like mock does, where we actually only want a patch applied when we're running a particular test, we wanna apply this patch, run the test, and then take it out again. Because otherwise, if we leave it in there, then it might mark up our next test and so on. So we wanna apply patches in a certain context. So there's a decorator in there for that as well, wrapped transient function wrapper. Very similar to the patch one. But the difference is that it's not actually applying the patch at that particular point in time when it encounters this. What's gonna happen is that that creates an actual new decorator, and we're gonna put that decorator then on our test method.  When it exits, it's gonna remove the patch. And that's how we get our transient decorator. Wrap does even more than that though. If you've used mock, you'll know that, yes, you can patch a particular function, but the other thing you do is you can mock out objects. Wrapped is ways of doing that as well.  So this class called object proxy. So you can apply this to another Python object. And anything you do on that wrapper will be applied to the thing that was wrapped. The inner one. What that means is that if there's only one particular method, say we're wrapping an instance of class and we only want to intercept one method call, we could do that. We could just do this one, do what we need to do, and just call the original. Anything else you do on that will just get cast through transparently. And you don't have to worry about it. So in this case, now test, yeah, we're just gonna create our storage, this time we're gonna put a wrapper around it, and then we'll call it. So this one, look up here, go through this one up here, and clear will just go through the original. So there's all sorts of magic in there for doing that sort of stuff as well. Now, all well and good. And it doesn't solve all the problems. Now, one of the problems you come with doing monkey patching is this one here. If you import a module using this syntax here, from example import function. Anyone see where I'm going yet? Got a couple of nods, yep. So if you just go import example, and that's all you do, and then go reference example.function, the original version of that function, bad name, I got tripled up this last one, as soon as I go back and change the names, is it still inside of that module? So when I go and patch that function inside of that module, then I put a wrapper around the original one. If someone does this from example import function, they've essentially created a copy of that in another module. So if I go patch the original, I've only patched the original, I haven't patched this copy. So you end up with all these sorts of problems with monkey patching, that you don't be very careful about the order in which things are done. You need to get the monkey patching in before things like this happen. The other problem is that when I had that before example of patch this function, patch function wrapper on this thing, I had to import this module that I want to apply it to. So if I've got a huge code base where I've got a whole lot of stuff I want to patch, I've imported all those modules already. But what happens if my end application doesn't even use 90% of them? I've still dragged in all those extra modules into memory and it's going to consume memory. So what's the solution to that? So a while back someone proposed PEP 369, it was never accepted. So it's not been implemented. Don't go looking for it as part of the language. But one of the things that defined in there was this concept whereby you could specify that when a module was imported at some point later in time, that you could do something. So RAPT provides implementation of that. So in the example here I can say, RAPT when imported example, and that's my wrapper there. And as long as I get this in first, then later on whenever example is imported, if it is, it will call, it will apply that wrapper at that point in time. Or it'll call my function, then my function will then apply wrapper. So it's better, but it still does require that bit of code that I had there, the patches to be done very, very first thing in your application code file. And we're still modifying something. We're still going to modify your application code, which is not great, is it? So we need a way to trigger monkey patches without actually modifying any of your application code. Okay? And you may want to do this. For example, if you're using Gunicorn, for example, and Gunicorn's broken, well, if Gunicorn you run in the command line, you're just going to run Gunicorn blah, how do you patch that? You don't want to go having your own version of Gunicorn. So how can we solve that? And that's why I have a companion package for RAPT called Auto RAPT. So we can install Auto RAPT. And this time what we're going to do is we're going to bundle up our patch actually in a module itself and install that module.  You create a setup.py, which eventually declares what your module is, what the bits are in it, and all those sorts of things. And then you're going to do Python setup.py, well, Sdisk, for example, it gives you a table you can then install. So we're going to build a module, we're going to put our patch inside of that. Now, one of the things important here is that, this bit here, entry points. When you use setup tools, rather than distu-tils, it has this concept of entry points. And it's just a way of tagging information on a module really, which you can look up later. And what I've declared is I've declared this entry point called RAPT-Whiskey-Ref-Debugging. And in that is essentially just a list. And it just says, Whiskey-Ref-SimpleServer, and here's a function. So I'm going to declare a module called RAPT-Whiskey-Ref-Debugging, and in that side, that's going to be a function called apply patches. And Whiskey-Ref-SimpleServer is, I'm referencing this case, a module that's in the standard library, and I'll get to what I'm saying. So my code module then is, there's my apply patches function down the bottom. And this is the actual wrapper that I'm going to put around it. So the idea here is I want this apply patches to be called when this target module is imported. It's going to call that, apply my wrapper to put a timing function on this. So I can time that. How am I going to get that to actually work though? I've got a module. I've got an example bit of code, which is going to use Whiskey-Ref, for example. How do I get the two together? And this is where AutoRap comes in. Now, this is going to scare some people who know about this stuff, I'm sure. All I'm going to do is set an environment variable. And that environment variable, all it's going to have is RAPT-Whiskey-Ref-Debugging, which is the name of my entry point. I'm not going to run my Python app, and that's it. And there is my debugging that my wrapper did. I have not modified that code, yet it worked. This is scary. This man knows where I'm going. It's probably very unwise, and I think people probably were going to do it after a sec. This is really, really weird and dangerous feature in Python. When you install a package, in site packages, depending on how it's stored, there's this thing called .pth files. If you've ever gone in site packages directory and you've seen these .pth files, the main use that people will know about them is as essentially an alias, or a simlink type thing, where it says that, what it allows you to do is, if I install guinicorn, for example, and I've got version 19 or 20, whatever it is, it'll put guinicorn-20.0, whatever as a directory name in site packages, and then I'll have a guinicorn.pth file, which actually then just has a name in it, which is the name of the version directory. So it's a funny little thing like that. It means you can install things with under version names. But there's a weird behavior in it. If the line, start of the line in .pth file starts with import space, it will take that line and execute it when Python is starting up, okay, before anything else. It was originally done to do, to allow people to add in new codecs for char sets, or, I don't know the right terminology, something to do with unicode and all this sort of mess like this, where people wanted to actually put extra codecs in there. So this was to allow people to do that bit of execution to register their new thing with Python. So I'm using this. It's gross hack, but it works, it works really well. So the other thing about this is, yes, it works. Now, I mentioned how I've created a package out of my patch. Now for those who are using New Relic, you'll know that it was just installed New Relic and it just worked and did everything. Inside of that was this huge number of different sub-modules in there for patching all sorts of different things, Django, Flask, Request, and all these different things, but they all had to be in that one package. Now, from instrumentation perspective, what's quite cute with what I've done with Autorapt is that potentially you could, if we want to say, oh, New Relic's great, we can go and write our own one, but write one module which is the core of the instrumentation for performance monitoring system. But all of the different instrumentation packages and different frameworks could be all separately installed packages and you only install the one you want. And that way you wouldn't be dependent on the original author of that performance monitoring package to actually implement it because you could bundle one up yourself and put it up on PyPy and people could use it. I thought it was really interesting for that, but I haven't got around to doing about it yet. So reasons to use Autorapt, create better decorators, my awesome Fred's Synchronization decorator, but also a safe mechanism for monkey patching. So that's wrapped and I'm wrapped about it. I hope you are. All right, questions, yes? I'm just curious about, you had the synchronized decorator, do you have an unsynchronized one as well for the converse situation where you have a synchronized method and you want to drop out of the atomic operation for a moment? Why would you want to do that? You might want it generally synchronized and maybe you're doing some IO or something, I don't know, it's a general situation. Wouldn't you just not put it on there in the first place? Because the whole thing is it's a synchronized decorator which is applying it, so if you didn't need it, just don't put it on. I don't understand why you want to come in after the fact to try and undo it, but you're going to have at synchronized, at unsynchronized, or you mean in a testing context. Okay, couldn't that get dangerous? I'm having flashbacks of async programming here. Can you port PyContracts to use Wrepped, please? Can I? Port PyContracts to use Wrepped. PyContracts? PyContracts. You decorate your functions with a contract? I've never heard of it. Yeah, and the stuff was up, exactly as you said, stuff's up the signature. Talk to me later. The decorator's obviously used in lots of different places, and I keep pulling this, man, it's their fault. It's Django's fault. Django has one of these things when they have a problem where they have this decorator in there. They create a decorator in Django, and yes, it works on a normal function, and then you have to actually create a second version of the function using another function wrapper to turn it into an instance method one. But also even the Python Standard Library, there's things like LRU-Cache now. And, well, it's going to muck things up in the same way. Well, if we ever get this in the Python Standard Library, I'm looking at all these other things inside of the Python Standard Library. Would they let me change that to use this? Any other questions? So I'd have to look at the details, but I remember trying to do things that write something that was both a decorator and a syntax manager at the same time, and that's rather painful, and I'm just wondering whether RAPT helps you with that particular task? No. You can go and look at how I did it, but it's really convoluted. I never sat down and thought about, could I actually create something to make it easier? You probably could, but I never did because I was doing it in a one-off case. What are your thoughts on licensing and monkey patching? There are some licenses that allow you to use a module in the library, and then if you're...  Oh, this is... That's... I don't know. I don't have a simple answer. It just reminds me of the whole argument about using GPL modules even in a Python program, because there were some people who say that, and the general opinion seems to be, but I'm still very nervous about it, because I'm using GPL Python module and using it in other things. It's not strictly linking, so it's okay. You're not poisoned everything else, but licensing is a scary area, and I... I don't know. So, assuming you get this in the standard library, when would you recommend people use this as opposed to Mock? Mock... This provides the building blocks which I think you could use to make a better Mock. It does not provide the equivalent functionality to Mock. This is a much more roll your own solution. So Mock tries to be this one do everything type thing, and I've used RAPT for doing testing as an alternative to Mock. But yeah, you have to roll things yourself as you go.  It's not wrapping and then letting it change one little bit. So you can't just say, drop Mock and use this. It's a lot more work to cut over. This is a lot more... Okay, I won't say it's more flexible. I'll say at least we'll ensure that the integrity of things like inspection will work, because it depends on the use case. Any more questions? No? All right. Thank you. You can now... What do they call when they get rid of an illegal immigrant out of the company? Deport me? And I'll go back to Cindy. All right. Thank you, everyone. Thank you.


This paper proposes a novel approach for classifying brain tumors based on MRI images. It combines the strengths of three different models, a convolutional neural network, CNN, without augmentation, a CNN with augmentation, and a transfer learning VGG-19 model into one ensemble model. This model is then combined with a weighted average algorithm to select the best combination of weights, which are determined through a grid search. The resulting model outperformed all three individual models in terms of accuracy, precision, and F1 score. Thus, the proposed model can serve as a useful tool for radiologists to quickly and accurately diagnose brain tumors from MRI images. This article was authored by Vatsala Anand, Shifli Gupta, Dipali Gupta, and others.


I saw your face on Monday at 12.30, I knew we were going to come up here and we're going to win the football game. This one feels sweet. Nobody run the ball on this man. Let's go! Big Dubs! Big Dubs! I've been amazing baby. That's a Dubs Lambo man, Thursday night football. Family on three. One, two, three. Family! Welcome to the Bet MGM studio and the Mike Vrable show presented by Shift4. With the head coach, I'm Mike Keith. Titans win two games in five days knocking off Denver on Sunday and then beating Green Bay last Thursday by a final score of 27-17. And as we saw the open to the Mike Vrable show, did those guys have as much fun as it seems like they have? Well, when you win, you have fun. I think that that certainly helps. You put a lot of time in together and you get to know each other and I think that's all part of it is being able to work with each other and push each other and hold each other accountable, but then also build relationships and have fun. That's what this is about. What did they say on the A-team? Hannibal used to say it's great when a plan comes together. I love it when a plan comes together. I love it when a plan comes together. But it does feel that way. Watching you at the end of that game with the staff and with the players and everybody enjoying it, that's kind of the ultimate of why you do this, right? Well, it's certainly why you work so hard is to try to give the players every opportunity to go out there and have success. It's a small role that we play as coaches and we're excited for them, but I'm excited for the staff. These guys put a lot of time in, especially on that short turnaround. Alright, let's take a look at the Mike Vrable 6 pack to begin. We begin in the first quarter, first series, the big play that really gets it started and it's a deep ball. Well, third down here and you can see the protection. You know, this is a third down and you normally don't get this type of protection on third down and, you know, Ryan's able to progress through and saw the favorable matchup that we liked. And, you know, we have to be able to move the ball down the field, especially when teams aren't really expecting it.  Titans go on to score a touchdown on their first possession for the first time since the game at Indianapolis on October the 2nd. Defense was also a huge story of the night. Aaron Jones and AJ Dillon had rushed for over 200 yards combined four times this season. Had to stop the run. Had to stop the run. Had to stop the run. Did stop the run. Watch this example of stopping the run. This is some good stuff right here from the Titans defenders, whether it was run or pass, how they use these backs. Titans had to get after them. Here's Jones going wide. Yeah, look at it. We get the edge set, Sam make some bubbles. It's a little rookie show right there. We got Roger coming in there triggering Sammo and, you know, that's great to see. You can see him trying to bounce it out there and kind of had an idea that they were going to try to get the ball on the perimeter. Hadn't been too much really, you know, success in area with Thierre and Jeffrey. So, you know, those guys did a nice job. They were able to swarm and rally to the football. All right, back to offense. Another big play, an X play, as you like to say. Another rookie making a catch. And it seems like he makes one big win in every game now. This one to Chig Aconqua. Yep. And again, you can see Ryan under a little bit of duress. He drifts in the pocket.  You know, we have to catch chig and stride and let him use his skill set. But, you know, to be able to concentrate on this thing, lay out for it, secure to catch as he was going to the ground, survive in the ground, you know, love the operation. Guys went on the ball just to avoid any kind of, you know, shenanigans there and a challenge. So, gained five yards on the next play that we ran it. Trusting the young receivers big for Tannehill. Yeah. I mean, trust is a part of everything that we do.  There has to be a lot of trust. And it's between the players and the coaches as well. All right, Ryan Tannehill threw the ball very well on Thursday night. Yes, he did. Derek Henry, however, thinks he's a young Peyton Manning because he threw a touchdown pass as well. Love this call. Dust it off the old jump pass. Not that the guy that's that tall has to jump to throw it, but I think he likes to. It's added effect and, you know, you can see just the patience that's required to go in there and the trust to get into the line of scrimmage.   You'd worked it and worked it and worked it to get it right. Well, you want to just make sure that the guys are confident with it and, you know, that you don't rush it. Aaron Rodgers, the four-time MVP quarterback of the Green Bay Packers had a tough night as the Titans were harassing him all evening long. Finally in the fourth quarter, they get him and it's Jeffrey Simmons. Yeah, we have to, you know, continue to find ways to affect the quarterback here. But, you know, they closed the pocket in on him, which was great. And then as he just buys time, Jeff's able to come around there. But, you know, that pocket there was one that we really want to have against a lot of these guys. It collapses on him. You can see here from this angle, there's nowhere to step up. He's got no real throwing lanes. And then now he drifts out to the back and Jeff's able to come in here and get him. And, you know, we got to keep hitting the quarterback. You know, good things happen for defenses when you hit the quarterback. All right, let's look at one more two plays later, the exclamation point for the defense. It's fourth and one for Green Bay trying to keep it going denied. Well, and here is the inside run that we talked about. See DeMarcus Walker in there, create a new line of scrimmage. And then certainly Jeff and David Trigger in. And, you know, I think that that was a really, really good exclamation point to the way that that game went. David Long is credited with the tackle. He had a bunch in the ball game and continues to play well. And coming up next on the Mike Vrapel show presented by Shift Four, you're going to see in our epic Western Genuine Titan segment just how hard David Long plays. You're not going to want to miss this on the Mike Vrapel show. David Long Jr. is having quite a year as the Titans inside linebacker, making play after play 46 solo tackles and leading the team with a couple interceptions right now. But it just seems when something has to happen, David Long Jr. is part of the answer for the Titans defense. He was wired in a game recently and we came away thinking, this is a genuine Titan with how hard he plays and how he goes all the time. Presented by Epic Western, take a look at this genuine Titan segment. When did you know that you were going to have to be a leader on this defense? And you just weren't one of the 11 guys that you got to step up and be David Long, one of the leaders of the Titans defense. I think that just came with my play. Great. We can prepare for this. It's time to rock out. Let's go. He's my roommate back when we were rookies, so we got that connection. So I just know that every game he shows up, he's going to bring that juice. So when that just plays with effort and just wants to win, it's going to be David Long. I mean, it just shows up every game.  So shoot, I love that energy of dawn. You have to have an emotional leader like that on the field. You know, I'm a little bit older now, so like, I'm kind of cool. Got a lot of respect around the league and stuff like that. But a guy like David, he reminds me of my young self when I was out there talking trash to every single body that came across. It's easy to follow. I always tell him like right before the game, I'm like, I'm matching your energy. So he always brings the juice and gets his hype up for sure. You know, he brings all the energy from the first snap to the last snap for us as a defense. So that's something that we all appreciate and we need, you know, as a defense because you got to have a tone setter.  Hey, I love it, bro. Keep going, bro. This football team, yes. Jeanette Morley put together a beautiful, genuine Titan piece presented by Epic Western. That was awesome. That's a guy. Okay, you've been the head coach here for five years. He's been with the team for four. You've brought him along. I remember sitting and talking to you in the old office about what you wanted from him and what you saw in him. And he continues to get better. He loves football. He loves his teammates. He's fun to coach. He's competitive. You know, really exactly what we're looking for. I mean, he just, he's instinctive. He's tough as any player on our football team. And he's not the biggest linebacker. Hell, he may not be the biggest safety in the league, but he is. He finds the football and he is not afraid to run into anybody going as fast as he can. And a leader. And it is really improved in all areas. Good Blitzer, love coaching. Coming up later in the show, we will introduce you to the finalists for the 2022. Tennessee Titans, Mr. Football will have Mike Vrabel's keys to Sunday's game, but you got to know your foe first. Coming up, that's it. We'll know your foe on the Mike Vrabel show presented by Shift4. The Mike Vrabel show presented by Shift4 continues from the Bed MGM studio. Time to know your foe this weekend at noon at Nissan Stadium. It's the Cincinnati Bengals. The Bengals coming off a win at Pittsburgh 37 to 30. Joe Burrow with big numbers on Sunday and big numbers for the year, been sacked a whole bunch again in spite of the fact that they have an all new offensive line or at least a remade offensive line. Yeah, I mean, he holds it. He wants to work the ball downfield. He's not afraid to hold it. He's confident in his arm and, you know, the protection. You know, the Bengals have won five of their last six, I think. And, you know, they know how to put points up on the board. They've got great skill players. They throw to their backs, obviously, Jamar Chase and Higgins and Boyd.   I mean, they're doing a nice job, but, you know, he wants to hold it. He's willing to buy time and move the ball down the field. So it'll be a huge challenge offensively. So the leading back is obviously mixing, but P-Rine, the 240 pounder, excellent pass catcher, had three touchdown catches on Sunday against the Steelers, and then Higgins having a big year. Chase trying to come back from injury. Boyd putting up outstanding numbers. There's a chance they could have 3,000 yard receivers on this team. Let's hope not on account of the tight. Well, that's right. I'll slow that process down. When we come back, Mike Vrabel's knee sign keys to success. That's before we give you the 2022 Tennessee Titans Mr. Football finalists. A lot more to come on the Mike Vrabel show presented by Shift Forward. Titans and Bengals coming up on Sunday as the Mike Vrabel show continues from the Bed MGM studio. Let's talk about the knee sign keys to success. And when I got this, I couldn't believe it. Special teams is at the top of the list. Well, we go and order each week. Special teams, offense, defense. However, however they come up on the screen. There you go. All right. Well, so let's see it. It's be fast and violent on special teams. Well, you and I have talked and we, I thought we were really close to taking that next step and being dominant on special teams. Thought we took a step back in Green Bay. Just getting back to the essentials, the basics of special teams plays a lot of distance to travel. We need to cover it with speed and violence and make sure that we're setting the table for each series. The special teams not only have you been winning the hidden field position, that hidden yardage, but it's been setting such a tempo, such a pace. We just saw David Long come on the field after a big special teams hit. Our entire team gets up and watches covers kickoffs.  So that means a lot to me. And so we have to be able to produce and put a show on for those guys that are watching us. And we need to be doing it with speed and violence. All right. Nissan key to success. Number two is make them earn everything defensively. I have to, you know, this team is seventh in the league and X play passes. You know, that's been a key to our success recently defensively as we made teams earn it.  We have to make them earn everything. All right. So special teams, defense. Now, how about one from offense? Yes, got to run the ball. Well, we did at times against this team, but just not effectively enough consistently through four quarters and then take care of it. We've talked about the turnover margin and how critical that's going to be. But we know where our strength is and that's running the football and we've got to be creative. But we also have to lean on Derek and get going. All right. When we come back, the moment we've been waiting for tonight as we introduce you to the finalists for the 2022 Tennessee Titans, Mr. Football Awards. It's next on the Mike Drupal show. Favorite show of the year. Favorite show of the year. It's one of our favorite things that we get to do each year and that's give you the first look at the finalist for the 2022 Tennessee Titans, Mr. Football Awards. Let's jump in in Division One right away. And starting in Class A. Cabaro Brown, Memphis Academy of Science and Engineering. Jackson Cassidy, Mackenzie High School. Isaiah Thomason, Fayetteville High School. Class 2A. Jaquan Davis, Fairleigh High School. Josh Jackson, Tider Academy. Zeck Prince, East Robertson High School. Class 3A. Jordan Harris, Alcoa High School. Mark Joseph, Sheffield High School. Lance Williams, Alcoa High School. Class 4A. Gabe Borders, Macon County High School. Marcellus Jackson, Fulton High School. Walker Martinez, Anderson County High School. 5A. Deshaun Bishop, Carnes High School. Malachi Doyle, White County High School. Braden Latham, West High School. Class 6A. Justin Brown, Blackman High School. Arianne Carter, Smyrna High School. Noah Vaughn, Marival High School. Now turning to Division Two, Class A. Jared Curtis, Nashville Christian School. Kevin Finch, University School of Jackson. DJ Maryweather, Clarksville Academy. Division Two, Class AA. Caleb Beasley, Lipscomb Academy. Charlie Robinson, Web School of Knoxville. Junior Cheryl, Lipscomb Academy. And Division Two, Class 3A. Max Carroll, Briercrest Christian School. Caleb Hampton, Baylor School. Marcell Reed, Montgomery Bell Academy. And then three listed as kicker of the year finalist, regardless of classification. Max Gilbert, Lausanne Collegiate School. Ozeal Hernandez, Germantown High School. Reese Kenney, Farragut High School. Those are our finalists for the Mr. Football Awards for 2022, presented by the Tennessee Titans. We will award the winners on December 7th at Nissan Stadium at a special luncheon with our friends from the TSSAA. Mike Rabel, you like this stuff? It's quite a list. It is quite a list. And a thing that I've noticed since being here since 2018 is that the high school football has gotten better each and every year. It's gotten more competitive.  So congratulations to all those football players and especially those ones that are nominated for Mr. Football this year.  Good stuff. And good luck to everybody playing in the state semifinals this Friday night with a chance to go on next week and play in the Blue Cross Bowl championship games in Chattanooga. Remind you that the Titans are back in action this Sunday at Nissan Stadium. Tennessee will play host to Cincinnati. We'll kick it off at noon central time. For Coach Mike Rabel, I'm Mike Keith. Thanks for joining us on the Mike Rabel Show.


And with that, it's an absolute honor and privilege to welcome amongst us our chief guest for the evening, Honorable Dr. Mahesh Sharmaji, Union Minister of State for Culture and Minister of State for Environment, Forest, Climate Change, Government of India. Warm welcome to Dr. Mahesh Sharmaji. I take this moment here to invite him onto this stage and we'd like to welcome him with a small bouquet as a bang of our gratitude for his presence. Anurag, could I request you to please present our exemplary minister with this small token. I also request Dr. Mahesh Sharmaji to kindly speak with us, inspire us with his words. Welcome, sir. Good evening. Namaskar. It's a pleasure to be amongst you. And I can see the leisens in the media industry and especially the electronic channels, print media. My big salute goes to all of you. Naseem Jayadiji, who has a long experience of bureaucratic, the electioneering system, Alok Mehtaji and so many fields I can see in front of me. And my congratulations goes to Anurag Batraji and his team, complete team of exchange for the media. For this initiative of making this competition among the own people, the being the largest democracy of the world, the role of media goes in a long way and in a big way that how to take this, yes, it's a double-edged sword. The soft power of ours are population, the young population, buzzing ideas, bubbling in minds and lot to do for the society, the humanity and for the nation and for the world also. The world is looking towards us, that India will lead the world in the coming times. And we have a visionary prime minister with us who is leading all of us in a big way. This idea of selecting the best out of the best. And I think if the best would have been there, the race would have ended. We are always in search of the better than the best. And this search by this exchange for the media that selecting the best out of the best, because we are all in the same race, the fastest and the fastest ahead. As a doctor, I can tell you that what amount of stress it creates on the mind of the people is that if the fastest, the fastest ahead and the fastest ahead, then what do we have to do for that? And that too 24 hours and 365 days. So 24 hours, 365 days, the fastest ahead, the fastest ahead, that is to reach the heights and to stop at the heights. And that too with information, with recent information. And that information doesn't damage our system anywhere.  Today I tell you all who have been selected by this jury. I was just hearing that how much transparent system the jury has adopted, the best selection among all of you. As I was born here, I have been in this city for 34-35 years and along with the great desires, this city was on the border of Delhi and NCR. You all have a lot of work, this is Karm Bhumi, the area of Naira Greater Naira Gautam Bhutnagar. I also congratulate you on what work you have done on this Karm Bhumi, very political Karm Bhumi. And I expect all of you that we all can be different, we should be. Intellectual class of the society, we call it. But somewhere, somewhere, on the issues of nationality, we will have to make some kind of an agreement. Next time, for all of us, whether it is social media, we all talk about liberty of ideas, liberty of expression, what is our constitutional rights, we all talk about it. It is a good thing. But sometimes, today, because of that social media, we have to talk about a very small issue, because of the Afghans, if there is a crisis, such problems arise. Print media, I look, Mehta ji can understand this. If there is gunjahesh, there is gunjahesh of correction, gunjahesh of selection, but in electronic media, especially, and in social media, especially, when such a thing is going on, what is the thought for this? I think a very big think tank is sitting here. The elixir that will come out of all these opinions, somewhere, somewhere, the direction of our country, and not just the country, it will have to do something for humanity. Today, through social media, electronic media, we can strengthen democracy. A lot of things that the country had not yet known, a lot of corruption, a lot of crimes, a lot of atrocities by so many people. Today, under this RTI and under the electronics, when we, within seconds, we viralize the news somewhere, we get the information of the news, with the happening somewhere. So, I understand that in the coming time, this country's democracy will strengthen even more. Yes, the bottlenecks in this, the loopholes in this, I hope that all of you will be sitting here, we will also worry about this, that somewhere, this load, our strength, somewhere, we should not take it towards a disaster. This should also be a concern for us. A lot of incidents happen here. I also understand that there is no need to give any explanation for you people, you people are more sensible than me in this field. I, along with Aik Shah, with a public representative from Chikit Saq Peshya, was my neighbour, a clerk, an officer. His name was Gyan Babu. You read the newspaper for three minutes, and then you put the newspaper aside. What do you read in such a long time? You understood that his answer was going to be very funny. He said, I see this on the first page, if there is a politician's death, then the office will be vacated. Look at the vision of his tubular shows. That's it, he used to think, today, within 24 hours of electronic media, within 24 hours of 325 days, I feel that the lives of doctors and media is especially written in one word. It is written in one thread somewhere. It seems to be the same. When there is an alert in the world, then we all come to the red alert. When there is a crisis, when there is an incident, then we all come to the red alert. When Mr. Jhaidi says, now I am going to declare the date of the election, for so many minutes and seconds, and then the competition begins. Who will be the first to flash the news? In this period, as a doctor, I also say that you should mentally cool down yourself. I am telling you a lot of loophole, about the situation. Many people are suffering from this stress buzz. They are suffering too. And this should be eye-opener. In fact, I had this benefit 30 years ago. When Mr. Yogi was suffering, then I also felt that it was less to see, and less to hear. I used to feel that he had calmed me down, that the more you want to see, the more you will see, the more you will hear. So from that time on, we are self-sufficient for our health. We are healthy in the world. So the whole world is with us. We are for the world. We are self-sufficient for ourselves as well. I wish you all the best. I will have to bid you farewell, because today is a... Beautiful, big round of applause for the Minister for his beautiful, inspiring words. With that, I invite Mr. Batra on stage once again. So we can take this opportunity to present him a small token of our gratitude and appreciation. Thank you so much, sir, for inspiring us. He asked me, he's like which language, English, Hindi, your preference. I said no, your preference. And thank you very much, sir, really beautifully spoken. Your words touched our hearts. I'd like to invite, with that...


Research on lithium sulfur and lithium oxygen batteries has increased significantly in the past decade, driven by their high theoretical energy density and abundance of sulfur and oxygen. However, progress toward practical device development is hindered by fundamental key issues. Sodium-based battery systems are also being explored due to their natural abundance and potential for low-cost components. The substitution of lithium for sodium has a significant impact on the overall properties of the cell reaction, with differences in ion transport, phase stability, electrode potential, energy density, etc. Whether these differences will benefit a more reversible cell chemistry is still an open question, but some initial reports on room temperature NaS-S8 and NaS-O2 cells show promising differences compared to LiS-S8 and LiS-O2 systems. This article was authored by Philippa del Helm, Pascal Hartmann, Konrad Elbender, and others. We are article.tv, links in the description below.


Hi everyone, Joe for Jasper's casebreaks.com, coming at you with 2020 Braking Multisport Premium Edition, one box, random hit break number three. So there's only three cards in here, three spots. This is what's included in there, there you go. And Adam, Daniel, and Rhea in break number three. Good luck. And we'll type in the hits right there. So here's the last box, it's only three boxes in there, so there it is. And we mark that number three so we know it's from the same case. So let's pop that open. And we'll type in the hits in the order that they are pulled, so from top, middle, and bottom. All right, first one is going to be a graded card, and it's going to be Raphael Devers. Nice. PSA 10 from 2018 Top Chrome Baseball Update Edition. Nice, he's pretty solid. Grades really nice. And on this, another graded card, it's going to be Donovan Mitchell. Nice. 2017 Panini Prism Basketball Donovan Mitchell. Just base, not silver, PSA 9 on that. Pretty nice. We'll be seeing him in the playoffs. He goes off. That's going to boost his strong value already. And this one is, I see football, it's going to be Deshaun Watson, Prism Silver. Nice. Rookie, Deshaun Watson. Man, after Bill O'Brien taking away all his weapons, if Deshaun Watson ends up having a monster season, all right, let's keep the video rolling. So we've got the Raphael Devers, PSA 10, Gemmint 10, very nice. We've got the Donovan Mitchell, Donovan Mitchell, PSA 9, that's his rookie card, right there. So is that Devers. They're all rookies. All right, non-graded for the Deshaun Watson, but probably worth grading, to be honest. All right, let's roll it. Let's randomize it. Two and a one, three times for break number three. One, two, three, your name's first, third and final time. We got Rhea, Daniel, and Adam. Three times for the hits, good luck. Three short times, two and a one, one, two, three. There it is. Deshaun and Raphael, let's put them all together, and this is what we got, Rhea, Rhea Mitchell with the Donovan Mitchell, wait, look at that, maybe related, Daniel, Deshaun Watson, Prism Silver rookie card, and Adam with the Raphael Devers, PSA 10 rookie card, right there. Another three strong cards, ladies and gentlemen, there you go. Thanks for getting in. We'll see you next time for the next one. Joe for jaspyscasebreaks.com.


Can you hear me at the back? Can you hear me at the back? Nope. One, two, three, four, five, 17. I love brain in India. Does that work? Right. Thank you. All right. So we've been having a bug bash for the last two days. Joti. Just at least stand up and smile at people. For those people who haven't met Joti in the bug bash, you've been missing, working with a great person.  So thank you very much. We have these two beautiful specimens. I think to be a committer on Selenium, you have to have a beard. Or at least to keep committing on Selenium, you need a beard. So Simon and Luke, again, have been in the room for most of the two days, in between photo calls and working on the code base and cursing. Mainly about some of the bugs that have been found, and they'll get into that later on. So we had 21 people registered yesterday, 62 registered by today. So today was definitely the live year of the two days. We had 29 bugs logged and already 15 bugs closed. So pretty fast turnaround from the team, which is great. This is documentation, agile style, I think it's called. So essentially explaining some of the details that we discovered as part of the onboarding of getting people to start working with Selenium 3. So this is actually really important, because there are thousands and thousands of people struggling with these sort of challenges as they're trying to get their test to work with Selenium 3. So here it is as a start and all the details for how we filed the bugs. We did have a virtual team as well working on this, which is also a good encouragement.  So I'm going to hand over to Luke in a second to explain why we picked these three bugs. There's a mic somewhere. A talky talky mic. Thank you. Thanks actually to everyone who came out to the bug bash. It was interesting at times. But we certainly did appreciate people trying out the Selenium 3 alpha. It was very much an alpha. We're trying to get to a beta release. These three issues are things that were identified by some of the members there that I was not aware of beforehand, and they are barriers to our beta release. And that's why they're pretty important. And I'm glad that these got identified. The second one on the list is what caused Simon to spew profanities all day. And it's fixed now. Simon develops by breaking, and then fixing, and then breaking, and then fixing, and then it's defect driven development. So the top one, I don't believe that's the right one, but that's okay. Okay. So there was an issue with the version in the jar. That's the main one that Simon's been working on. There was an issue with transitive dependencies not getting included appropriately. So we are missing some classes in the main jar that gets distributed. And there was another issue related jar. I'm trying to remember. That's okay. The other things that we've been working on, that Simon and I have been working on, is we've been changing to a buck, our build system to use buck. There's been some minor details in that, especially with publishing to Maven, and I've been working on that all day. One of the main things that we were encountering a lot was the difference in how Firefox driver is in Selenium 3. One of the key things that we're doing is we're enabling by default the Gecko driver. Not everybody understands the implications of that. So Gecko driver is Mozilla's implementation of the Firefox driver to run the automation against that browser. What we have in the open source project, what you have been using, is an extension-based implementation that we have hosted in the Selenium HQ source repo. What is currently in the Selenium HQ repo is only working up to Firefox 46 right now. Many of you have encountered that 47 does not work with it. It's going to continue likely to not work with 47, but it's also not going to work with Firefox 48. So we know that the future of Firefox versions are not going to work with what's currently in the Selenium HQ repo for the driver implementation. That's why we need to move to Gecko. But we've also been encountering many issues with Gecko driver. Not all the APIs are implemented or behavior isn't quite as expected. So everyone be aware, we did find lots of Gecko driver bugs, which are great, but they're also logged against Mozilla itself. So if you are running with Firefox Gecko driver, know that if you log an issue against the Selenium repo, it's going to get closed and you're going to be redirected to log it against Mozilla. So you could save yourself and myself a little bit of time by just, if you're using Gecko driver, log straight with Mozilla. That's about it. Good. Thank you, Luke. So for the people who filed these bugs, I just double checked, this was your very official numbering system. Two, three, five, seven. Dyslexia rules KO. Right. Anyway, for the three people who filed these bugs, if you're in the room, can you put your hand up? You have one, two, two of them. So come forward. We've got a little something to say thank you. And which is your bug, sir? Yeah, my only. Just which is your bug? Actually, I didn't know about the bug. It's on to the time. Good. Thank you. So on behalf of your team, then, can I? Whoa, whoa, whoa, whoa, whoa. No one goes away empty-handed, whether you like it or not. So here are a couple of books. I've been involved in writing both of them. So you're very welcome to these. Take them back to your team. The electronic copies are available for free online as well. So thank you very much. So introduce yourself and which is your bug? I am Abhinav from Gemolto, Noida. And mine was 2357. Good. Well, thank you. That was the one we were arguing about numbers. Thank you very much, then. And we're missing the third person. So we'll sort that out later. Thank you very much, everyone. Playground of applause for Julian Jyoti and the whole Selenium team. I think these are great opportunities for everyone to kind of participate and start contributing. We were hoping as part of the bug bash, maybe we'll end up with few contributors or committers from India. That's something we're still lacking. So maybe we'll try again next year to see if we can make it through to get the commit bit on the project. They exist, okay?  And there are, I believe, two individuals that have the commit bit that are in or from India. Okay. I was not aware. So that's good to know.


The early 1970s included the opening of Disney World in Orlando, Florida and an important political shift between the U.S. and China when President Nixon visited China. This visit improved relations between the two countries and ended 25 years of separation between the U.S. and China. Godfrey Hounsfield revolutionized medical imaging by inventing the X-ray computer tomography scanner, also known as a CT scanner. Hounsfield later won the Nobel Prize for his invention in 1979. A committee of the National Research Council developed estimates of cancer risk after exposure to low doses of radiation. The Biological Effects and Ionizing Radiation Committee, or BEER Committee, used cancer mortality data from groups who were exposed to high doses of radiation such as Japanese bomb survivors to form a linear, no-threshold model of cancer risk for low doses. That same year, the Atomic Energy Commission introduced the safety principle of as low as reasonably achievable, more commonly known as the ALLERA principle, striving to minimize radiation doses. These actions by the National Research Council and the Atomic Energy Commission provided a foundation for the discipline of health physics to be devoted to the protection of workers and the public against small doses of ionizing radiation. In 1974, the Atomic Energy Commission was split into the Energy Research and Development Administration and the Nuclear Regulatory Commission. The NRC would regulate the commercial nuclear power industry and other uses of nuclear materials such as in nuclear medicine to ensure the safe use of radioactive materials for beneficial civilian purposes while protecting people and the environment. ERDA would manage the energy research and development, nuclear weapons, and naval reactors program. By the end of the decade, nearly 70 commercial nuclear power reactors had been licensed by the NRC to provide electricity across the United States. This commercial nuclear power fleet operated without any major incidents for several years. However, on March 28, 1979, an event occurred at the Three Mile Island Unit 2 reactor near Middletown, Pennsylvania that resulted in a partial meltdown of the reactor core. This was the most serious accident in U.S. commercial nuclear power plant operating history, although its small radioactive releases had no detectable health effects on plant workers or the public. Its aftermath brought about sweeping changes to the operation and regulation of nuclear power, including major changes to emergency response planning, reactor operator training, and radiation protection.