so you could be in the shade. We're going to start the program in a few minutes while we wait for everybody to show up and spread around. Please make sure you grab some at the snack tent. We also, that we're trying not to take home. Some gardening, whatever you need to do. So we'll play some music again. We're gonna have some kids come and entertain us while we wait for the performance. I'm gonna try to get that one too. Those ones say for our fathers, for our sons, for our brothers. So while we're going to have a spoken word in a couple of minutes, we, I want to introduce Nehemiah from the juice team and they are gonna share just a little bit about the work that they've been doing at different marches and I'm gonna give them a couple of minutes. So hello, I'm Nehemiah, but it's not just me. Latanya and Meg as well. We are the leaders of juice. So to give you a basic rundown of what juice does is, so simply, we fill in the cracks, okay? We understand that a lot of us are fresh when it comes to, or new to the social injustice fight period. So we just want to help everybody anywhere we can as long as you're fighting towards that movement. So that's exactly what we come do, whether it be security, coming to give some motivational words or give y'all some information. Whatever it is that is needed for each group, once we reach out or we reached out to, we hope to fill that gap up. So if there's anything you guys, anything else going on that you guys know about, please let us know. I'm gonna pass the mic and my queen's gonna give y'all more information as well on what we do as well as how to contact us. So y'all are the best, I'm sorry. Thank all of you guys for coming out here. You know, we really appreciate all of our allies and all of the members of our community that are willing to take their Sunday and donate to a cause like this. So how juice got together was really because we saw that there was a need for different groups to come together and unify. And that's really our main goal is to really help everybody get together so we can have the strongest voice. And we're gonna have the strongest voice if we really can all unify this way. So we look to partner with other organizations that are in the fight for social justice and we also wanna help direct people to where they can go to best really help for political change. So we wanna be out here marching, but we also wanna be out there voting. And we also wanna be out there voting not just with our ballots, but with our dollars. So really being aware of what businesses support our causes and what businesses are against it as well. Yeah, clap that one up. I gotta break stuff down because I gotta make sure y'all understand what the fight is out here for. We're marching and that is good, but that's only 1% of what we need to do. We have to be informed on how the system itself is messing us up. If we just know that it's a problem and don't know where the problem lies, we're not fixing the problem, we're just being mad at. So we're here to take the next step to be beyond just mad, be informed so we can know who we need to go here to have a sit down with or who we need to turn our backs on when it comes to spending our dollars with their companies if they're not understanding what is blatantly seen in our country. Sorry. Thank you. Thank you. Thank you. Thank you. Thank you. We got a lot of passion in our group for sure. I am going to introduce Tia, who is just an amazing volunteer, past committee for a Black Student Union at Davis High. And she's now in college at Sac State. It's easy to do something, go ahead. I'm Tia Nane and I wrote this poem called Enough Together. I haven't really read it out loud yet so I'm a little bit nervous. Enough Together, struggling to find my own identity, fighting to love myself.  They don't want you. They want those tunes you created and they never gave credit. They want that move you made and they never gave credit. They want that cotton you just picked but they never gave credit.  You started a movement and they say, but all lives matter. Of course, we are the ones close to you dying, slain by a system that's targeted them from the very beginning of time. Sometimes it's as though people don't wanna learn, but enough is enough. The government has been more than rough. People have been robbed of their lives, of their belongings. Everyone can sing, everyone must sing. In order to get over this pain that rings so deeply in our hearts, the one song that tears us all apart. Come with, come swing. I heard once that a wise man had a dream that all people would celebrate and sing and that when this happens, when we allow freedom to ring, when we let it ring from every village and every hamlet from every state and every city, we will be able to speed up that day when all of God's children, black men and white men and Jews and Gentiles, Protestants and Catholics, we will be able to join hands and sing in the words of the old Negro spiritual. Free at last, free at last. Thank God almighty, we are free at last. I live out in Sacramento. I'm gonna be out here from Sacramento. So hi, David, how you guys doing? So the first one I'm gonna talk about is gentrification. Before I kind of step into a piece about womanhood, but I wanted to talk about gentrification and how in a lot of areas we are being pushed out as black people, as communities of color. We are being pushed out and I wanted to speak to that. So, it's funny how the streets start looking different when you creep up on your old block.  My folks, they still reside and so I still rep what I come from, but the only thing familiar is the road is made of asphalt in the sky, it's still blue. And money still runs all the big talks and all my brothers still are passing and all the old spots. Just now that I got to pay a little fee so they be outside, couldn't afford it then and I was trippin' when it's too high. The old pole with the broke bow when we used to roast in freestyle. They went and put up new aesthetics then when they're feelin' the broke aesthetics. Oh you try, this ground is mine. I paid the price, the blood is dry.  Don't go too far, don't cross the line, don't make this eye.  It's only a matter of time. How long do you think you can get away with hiding your hand? Before the illusion reveals that it was just a curtain. A lot of propaganda with the little sugar mixed in. At first we aided up and now most things regurgitate in. We couldn't settle over what's feltin'. Rumblin' in the pit of my stomach. I'm no dummy, I just know that you were scammin' us. From NJ where I was born and all the places after that. ATL and Sacramento villages in Africa.  You just have to hold on to our stuff to keep it valuable. Maybe one day I can save in hopes of buying back from you and until then just be content with all the little scraps you give. Know when I hold everything, you ration 15 cents a day, the jig is up, the lever drop, so you can stop the masquerade. Say it with your chest, your big man, you want to dominate. Oh, you try, this ground is mine. I paid the price, the blood is dry. Cool down, you're gettin' too loud, girl, some more. Dad, now you want me more, findin' us some more. Don't go too far, don't cross the line. Don't make this eye when more you want. Cool down, you're gettin' too loud, girl, some more. Dad, now you want me more, findin' us some more. Man, specifically as black women, we are told not to be confident. We are told to soften our tone. We are told to not take up space. We are told to be quiet. We are told to be demure. I'm the type of black woman that says, F all of that, I'm confident as hell. Confident as hell. I might be a little arrogant, who knows? So this speech speaks to that. So like Maya Angelou said, phenomenal woman, that's me. They asked me if I had a chance if I would take it back. I told them not, the cross I had to bear was in no accident. I think of nights where all I had were hopes of coming out the hood. Used to feel like paradise on earth couldn't come fast enough. I'm on a different level and it's raising. The final cut is what they see, they think that I done made it. They don't know how I got here. I'm comin' from the basement and it's crazy. When I think of all the sacrifices that I had to make, I had to grab the do. Stay off the frisk so I could pour up. Celebratin' all the wins that I keep gettin' more of. Lookin' back at all the folks who didn't, didn't show up and show love. Doesn't matter, I still did the only thing I know of and that's me. It's anonymous with winning, it's the same damn thing. I'm on my championship. I'm takin' titles for a livin'. Soon as I step in the room, the referee declares to finish. Everywhere I go, you hear the victory bills get to ringing. Every time I take a step, I end up leading all these.   Look around, you must be blind if you don't see that I'm a winner. I'm a woman, black woman, if I mean to be specific.  Like Maya Angelou said, for now I'm a woman, that's me. My name is Grio, it's nice to meet you guys. Woo! 5.5 minutes, 5.5 minutes kneeling down, find someone shaded in total silence. If somebody can help us if your kids are back there screaming and they may be mine, um, please help us keep this quiet in a moment of silence. This time we chose 5.5 because August 6th was the 55th anniversary for the Voters' Rights Act, which actually finally allowed black women to vote. 50 years after white women were allowed to vote. So, we're still fighting for voting rights today and we wanna make sure we all have those conversations with our kids about what it means that black women weren't even allowed to vote when women were allowed to vote. 50, we're talking about 50 years. We're talking about so many issues of police violence in Davis that are affecting families like mine. All kinds of families that you would take for granted if you haven't had those things happen to you. If you've never been stopped by the police and asked if you have drugs and anything else in your minivan, like I have, then you can really take that for granted. But those freedoms need to be extended to the whole community. So, thank you so much for coming. Thank you for being part of the solution. We're gonna start 5.5 minutes of silence in honor of all the black victims that were, victims of police brutality, the women. This is for our mothers, for our daughters, for our sisters. Another group that I wanna thank is the Solidarity Space and Solidarity Summer Camp. Jordan and her team organized all the arts that we saw in the overpass and we wanna make sure this art continues to be shown in downtown Davis, so please let us know if you have an empty store space and we want these conversations to keep happening. Like we said in the last march, this is not the time for us to educate your children about Black Lives Matter. It's the time for us to come together in solidarity and then go home and have conversations.  My daughter, who is eight years old, just told me that she wants to take over from our wonderful mayor, our first Latina mayor of color, Gloria Cortita. But she's like me. I sure hope somebody else comes before me because I can't imagine waiting 20 years until a black woman can be Mayor Davis. So absolutely. All right, so we will start 5.5 minutes of silence. If we missed anything else, please let me know during this time. And Jeannie, you have a time clock. She'll let us know. Okay, starting in. Someone lost their phone. Over, they left it at the volunteer table. Got some pineapples for the volunteer table. Okay, and we also, like I said, please do not leave until you scan any of your QR codes that are on these tents. We have snacks that need to go, t-shirts that need to go home with you. So any donation whatsoever to Wiles will be beneficial for us if you could take some t-shirts. Okay, starting now. Go and vote. Go and sign the Yolo Power petition.  And thank you all for coming. Please, please keep us in the loop. Wild Events Davis, we're going to try and engage our community more and more in different ways. And thank you for practicing safety. Thank you for wearing masks and thank you all. Thank you, Jeannie. As I'm mad.


Here's the lineup for Humble Lion. Shamal Briscoe in goal. They have a back four Fabian Pascoe. Mark Rodden, Emily Grubbinson, Zidane Christie. Andrew Vanzee, Romari Harris, Jadal Williams, Javon Smith, Kier Clark, Varshan Sharpe, the players who lead the forward line. Vassal Reynolds at the head coach. Here's a formation. The lineup has a 4-2-3-1. Vanzee, Williams and Harris there. Into the midfielder, Sharpe, the out and out striker, Kier Clark and Brian, the men who have the task of providing width. Here's the lineup for Cavalier, Jadie Knight in goal. Giovanni Ling, Kyle Ling, Gidele Irving, Richard King, that back four is solid. Christopher Ainsworth, Ronaldo Barrett, Dwayne Atkinson, Shamar Watson, Shaneele Thomas and Jalmaro Calvin, the man from Antigua, Barbuda. Six goals this season. They're coached by Rudolph Speed. Yeah, 4-3-3 is what they'll work with, Dwayne Atkinson shaking off that injury where he came off just at the start of the second half in the last game, playing out wide with Ainsworth as well. And Atkinson, the player to watch. Shaneele Thomas was slotting in the attacking midfielder. One that he has enjoyed but not played often. There's a goal zone, got things going. And Cavalier, they show their intentions here. Shaneele Thomas turning well and firing directly to Brisco. They would continue. First goal. Beautiful pass from Christopher Ainsworth to Getty Lerving, the captain and what a strike it was. In the seventh minute of play, the sportsmax at that moment of the game, what a finish. Brisco beaten for pace. Left in bewilderment. They'd continue. And Atkinson loved the ball across. Shaneele Thomas right on hand just started home. That was in the 20th minute of the game. And assist for Atkinson and five goals this season. For Shaneele Thomas showing his quality in front of goal. Vanzi tested. Jane in white. And no player from home line was ready on hand to really slot home the advantage that they would have received from the rebound. Brian doing good work. Getting by. Getting the shot off. Took a deflection from King. Getty Lerving played it into his own goal. Jane in white could do nothing about that. And there was a difficulty for Jane in white. All ends out. Perhaps against the run of play, that goal was scored. And in the second, in the first half again, another great opportunity for home the line. Cleo Clark getting on the end of that header. Unable to bring it on target. It certainly would have beaten Jane in white. Had a shot in the second half with Cleo Clark. Wide of the mark. Cavalier getting that shot. Shane Sharp getting the block. Reed also testing the keeper. Briscoe had to make a save there in the nine moments of this encounter. And that was that for this encounter. Cavalier getting the win. Here the full time statistics. Only one shot on target from five attempts for home the line. Seven from eight. Great accuracy. Week on week for Cavalier. 22 fouls of split even. Two yellow cards show to Humberline. One for Cavalier. Three off sides they had. They could have done better in watching the line. Five corners to Humberline's two. Five saves made by Briscoe. Only one made by Jane in white. And possession kind of level out in the second half. 53 to 47 for Cavalier with all the marbles. Two-one. Shanil for a long period even last season you're struggling in terms of finding goals. Now you have five goals in this season. How happy are you about your performance and your goals that you set for this season? I'm happy about the performance. I must thank my teammates for providing me the goals that have been scoring. I'm being consistent and I like that. You've never minded being a provider as well. Talk to me about your new position. Today you were asked to play an attacking midfield role instead of striker. Did you enjoy it? Yeah, I've been playing that for numerous games in a note. I'm elated when I'm playing that position. I'm very happy I can see the game and I can assist or I can score. And obviously when your confidence is high as well as you said not only the goals but the ability to pick out teammates has been a strength of your game since you're a schoolboy. It seems like something you really enjoy. Assisting as well. Yeah, I really enjoy assisting. I mean, it's not a one man game. I'm about attacking players with quality. So when I get a chance to provide them with a goalscoring opportunity I will do that and they will do the same for me. When you see other players coming back into the squad like Dwayne Atkinson, obviously you have a good chemistry with him. You've been playing for a while for Cavalier. What do you think are Cavalier's chances in terms of going all the way this season, especially with the options that you have? Huge, huge, huge. I think we can take it further. Three trophies loaded us and with the players Dwayne Atkinson and King coming back into the team. I think we will come up with victors at the end of the season. All right, Shaniel, good to see you playing with a smile on your face. Congratulations on your goal so far. Keep scoring and we see you in the weeks to come. Thank you. Shaniel Thomas there.


Hello everyone, so welcome to a more technical talk So first of all, I wanted to ask a question and see Who in the room so hands up in the air who in the room loves cooking hands in the air All right, so it has nothing to do at all with the talk But I want to start with an active element to get you warmed up. So now we get into the boring bits I'll talk today about a Few concepts, but I want to start off with telling you what I will not be talking about So this will not be about infrastructure performance Like how to set up your Kubernetes clusters and things like that It will not be about frontend performance how to lazy load your images and similar things And it would also not be about network performance how to reduce the latency in your DNS round trips of something like that So these are the things that we will not cover However, we will do cover some things. So Everything I'm talking about is meant to be back-end only so in not talking about frontend performance, which is a huge topic, of course, but it's not about this talk now and This is either algorithmic in nature. So we're changing our approach of doing the Solution that we need for a problem or Implementational meaning that with the given approach that we have we try to make it faster or cheaper to execute so first of all The talk has a pretty long title and it contains performance and scalability So let me talk about these two terms because oftentimes These are confused or people think they are the same thing or they are not clear what the difference is So let me first go over that the performance is How fast you do a single unit of work and making something more performant means for a given type of work You just aim to it to execute it faster. So that it takes less time to execute the scalability is the ability of your system of your application to Easily support a high load a high usage without degrading in performance and While these two are directly related They are not the same and oftentimes optimizing for one degrades the other so if you have a system that does something a Very high amount of times and you improve the performance then it will in total take a lot less time But if you multiply that at internet scale It might mean that that time that it takes is still too much time And with the finite resources of the servers that you have it might just been mean that your servers just crash So scalability is not necessarily meek and faster. Oftentimes. It's actually making it slower But it changes the approach of how it's done so that it can more easily be done multiple times at the same In the same request for example, it can be parallelized you can do only a fraction of the work and Try to guess the rest and things like that so performance and scalability and not the same thing and Sometimes optimizing for one degrades the other So with that being said how do you how can we visualize that relationship? We have an exit Diagram here canvas with two axes One being how fast or slow? Given operation is and the other is about the distribution of our load So at the left we start with a very low load a single visitor Our our grant ma does a request on our private block It's a single request block does not do much and if we optimized for performance This will actually be very fast So we can ensure that the single operation Executes almost instantly and we get to go. However, if now all of a sudden our block is Is Shared by an Instagrammer by by an influencer What happens is that if our block is not scalable? The performance will slowly degrade the more usage our block because gets and with high load It might even end up not being able to serve these requests at all anymore because our server just crushes under the high load and with a scalable approach first of all it might actually be slower to do a single request because Usually for a scalable approach. We have much more logic It is not the simplistic way of doing it as fast as possible But there's way much more involved. We have heuristics to decide when do we do it? Do we do it at all? Maybe we only do it every ten step and so on and so forth So we have much more logic making it slower But as the load increases we are able to still serve these requests the degree the degradation is either non-existent or most of the time Happens in such a way that we still can serve these requests over the entire spectrum of the load that we need to serve So that is the relationship between performance and scalability That's a very important distinction and some of the mechanisms I'm talking about some of the concepts they improve the performance and others improve the scalability So with that being said first of all if you think that something is to slow Measure it figure out. Is it actually slow or is it just perceived? How slow is it? Measuring is important to pinpoint problems and to have a frame of reference so that if you make changes you can actually Find out if you made an improvement or if you maybe Added a regression So with measuring you can find the hotspots so that you can focus your work on where it matters most Because optimization is costly. It's time-consuming So you don't want to optimize something that is never used at all You want to optimize the one point that has the highest impact on your bad performance You optimize against requirements. So optimization is also Always a trade-off. I'm probably standing in front of the slides here. So sorry about that optimization is always a trade-off so meaning that you don't Optimize indiscriminately you figure out what your business requirements are what is the core thing You need to achieve as best as possible and you optimize for that. That might mean making something else slower It's always a trade-off and then finally Measuring in itself has an effect on your platform So the more tools you add to measure what is happening the slower your platform becomes as well because you add Overhead of measuring on top of everything else That is why it's important to always use adapted tools You can use Tools that give you very very precise measurements about what your code is doing But you wouldn't run that on the production server. The production server will just crawl to a halt So that's why There's three general categories of tools that you'd need for measuring performance and scalability Profiling is the act of running your code through a measurement system where every single line of Code is being measured and is being analyzed on its impact. So with a profile It can see okay my code spends most time in this function. It uses that much memory It has so many calls of this function and so on and so forth Then we have benchmarking which basically takes a function or subsystem and tries to execute it multiple times and then fetches average times to measure it this serves a different purpose because Some code for example will not run With the same performance on every iteration so getting getting average numbers is Something else than then profiling the actual code and then finally we have load testing and load testing is Trying to figure out how scalable your system actually is by using it from the outside by just hitting it with as much load actual load as you can and see where it breaks because Actually pretty much every system will break if you put enough load on it if you put enough stress on it so those are the three main ways of how you measure both performance and scalability and Whenever you measure something keep in mind that measuring itself has an impact as well For the WordPress System for example It is common to use query monitor to get insides into your code But remember that using query monitor makes the code slower So it is the measurements that you get give you a relative A relative measurement of how your code relates to a different version of the code But the absolute numbers don't mean anything because the absolute numbers will be completely different as soon as you switch query monitor off always keep that in mind So I Will now talk about a lot of higher level concepts and sometimes there's PHP code as well But this talk will not include that much PHP code even though it's day It's in the title that it's a PHP talk It's more about the server side of the application meaning PHP on in WordPress so One of the main concepts you should be aware of when you think about optimizing your application optimizing your code is That there is a degree of how real-time your code happens to be I Invented a few terms for this talk. So hopefully you don't mind that here. I came up with the recency spectrum So on the left we have What is pure dynamic code? So that is the default mode of WordPress to operate You have a template that is being executed every time you do web request So if someone clicks a link on in your in the browser and you just have a default WordPress installation every single time WordPress will go through an entire cycle of dynamically generating that result Then as we move further towards static code we add We add interruptions into the real-time cycle so if we talk about micro caching for example micro caching is the fact of Doing near real-time for example, if you do a News page With live ticker and things like that you want it to be pretty much real-time But actual real-time is too hard on the resources So micro caching would mean you cache it for five seconds for example five seconds delay For most people is still real-time a lot of people even take longer to even download your web page if you add enough ads to it So five seconds is nothing in terms of the recency in terms of how real-time it feels But five seconds in terms of server resources if you're getting millions of page requests per second five seconds is a huge savings potential For your server so adding that type of micro caching still feels a real-time But is way more scalable than just being dynamic then we have regular caching that usually means you decide which parts of the Which parts of your side should have which time to live so this should Be cached for 30 minutes dish this should be cached cached for two days and so on and so forth and then Every time something that was cached expires it gets regenerated. So we have control over how long You want the different sub components of your page to be cached? and That is that goes beyond micro caching so it serves even more and it saves even more server resources But this is not real-time anymore So if you have one part that is cached for a week Well, you will not get updates for weeks. You can hardly say that feels like real-time that and then we have long-lasting caches with the main difference being that It does not directly have a time to live usually time to live is very high or it doesn't expire at all And you have a trigger that invalidates the cache instead For example, you can have a cache that Stores how your post is rendered and only when you Save an update to your post the cache will get invalidated for the rest of time as long as nobody changes that post You don't need to regenerate the cache. It is still Current it doesn't grow stale over time just because of it as long as nobody changes to post It will stay current and then finally at the other end of the spectrum. We have Static code so that means there is no runtime way of updating the representation This is something like a static site generator where the entire rendering Is changed from being doing runtime to being doing compile time or doing deployment So that is as long as you don't deploy a new version of your code. It is static So this is the recency spectrum feel free to use that term if you like it I don't know if it exists. I didn't find it, but it made sense to me So with that said As we saw that the more caching we add the more server resources we save way up to being static at the end The obvious approach is cache all the things But also Curse all the caches because everybody who has ever dealt with caches knows that yeah, these things can really be a pain to debug so Yeah, you should always be Aware that as I already said before Everything is a trade-off and it is not only a trade-off in terms of performance with us versus scalability It's also a trade-off between how optimized it is and how maintenance heavy it is We have different types of caches that come into play when we work on a PHP application server The most PHP one of them is the opcode cache So the opcode cache is the cache that is used by the PHP runtime itself to store the Results of the PHP compiler. It's not technically a real compiler, but let's stick with that for simplicity's sake So when you when you execute a PHP file the PHP file is loaded from file system It is laxed it is paused it is compiled into bytecode that pile code bytecode is done processed and that is done Generating your result and the opcode cache. It actually caches to result of some of these steps We'll go into that into more detail a bit later Then we have a server-side data cache I don't know if that is a technical term basically everything you use in your custom code where you store something Hopefully not in the options database in your Redis cache and things like that. That is Just pure data that you store what that data represents might be very different things. It might be the generated html It might be information about the user that you retrieved from an API Whatever and then we have the browser side cache which is the cache that the user of your site has on their end and the browser side cache is That is the most front-end will get here But basically everything you can have end up in the browser cache means your server is not being hit anymore So that is a way of not doing the work, which is way faster than doing it in a cheap way So let's talk about cache expiry as I always said with with some of the ways you can cache You need to define What the time to live is how the cache behaves when it is invalidated and cache invalidation is the important bit That is the thing that is hard to get right and that makes all the difference because caches are perfectly fine if Your cache invalidation is perfectly fine if you have an issue with your cache invalidation then You get random output and you don't know where to start to debug. So cache invalidation is very important to get right The most simplistic way of dealing with cache expiry is a hard time to live It basically means you cash something for let's say 10 minutes So during these 10 minutes the first time you generate a result and then it is cashed Store in the cash and then for 10 minutes We always serve it from the cash and then after these 10 minutes or cash isn't expired So the next request figures out all the cash is expired. I cannot use that so it goes and Regenerates the result stores that back into the cache and then serves that cash result again that is the most basic form of caching and It is easy to implement, but it comes with a few drawbacks So usually You can imagine that most most of the time You use a cache for an operation that's expensive to do So if you now have a hot TTL and your cash expires The user requested the result, but you don't have the result. It's still So you need to regenerate it, but it was an expensive operation So it takes a long time to regenerate it and all the while the user is still waiting to actually get that result That's why a hot TTL. It's easy to be implement but oftentimes it's just Not a good experience because you have a synchronous lock on the user Until the result is regenerated again once it expired So what is an improvement on that is a soft TTL? You cannot always use a soft TTL, but when you can you should always prefer that it basically means that once you figure out that your cash has expired Instead of letting the user wait you continue to serve the stale result of the cash So you don't erase the cash results You can continue to serve the stale result But you trigger a background process to update the cash in the meantime and you can still you might still serve Thousands of users while this regeneration happens They just get stale content out of the cash which in some instances perfectly fine And then when the cash has being updated then you replace the stale version with a new updated version So that is always preferable not every it's not always usable. It depends on whether the result your request needs to be Precisely accurate or whether it needs to be good enough. It needs to be just if you have Let's get back to the news cycle For example, if you continue to serve the last version of the life ticker for two more seconds, that's not a big deal but if you Answer an authentication request with a stale result that might be more problem problematic, of course And then finally we have expiry via a cash key so The whenever you cash something you use a key to reference that part in the cash and You can actually use the cash key when when you generate the cash key You can use the the data point that defines whether Your data is fresh or stale. You can include that data point into the cash key So when there's a reason for your data to be stale your cash key will change and you will have a cash miss And that will force the cash to be regenerated without you needing to manually Adapt it so this makes your cash reactive in a form where some outside Source can actually have an effect on your cash key which creates a cash miss and therefore Automatically the catch cash is invalidated. You can only use this When you use a cash storage that cleans up after itself automatically though So don't do that with the WordPress options database for example because it will just fill up after each cash miss and As the cash key changes automatically you have no way of manually going in and cleaning up the old entries That's an important distinction so the act of Caching can be done in a hierarchical way and Oftentimes this is referred to as Russian doll caching You know these dolls where there's one inside of another inside of another And you don't see the inside dolls as long as you don't open up the outside doll and What Russian doll caching is is if you have a given result. Let's say our home page We might have full-page caching which caches the entire result. That's fine, but now if Let's say Okay, which one did I pick now for the slides? I think I picked the headline B. Let's say headline B needs to update The simplistic way of doing that is just scrapping our page cash and regenerating the entire page So with Russian doll caching we can actually have a hierarchy of caching in place with different cash keys These cash keys can use the expiry via a cash key by the way Which is a very smart way of combining Russian doll caching with an automated optimization and Then if now we want to update headline B We invalidate Headline B which invalidates the entire collection of posts and in invalidates the entire page But on navigation or the previews of the other posts or the title or whatever else They don't need to be regenerated. They stay fresh So that's That's a nice mechanism that auto optimize Optimize itself. You need to be aware of the granularity though So always make sure that You don't go too fine into detail because there's overhead Use these auto invalidating cash key. So expiry by cash key and Remember the cash limits. So the more caching you add you run a risk running into Something like your memcash running out of memory, which actually disables the cash which doesn't make things faster Also caching is a cross-cutting concern So what does that mean? We have several different layers that our application is usually built off out of and normally want to keep strictly within the limits of these layers But some concerns like caching or logging or security You cannot easily keep these within these limits because they are what is called cross-cutting concerns So they actually transcend these layers and that makes them very hard to implement properly if you do object-oriented programming for example It's always a pain to figure out how best to structure these that is not that you fail to reason about how to best put them into objects it is because they are Inherently problematic because of their nature. So there's three ways of dealing with that and This is important for caching because it means it lets you know how best to implement caching in your application through dependency injection Meaning that you can inject a cache object everywhere and then use that cache object through decorators which is a Design pattern where you wrap Whatever you have with a cached version of itself that that works well if you have Interfaces and then aspect-oriented program only to Accelerate a bit here So using dependency injection that unfortunately creates a lot of noise. So oftentimes that is the least preferable option the option I Usually prefer is using decorators Which means that if a service needs a dependency to execute some work and that execute that work is heavy we can wrap that dependency with a cached version of itself and Neither the service nor the dependency need to be changed. So you don't need to change their code You just can wrap them from the outside and then finally the There's an example of caching decorator. So you can see our code without caching and the the naive way of doing the caching would be to Immediately include the caching logic with the actual logic of your code that creates a lot of convoluted mess Unfortunately, so what we want to do instead is have the cache be encapsulated into a separate class This code didn't need to change This code didn't need to change the only thing we changed is in our bootstrapping code Where is assembler application? We wrap our fragment with a cached fragment. That's the only part that needs to change the rest of the code You see we have the original code again Aspect oriented program will not go into detail. It's a method of actually like hook-based programming in WordPress Just at the PHP function level so you can say before this function is executed or after this function is executed Do this instead and this lets you easily wrap all methods with logging or all methods with caching Now a last concept here immediate versus deferred This again like the recency we have a scale here We can do something immediately or we can not do it at all and there's several steps in between of doing that and When we When we think about whether we do something immediately or not the important part is that the web server is not a task processor So what I often see is something like this to check out It you add action and action and add action to your checkout process or to your form submission and Your web request times out. So that's not the way to do it The way to do it instead is the checkout just stalls the fact that Something was ordered and that's it and then you have background workers that pick up orders and do the heavy work Instead outside of the rep request With this out of process Execution need to always make sure that you serialize the context correctly that you can scale the web server and task process independently and use optimized infrastructure for the message queue And then don't preload pre-instantiate the entire application. So this is normal instantiation you just Execute everything all at the same time But instead you can actually use proxy objects and proxy objects are an approximation of something that's way cheaper to instantiate and This automatically optimizes everything then because when you actually hit a proxy it turns into the actual object itself Which optimizes by itself? Sorry for rushing through it. This was taking way longer than I expected Proxies are not always the exact same thing. So be aware of that again granularity is important to To consider and then you can automatically generate proxies with library called proxy manager And then the last bit code generation Code generation means that you turn something from being executed runtime to executed at compile time Which makes it not be executed at compile time at all which gets us into the skipped part of the execution scale and What happens with the opcache is if we do everything? if we compile everything we get to this where the opcache is just being read interpreted and processed instead of laxed pause compiled and so on and There as a bonus if you keep everything as static as possible all the static code ends up being this So static code it is in memory and is just being executed So this is the fastest way of of doing your logic because you're mostly not doing the logic at all So this is it. Sorry for rushing It was way shorter than I expected


Topps City in Latin America with the highest demand for English language teachers, Guatemala City. Guatemala's modern identity is still very much influenced by its Mayan roots. Paired with Spanish colonial influences, Guatemala makes for a unique and exciting destination for teaching English as a foreign language. Teachers looking to make a high salary probably shouldn't head to Guatemala. However, those looking for an exciting experience in Latin America, can find work at universities and non-profit institutes and receive reasonable salaries. Guatemala City is the largest city and capital of the country. It is located at a relatively high altitude, and is surrounded by volcanoes, such as the active Pacaya volcano in the south. The heart of the city features Plaza Mayor, where you will find the National Palace of Culture and other important buildings, such as the Metropolitan Cathedral and the National Library.


Husbanding service providers ordinarily coordinate all of the services a ship receives when pulling into port. These husbanding contracts represent a substantial financial investment for the Navy. At Naval Support Activity Suda Bay, the Fleet Logistics Center has assumed all of the responsibilities previously provided by husbanding agents, significantly reducing the cost of servicing ships while sustaining strategic forward presence. The way this helps the overall goal of URASFA is by providing a competitive, auditable, and cost-wise environment for U.S. naval assets visiting Suda Bay. What we've been able to do by removing the husbanding service provider and taking over responsibilities from the Fleet Logistics Center is really drive down cost. And our current projections show that annual savings for U.S. naval assets visiting here are going to be somewhere around $6.9 million annually. So we really hope that after a trial period that this model is going to be adapted by other ports in the region. Petty Officer Joshua Fulton, Suda Bay, Crete.


Mae gennym ni Carin Burke, dyma'n cystall psychotherapist, ysbryddiant a ysbryddiant, fel John fydd mewn gwneud o'r amser o'r cystall at y Manchurysau. Rwy'n cael eu bod yn cystall, dyma'n gwybod i nhw'n gweithio. Ond dda chi, i chi'n rai'n ddim yn ei wneud i chi i'w ddigon i gweithio a'r amser o'r anzai, i gyd-gyshdalt sydd gyd-gyshdalt, gallwn gwahanol i gyd-gyshdalt yma wedi bod yn yn ôl i gyd-gyshdalt yma yn y sefyrdd gwahanol i gyd-gyshdalt yma sydd yn 1951 bydd Pryl, Heffeline a'r Goodman, yn gyd-gyshdalt yma. Yn meddwl y gallu hynny, y gyd-gyshdalt yma. there has been a great deal of further theory since then. When I looked at the book, there are actually six different passages varying in length from a whole chapter to just sentences here and there, how we will work with anxiety as Gestalt practitioners. These were the quotes that I decided to use today. Suppression of excitement produces the breathing difficulty, which is anxiety. Anxiety is the neurotic symptom, par excellence. It is a simple psychosomatic event. Anxiety is the experience of breathing difficulty during any blocked excitement. It may seem too simple. However, hopefully I'll be able to further a little more on the theory. As you can see, breathing is actually really, really important. Why is it important? Because when we become anxious, often the breathing will become shallow. I will be talking more about this later on. However, when we remember that breathing is our major support system, stop breathing, that's it. You no longer live. So it is our primary support system. And how we breathe is very, very important. And often people who are experiencing anxiety will show a significant shallowness of breath. So what? The difference that will make to our clients is that sustained shallow breathing doesn't give the carbon dioxide enough time to send the oxygen around the body. So in fact, what happens is, is that the muscles and the organs, when breath is given out too quickly, too shallowly, what happens is, is that a panic starts to happen within the body. There are lots of people when they're talking about panic and anxiety, experience that shallowness of breath. So where we might think that this is far too simple, it's the beginning of a cycle. And the cycle that I'm going to talk about, I don't know if anybody in the room knows this cycle. No? Maybe some of you will be revisiting it, and others I'll be introducing it to. This is a gestalt cycle of awareness, also known as a gestalt cycle of experience. And it's about the self and how the self reacts to the environment. It begins with a sensation, grows into an awareness, onto mobilisation and interaction, gaining full and final contact, receiving satisfaction and then withdraw. What does that mean? Let me give you an example. A sensation that I'm feeling right here and now is I feel a dryness in my mouth. I can notice that my tongue is slightly curled at the edges. The feeling of air in my throat, the emotion is I need something. Because an emotion will generally begin between sensation and awareness. The awareness is I need a drink. Can I? How can I get a drink is a mobilisation. It's gaining enough energy, excitement within the body to actually mobilise us into action. The action will be to walk to the kitchen, turn on the tap and pour myself a drink. So with the awareness that I need a drink, recognising I have enough energy to do that, that my need is so needful, then I go to the kitchen, turn on the tap, fill a glass, that's the action. To gain full and final contact, I don't pour it over my head. I don't stick my feet in it. What I do is I drink. I don't drink 10 gallons and oversaturate myself. I don't take just a sip. I know when I have taping enough. And that is when I will have full and final contact. In that, I have satisfaction. And from then, the need for a drink withdraws. And I wait in the fertile void for the next sensation to appear. Does that make sense? Oh lovely, lots of nodding heads. So, I feel the sensation of dryness in my throat. It's like curling of the tongue. Awareness, I need a drink. I can go to the kitchen, get myself up. I go to the kitchen, I don't interrupt myself. But when I get there, there's a small fire. Somebody's left a frying pan on and it's burning. I don't go to the tap to get myself a drink. The primary driver is to stay alive. So, my sensation may be fear. My sensation may be it's rather warm in here. My awareness is I need to do something about this. A new gestalt has begun. And I've left having a drink. The mobilisation is do something before my life is in danger. I may use the tap and the water to actually dampen a tea kettle, throw it over the frying pan, then switch off the electricity, which would be the full and final contact. The satisfaction is I'm not going to get burned. I will still be alive. It is only then that the need for a drink comes up. There will always be a primary driver to survive. And it is often only after that need is met that this gestalt reappears.


and make a reactor. And we are out at this beautiful location of Banda. Well, for us, drone pilot's is actually a beautiful place because there's so much awesome stuff to fly here, but there's also so many places that you can crash and maybe have a little bit of a hard time finding your drone. Yeah, and sometimes your battery gets unplugged and you have no way to find your quad. That's when you're gonna have the hardest time finding a crashed drone because you can't turn on your beeper, you can't see through your goggles. This resulted in some serious drone search missions where we're wading through grass with metal detectors trying to find something. So companies have kind of thought like this might happen. So they've made a beeper that has a battery attached to it. So when your battery unplugged, it'll still beep. Yeah, this is the ViFly Finder 2. It has its own built-in battery and that battery will power the system and after a few seconds of not having power, then it starts to beep on its own. Yeah, which sounds like a really good idea. It sounds like a really good idea until you have to unplug your drone and then it starts beeping and you're like, what is that noise? And everyone at the fly feels like manicure. These things are so annoying. What usually happens to me is it gets ripped off and thrown in the trash because it's annoying. Yeah, it's so annoying because it adds an extra step to unplugging your quad. So we're always looking for a different way that we might be able to find our drones when the battery comes unplugged. It doesn't have so many obnoxious trade-offs and I was going through Best Buy one time and I saw the Apple AirTag. These things were initially invented to find your lost keys, right? You lost your keys. You can say, Siri, where are my keys? Find it, Siri. Oh, look, I got the arrow. I got the arrow. I got the arrow. There they are, right where I threw them dramatically. I mean, to be fair, there's a company that made this technology way before Apple called Tile. Right, I think the Bluetooth that Apple is using now has better range. It can also locate based on anyone else's Apple device. Oh, you could just do it with an Apple iPhone. Anyone that has an Apple, iPhone, iPad, whatever, if they walk by it, they don't need to have like some third-party app installed. Yeah, that's way better. It'll pin you. Apple always knows where you are. And I love it. I don't need privacy. I need to find my truck keys, okay? We're gonna put this to the test. We're gonna see, is an AirTag actually a good way to find your drone? Can it compete with the ViFly buzzer? So we got two teams of two here, and one team is gonna crash a drone somewhere, and the other team is gonna have to use one of the tools to try to find that drone.  We're not gonna have any idea where it is. We're gonna crash one of your drones with the ViFly buzzer installed, and you guys are gonna try and use that to find out where it is. What do you do? Those props are fine. What do you mean you gotta change them? I gotta change my props. These are fine. Let's just fly these. I need props, different props. Why does he change their props? He's gonna put gray props on. What? As camouflage as that can be, better. So Sean's got the drone already, no batteries trapped, he's got some Velcro on either side. We're gonna stick it on. Tricks in there, she's gonna crash. Batteries gone. Hopefully this thing makes some noise and we can find it. It's not. It's not throwing things at me.  Oh yeah it is. Oh yeah. Okay. That's loud. That is so loud. That's so much louder than the AirTag. Oh my God, make it stop. I'm already so mad about it. To make it stop, one way to do it is to plug the battery and unplug it really quickly. So like this, and then it's done. Nope, nope, it's still beeping. Plug it for like one Mississippi, two Mississippi. Unclog. Okay. Oh my God, how do you make it stop? Tructions. All right, you gotta push the button. Okay. There you go. Every time. That's annoying, isn't it? The by-fly buzzer on it, which makes such loud, obnoxious beeps, which makes it easy to find. So all we have to do is prevent them from hearing it. Exactly. It is very loud. So we need a place that is maybe far away and that can muffle the sound. And you know this place better than I do. So I'm gonna rely on you watching me fly and kind of... Yeah, yeah, yeah. Ready? I mean, it's pretty good. Yeah. Okay, I'm gonna crash. How are you gonna crash? I don't know. How should I crash? I think you have to bounce on something. Yeah, I think you need to like hit something hard to get that battery to it, Jack. Okay. And then, but you want it to fling into a tree so we're just gonna hope it. Okay, this is gonna be tough to get into the wall. Actually, half is correct, say. I feel like it's so easy for us to crash on a daily basis, but now we're like... Like trying to crash? I froze. I don't know if it actually... All right, if it froze, the battery's in part. Okay. All right, we're gonna get ready. The time starts. Three, two, one, go! Go, go, go, go, go! All right, go! Let's go, let's go, let's go. Oh, we gotta... Okay. We're gonna check in here first. All right, everyone, wait, let's just be quietly fast, everyone. Okay, nothing. I hear it, it's out here. Right here? It's about two minutes. They ain't got it yet. They ain't got it. Yep, I hear it. It's right over here. All right, so I see they're playing dirty. They're playing dirty.  That's okay, I am team player here. Thank you, Sean. They got the quad. Sean's a real team player. Yeah, you see those weeds over there, the really tall ones? Go crash over there. That's what he said. I know he did. I'll crash mine like a bush over there. Yeah, yeah, yeah, I make them climb through the stuff. I mean, it's my drone. There you go. Do we have to get back to them for the time? You gotta even get back to the truck. What? Time doesn't stop, so you can get back to the truck. Nobody gave us these tools. Stop. Four minutes to get back to the truck in seconds. You make up the rules as you go, I swear. Yeah. Four minutes to get back to the truck in seconds. Cheater, cheater. Four minutes to 40 seconds. That's the official time. You know that whole story about a bunny and a turtle? And the bunny stopped to frag? That's you. That was a hair. Hair is the difference. So now you guys are gonna fly this drone with our air tag and we'll see how quickly we can find that. They're gonna expect us to put it in the grass because we just talked about it, right? So we're gonna put it all the way in the back. We didn't even go upstairs. All the way upstairs in the corner. What I'm gonna do is I'm gonna like take off and like full throttle over there so they hear the quad go way over there but then I'm gonna go around the back and I can go through that back door over there. Yeah, and then come in and go all the way over there.  All right, here we go. Oh, man, it's getting quiet. Must be in the back room now. So we go right in the corner. All right, is it crashed?  All right, here we go. All right, here we go. See, it still says it's here. It does? It still says it's backed by the truck so it didn't follow it as it was. I mean, I don't know how whatever track it as it flew but yeah, I'm just gonna do find. Oh no, that's my truck. How do I find my drone? Find my drone. Find. Oh yeah, see, it says I hasn't seen it in two minutes. Searching for signal. We got nothing. We got nothing. Oh God. Okay, hold on, hold on. They're not gonna do exactly what we did, right? If they get past three minutes, then realistically, I think we won. Yeah, if they get past four minutes, we definitely won. Come on. Come on, iPhone. Oh no, low battery. Oh no. I wish we could split up but like it can only be paired to my phone. Although, oh my God, if you had an iPhone, you could run around and it would still ping me. Do you have your iPhone on you? No, he's using the first iPhone. No! I'm trying to reverse engineer how smart they might be. We were like, all we have is sound so we tried to muffle the sound with the bush. If they were smart, they would try to block the Bluetooth signal so they'd like fast to the dumpster, maybe? Yeah. There's a lot. Three minutes already. Oh, you got this. Yeah. We're cheating, we still won. Even with your cheating, we still won. What? I hear something. Oh my God, it's the ESC beeper. Is the ESC beeper still working? They didn't get the battery to disconnect. Oh, that's why this, okay. Okay. You're it. Yeah. Is it there? Oh, wait, it's connected. I mean, I hear it. Is it on the other side of the wall? Yeah. It's either up there? It's up in there.  I don't know. I do that outside. Dude, I don't know though. The ESC beeper hadn't gone on. Shoot. I mean, if you really have no clue where to, you have to be really close to it. I'm still, I still got nothing. I can't turn on my flash. Connected. 12 feet, 11. Now I got my arrow, which is good because I can't see anything. Yeah. I can't, it's so dark in here. More light required. Yep, found it. We got it. All right, let's get it back to the... That's fine. You got the truck to the time to go, man. What are you walking? It felt like an eternity. Wow. Did it actually take you to the right spot? Like when you got semi-close? The ESC beeper went off. I told him, I was like, it's 10 minutes, the ESC beepers going off now. Dude, we had to be so close to it. We had to be so close for it to connect. And then I didn't realize it actually uses, like through the camera, when it got in the dark, it said more light required. So I mean, I was right on top of it at that point anyway, but like, I guess it actually looks through the camera to like try it. Oh my gosh. That is weird. So we actually heard the beeper from the first floor. Oh my gosh. It made it to the corner and I'm like, it's up there. When you're going in with just having no clue where the quad is, I hate to say it, but the loud, annoying beeps, I mean, that's what saved us. And clearly it helps you guys get it real quick. Yeah. So all this fancy technology doesn't always help. Works for some stuff, but it doesn't work for drones. So are they still annoying? Yes, they're so annoying, but like there's no question that it's the best option. If your battery is going to come just connected, you have this baby, this loud, horrible buzzer.  It really is a great solution. It just has all these kind of obnoxious behaviors, but like that's how you find it. I think I'm going to put someone on one of my buttons. No, don't do it, dude. I'm trying to sell stuff, dude. I'm trying to sell stuff. Just strap your battery with two battery straps and use Velcro underneath. Do it like that.  But if you guys really want to feel extra secure, we do have these buzzers in the store, Rotorat.com, you have a bunch of buddies. I've got a lot of my friends that use it and they swear by it and they just love it. They just got used to pushing the button when they unplugged the drone and they just don't have to deal with the beeping. I clearly love Apple products, but I don't think this really, it doesn't work for drones. I don't think it's really up to snuff for what we need to do. Thanks guys so much for watching this episode of Rotorat. If you really liked this video, make sure to hit the thumbs up button. We post videos every Monday, so hit the subscribe button so you can stay tuned to our channel. Don't forget the bell. I don't want you to miss a single one. Hit the bell. Every Monday. Guys, I'm LaDrip. I'm MakeAriacha. And I'm Let's Flyer C and we'll see you next time on Rotorat.


So, good afternoon. It's really good to be back at CNI. Chris and I have divided this briefing into two parts. The bad news and the maybe not so quite so bad news. And in my traditional role as Cassandra, I get to go first with the really bad news. So, we just heard Herbert tell us a lot about how to publish on the web the right way. The bad news can be summed up in two parts. One of them is that people who publish on the web don't actually pay any attention to what Herbert says. And the second one is Herbert was gossing over some rather hard issues along the way. So, it's not your grandfather's web any longer. Well, I am actually a grandfather and I'm old enough to remember the web the way it was. Actually, I'm old enough to remember back a long time before there was a web. About this time in 2015 will be the 50th anniversary of the first program I ever wrote. A couple of years later I started life as a Cambridge undergraduate and encountered computer graphics. This is a deck with a 340 display which is how I started doing computer graphics. And just before that one of the smartest people I ever ended up meeting co-authored a paper on computer graphics entitled On the Design of Display Processes. That was Ivan Sutherland. He introduced the idea of the wheel of reincarnation as applied to graphics hardware. The idea that the design of the hardware was cyclical. It started out between with a fixed function IO peripheral that over time grew into a programmable IO processor that ended up being a fully functional computer connected to a fixed function display. And that wheel is still rolling right along. When we started NVIDIA 20 years ago we designed a fixed function graphics chip. Almost all our competitors and six months after we started NVIDIA we knew about over 30 other competitors. They pretty much all designed fully programmable graphics chips. It was one of our key performance advantages that allowed us to get for the very first time ever arcade games running at full frame rate on a PC. This is Sega's Virtua Fighter on an NV1 chip preserved on YouTube. The bottleneck was the frame buffer memory and the advantage we had was that we used every single memory cycle to render graphics. All these programmable people had to take some of the memory cycles to fetch instructions out of the frame buffer for their program. Of course now NVIDIA's chips are fully programmable GPUs. In 20 years they've gone halfway around the wheel from fixed function to fully programmable. The wheel also applies to graphics and user interface software. The early window systems like SunView and the Andrew window system were libraries of fixed functions as was the X window system which ended up being very successful. James Gosling and I tried to move a half turn around the web with a system called News which was a user interface environment fully programmable in Postgres. Postgres is actually a pretty neat programming language but we were premature it didn't work out. What's this got to do with the web? Well the half turn around the web that James and I couldn't manage has actually happened on the web. The web that Tim Berners-Lee invented was in a practical implementation of Ted Nelson's utopian concept of Xanadu. A web of documents connected by hyperlinks encoded in a fixed function document description language. That web was pretty easy to ingest for preservation because a crawler could visit the page, easily find the links in it, follow them to other pages it needed to ingest. And it was relatively easy to preserve once ingested because the content of each document changed infrequently so two visits in succession would probably obtain the same content. The phenomenal success of the Internet Archive was based on this model. Here from the Wayback Machine is the front page of BBC News from more than 15 years ago. The only difficult aspect was replaying the preserved content so that the links resolved to their preserved targets rather than their current targets. It wasn't until the work that Herbert's just told us about, about Memento, that this part of the problem was resolved. But, as we should have predicted based on the history that I went through, the web we all use today is a half turn around the wheel from that web. That web's primary language was HTML, document description language. The browser downloaded documents and rendered the fixed set of primitives they contained. Browsers still do that. Of course, once a network protocol like HTTP or HTML gets widely used, it can't really be changed in incompatible ways. But mostly what browsers do these days is download and run programs in the current web's primary language, which is JavaScript. JavaScript is a programming language, not a document description language. Your browser is only incidentally a document rendering engine. Its primary function is as a virtual machine host. So I use a Firefox plugin called NoScript. This screen grab shows that at least 11 sites wanted to run programs in my browser as I visited the front page of the New York Times a couple of weeks ago. So Chris and I organized a workshop last year to look at the problems this evolution of the web poses for attempts to connect and preserving. And here is a list of the problem areas the workshop identified. Now, clearly I don't have time to go through all of these individually in detail. For that, you should check the document that the workshop generated. And you can find it, and you don't have to take notes about my part of the talk anyway, because the text will go up on my blog, blog.dshr.org, at the end of this talk. And then we'll incorporate first things right? No. I take a lot of care writing these things when they're written they're done. I don't want people seeing previous versions of what I wrote. So I'm going to try and abstract out of this mess a few big picture problems. First, in order to preserve content from the web, you need to be able to access it. Increasingly, as news disappears behind slightly porous paywalls and sites use social network identities to gate access, this is becoming more difficult. Equipping a crawler with a credit card to pay for access is not really a practical approach. But the problem is compounded by another trend, sites that forbid access, for example, because the content is behind a paywall, and show you a login page, no longer do so with an error code, such as a 403 forbidden. They put up a login page with a 200 okay. And this is a result of this behavior. This is an article from the defunct journal graft as preserved at the internet archive. And the message here is this item requires a subscription to graft online. This, from the clocks archive, is what the article looks like if you actually have a subscription. A web archive full of pages explaining that the actual content is inaccessible may be an accurate reflection of the state of the web at that time, but it's not really a great way of preserving our digital heritage. Determining that some content that was delivered with a 200 okay code is actually not valid content preserved is hard. The lock system is designed to preserve subscription content, so this is a problem that we face every day. We have to write really crafty, custom per site login page detectors in order to handle it. So when somebody says HTML, what you think of is something that looks like this, which this looks like familiar HTML, but actually it's an HTML5 geolocation demo. Most of what you actually get from web servers now is programs like the nearly 12 kilobytes of JavaScript, which is included by the three script lines near the top of the page. This is the shortest by far of the three files, and it looks exactly like a program, right? A crawler collecting the page can't just scan the contents to find the links to the next content it needs to request. It has to actually execute the program to find these links. This raises all sorts of issues. The first is the program may actually be malicious, and a lot of them out there on the web are. So its execution needs to be carefully sandboxed. Even if the program doesn't intend to be malicious, its execution will require an unpredictable amount of time, which can amount to a denial of service attack on the crawler. So how many of you have encountered pages that froze your browser? Everybody's nodding. Executing may not even be slow enough to amount to an attack, but it will be a lot more expensive than simply scanning the page for links. So ingesting content from the web just got a lot more expensive in compute terms, which doesn't help the whole economic sustainability is job one problem. And then again, it's easy to say execute the content, but the execution of the content depends on the inputs the program obtains. In this case, the inputs are the geolocation of the crawler, and the weather at the geolocation of the crawler at the time that it was crawled. In general, inputs depend on, for example, the set of cookies, the contents of HTML5's local storage in the browser that the crawler is emulating, the state of all the external databases the program may call upon, and the user's inputs. So the crawler has not merely to run the program, it also has to emulate a user mousing and clicking everywhere in the page looking for behaviors that trigger new links. But we're not just finding links for their own sake, we want to preserve those links and the content they point to for future dissemination. If we preserve the programs for future re-execution, we also have to preserve some of these inputs, such as the responses to database queries, and supply those responses at the appropriate times during the re-execution. Other inputs, such as the mouse movements and clicks, have to be left to the future reader to supply. This is very tricky, and there are all sorts of other issues, like you have to be able to fake the secure HTTPS connections and so on. Re-executing the program in the future is a very fragile endeavor. This isn't because the JavaScript virtual machine will become obsolete, it's very well supported by an open source stack, several open source stacks. It's because it's very difficult to be sure which of the significant inputs you need to capture, preserve and re-supply. So a trivial example is a JavaScript program that displays the date. Is the correct preserved behavior to display the date when it was ingested to preserve the original user experience, or to display the date when it will be re-executed, which is to preserve the original functionality? There's really no right answer. Among the projects that are exploring the problem of preserving executable objects are Oliver Coney Mellon, which is preserving virtual machines containing executable objects. But I don't believe it's really exploring preserving their inputs. And Workflow Forever, another of Caragobal's projects, which is trying to encapsulate scientific workflows and adequate metadata for their later reuse into research objects. The metadata includes sample datasets and corresponding results so the correct preservation can be demonstrated. They've just written a paper showing that generating the metadata for the re-execution of a significant real workflow is a major effort. And even for workflows, which are a simpler case than generic JavaScript, Workflow Forever has to impose some restrictions in order to make it work. You can think of this as analogous to PDF-A, which turns off all the hard-to-preserve aspects of PDF. For the broader world of web preservation, the HTMLA approach isn't likely to be robust enough, even if we could persuade websites to publish two different versions, one of them for use and one of them in HTMLA for preservation. Well, an alternative that preserves the user experience but not the functionality is, in effect, to push the system one more half turn around the wheel, reducing the content to fix function primitives. Not to try to re-execute the program, but to try to re-render the result of executing the program. The YouTube of Virtual Fighter is a simple example of this kind. It may be the best that we can do to cope with a special complexity of video games, most of which have complex DRM and server-based backends and things like this. In the re-render approach, as the crawler executes the program, it will record the display and build a map of the sensitive areas with the results of activating each of them. You can think of this as a form of preemptive format migration, which is an approach that both Jeff Rothenberg and I have been arguing against for a long time. As with games, it may be that this wild flawed is the best we can do with the programs on the web we have. So now the question is, what on earth are all these programs doing in your browser? Mostly what they're doing is capturing information about you so that it can be sold. I won't shed a lot of tears if we fail to preserve this aspect of the web, because some of the captured and sold information drives what you see in the page, such as the advertisements. So I've never understood why archivists think that preserving spoof ads is important, whether they're selling fake products or real products, but preserving real ads is not that important, even though they dominate our political discourse. So the programs that run in your browser these days also ensure that every visit to a web page is a unique experience, full of up to the second personalised content. The challenge of preserving the web is like that of preserving theatre or dance. Every performance is a unique and unrepeatable interaction between the performers, in this case a vast collection of dynamically changing databases, and the audience. Actually it's even worse, it's like preserving a dance performed billions of times each time for an audience of one, who is also the director of their individual performance. So we need to ask what we're trying to achieve by preserving web content. We haven't managed to preserve everything we've done so far, and we can expect to preserve even less going forward. So there are a range of different goals. On one extreme, the Wayback machine tries to preserve samples of the whole web. Now, when Brewster originally told me that this is what he wanted to do, I thought he was nuts. But I was totally wrong. A series of samples of the web, even if they're noisy, through time turns out to be an incredibly valuable resource. In the early days the unreliability of HTTP and the simplicity of the content meant that the sample was fairly random. The difficulties caused by the evolution of the web are introducing an increasing systematic bias towards the pages that are easy to capture. In the LOX program, the other extreme, we sample in another way. We try and preserve everything about a carefully selected set of web pages, mostly academic journals and books. The sample is created by librarians' selection. It's a sample because we don't have the resources to preserve every academic journal, even if there was an agreed definition of what an academic journal is. And again, the evolution of the web is making this job gradually more and more difficult. What we're preserving more and more is the easy to preserve parts. So what Web Archiving is about is preserving a sample of the web. We're not going to get everything. And the web evolution is introducing a systematic bias into this. And in order to combat this, we need to have a diversity of approaches. Most Web Archiving at the moment is done by the Internet Archive and other people using the same tools as the Internet Archive. And this is dangerous because everybody's got the same systematic bias. And the good news to transition to Chris is that at least Memento provides a way of unifying diverse collections from the web into a single resource that people can access uniformly. Okay, Chris. Is it going to turn this switch? Sorry, one. I think if we escape, maybe then. Okay. So what I'm going to attempt to do is provide a little bit of hope, a little light at the end of the tunnel. As you can tell from this slide, which actually is produced by a project called 10x, which is working on the semantic web end of the spectrum of this visual, the web is an incredibly complex ecosystem today. It's not any one set of techniques, approaches, implementations. It's a diverse network of everything you can imagine and all the things that we haven't thought of yet that somebody in their garage is going to put out there in the next two to six months. And as archivists in this context, we are charted with trying to come up with pragmatic, scalable, sustainable approaches to try to sample and collect and preserve as much of this material as possible. And as David pointed out, there's a whole another set of issues relating to access to these materials. Because we can't cover the full spectrum of all of that today, what I'm going to try to concentrate on is what are some of the innovations that are in this presentation happening on the collection and data preparation side of the equation that enable the access. There's a lot of additional research and innovation happening on access, but we're not going to be able to talk about all of that here today. So in this context, even looking at whether you're taking an entire national domain and crawling sort of every registered entity within that sphere, you're going to touch upon everything, at least in these three squares and a few things that start to spill into what we're referring to as sort of the ubiquitous web, which gets a lot more complex. But today we sort of regularly address sort of those three. And what we used to think was that smaller, more curated collections of content would be easier to manage. And unfortunately that's not the case. If you even try to create a capture of the federal congressional branch of the U.S. government, you will hit every single thing displayed in this visual above. The spectrum of content that we're wrestling with on a day-to-day basis continues to be more and more diverse as David articulated. So what I want to do is try to set the stage on how are we sort of approaching this. And so first and foremost, it's important to understand what sort of the classical model of web harvesting looks like. And that's specifically you're asking a question of a resource. Usually in the model of you're identifying yourself as a particular client. You might be an iPhone 5. You might be a Firefox web browser with this particular version. But you are identifying yourself in a specific way. You're asking a specific question and then you're waiting for the answers to that question to be returned.  These are primarily unique URIs but occasionally you're also identifying specific MIME types that need closer attention or special processing and analysis. So this is sort of the classical model of a traditional web harvester. A lot of what we're basing this on, of course, is the most widely used open source web crawler hair tricks. But there are lots of other proprietary crawlers out there that obviously use this same framework. In terms of trying to talk through where things are evolving, it's important to understand the difference between how a crawler interacts with the resource and how a traditional client, even if you're mimicking that client in kind of this traditional harvesting context, might be. So browsers are really sort of optimized for getting only as much as you need to display that particular view at that moment in time that that end user is experiencing. Then a browser can respond obviously to inputs that allow you to go deeper and deeper into that resource. A crawler can only get additional content that would be initiated and identified by a user interaction. A crawler can often not, as a standalone entity, execute a script and discover links. There are extractors that have been designed and developed and embedded in order to try to mimic that behavior, but it doesn't act in the same way as a browser might. So a lot of what you're having to do with the crawler is contain it a little bit because it can quickly overwhelm the server and cause unintended consequences for interaction of other users with that resource, which is unacceptable in general web activity. So there's a lot of rules that have to be structured in order to guide the behavior of a crawler while it's in progress. And depending upon what kind of institution you are and what rights you hold, there are specific rules that must be obeyed or should be obeyed or might be obeyed in different contexts. And this is where all of the gray zone comes into play and why there's so much complexity even when you get down to the end of the momentum, end of the spectrum when Herbert was referring to access rights and issues that that has. You can have a public web archive, but you might not be able to view any of the video content embedded in pages because there's a live restriction that's published out on the web by the owner of that content that says, nope, sorry, you can't see this. And depending upon whether you are the national institution that is legally mandated to collect and make that accessible again, it may only happen within the four walls of your reading room and not over the public web. So those are some of the things that come into play between the two resources. And this is just a quick visual that gives you a little bit of an idea that when a browser goes out to a website, what all the things are that are happening simultaneously in terms of collecting the resources that might need to be assembled in order to view that. So what's happening in the web in general? So this is not specific to cultural heritage or academia. The proprietary commercial web is also spending a lot of time integrating browsers and traditional crawling methods primarily for discovery, for supporting sort of the search engines that we all know and love and have come to depend on in our day-to-day lives. However, the difference is that those engines just need to be able to discover the location of a particular resource and try to identify meaningful text and context. It might be metadata that they can collect around that resource and surface that back up in a discovery context. When you're talking about an archival capture, the bar right now is set very, very high in terms of you're trying to recreate an experience that perhaps a human being sitting in front of a device experienced at a date, at a point in time, at a location, on the web. So you're taking all of that into account and attempting to not only capture and preserve it, but then have a chance of re-rendering that context at some point in the future. So when I talk through this quickly, please keep that context in mind. There's a lot of tremendous commercial innovation that we can take advantage of, but it only gets us so far and then we as a community have to sort of carry it further from there because until some of the corporate compliance, legal compliance that is now affecting publishers around the globe really comes into effect and there's a mandate to preserve this content for, you know, more than 10 years, we're probably not going to see as much innovation there. However, we do think that personal web archiving will continue to provide some interesting innovations for us as a community because more and more individuals have their entire lives in digital form across a wide array of sites that publish and aggregate and maintain this content on their behalf, whether it be photos, videos, blogs, you know, other types of content. So again, they're starting, the commercial sector is starting to tackle some of the same issues that we are. In general, the experimentation with browsers have fallen into three camps. You have extractor modules that are written for traditional crawlers and embedded. The idea being you send a set of locations to a browser emulator that may be a fully instantiated browser or a headless browser that basically records the communication between a client and server, records all that information, passes it on to the crawler for a collection. You also have the standalone headless browser clusters that are being used for similar purposes, primarily for preceding data collection, quality assurance during and following a crawl, whereby you can look at all of the resources that are written to a particular repository, compare it with the communication that you have documented and determine whether or not everything has been captured. If not, it then gets queued up for either a special process to go out and explicitly grab a particular file and or maybe just as part of a typical patch crawl cycle. But you also have on sort of an additional end of the spectrum this concept of a more fully functional engine that allows site publishers to test sort of their design and implementation of standalone websites. That infrastructure is largely available in open source format. There's a number of different projects and programs out there. Much of the international internet preservation consortium community has started to standardize on solutions that integrate PhantomJS. It just happens to scale particularly well. There's some other benefits from this particular solution. But that approach is being used as a standalone mechanism for actually browsing out using scripts to browse out, collect content and write using an archival file format called the work file for web content.  We use it at the archive to regularly capture YouTube video at scale. There are weeks when we are capturing millions and millions of videos and writing them directly to work. It's not integrated with some other crawl process. There's also experimentation going on with recording and snapshot generation. So if you can't actually capture everything to render the experience that an end user might have, as David pointed out, it's not just being used in video game context, but also just to say, okay, every registered entity in .com let's take the slash page and take a snapshot of the live or source. Because at least at this date and time we can have an idea of what the default representation was that if you're not logged in, what did you see? If they don't know anything about you. Because the crawler doesn't always have an identity. We can give it an identity. There are mechanisms, as David described, to create a login, to create a persona. But in general, if we're trying to do a sampling at a very shallow level across an entire domain, it doesn't have an identity and we're presuming there's no login associated with that experience. So these are just some examples of some of the browser work that's ongoing. But what's more interesting to look at is recent initiatives around merging browsers and crawlers. As it turns out, the Heratrix open source crawler makes a set of synchronous requests. We could modify that software to also support asynchronous requests, but right now it's heavily architected around synchronous requests. So one of the things that we were trying to do to address integrating the browser mode and the crawler mode was trying to avoid issues of scalability. We can't wait for hours for all the resources to synchronously return. We also don't have the luxury of having to revisit the same content over and over again. It's incredibly inefficient. So the crawler in its own right has mechanisms for maintaining this, but when you introduce another element like the browser, which is trying to call everything at once in order to create a particular view, how do you go about managing and maintaining that? So I want to talk to you about three implementations that are starting to try to address this. I'm just going to get my clock going to make sure I have it. So in terms of the key projects, most of these have been incubated by members of the International Internet Preservation Consortium. That's a group of institutions that are constantly trying to trade technology, best practice, and openly do even engineering exchanges where people will go for months at a time and try to help develop specific solutions. But also regionally, we've found more and more sort of the emergence of projects that are trying to open up and create solutions that are not web-specific, but actually address a broader array of content types and repository issues that institutions might be facing. So right now we have a project that is really incubated out of open planets that is trying to look at integrating a browser extractor module into HairTricks, replacing one of the modules that was designed to try to execute JavaScript and discover links. So they have implemented the code. It's publicly available on GitHub. They are implementing it web-scale for the .uk domain. They are sending every registered entity through this extractor module to try to identify all the content that might be missed by a traditional crawler, but they're actually replacing the extractor. We have colleagues at INA, which is the Audiovisual National Archive in France. They have a slightly different workflow. Theirs is they crawl a fixed body of resources that publish content within their cultural domain. They crawl everything, and then they identify through data mining and other techniques where there are holes in the process, and they take those resources and then route them through a browser, but they're using a proxy to try to ensure that there's no duplication between those two efforts, that there's unique capture of resources and not a broad base of duplication. A final project that got off the ground as part of the NDSA here in the United States was centered on the federal elections of 2012. In that context, rather than sending seeds or targets that may be used to start a crawl process, what was done there was the creation of a hybrid model, where you're using a traditional link extractor in combination with a browser-based extraction that also integrated a proxy to try to deduplicate content. What was routed through the browser was primarily, initially it was all HTML and scripts that were identified by MIME type, later due to all kinds of factors we ended up biasing to script only. We hit some scalability issues that even with 5,000 resources, the delays and some of the impacts on those individual sites were significant enough that we needed to actually focus entirely on the scripts and not on the HTML in its entirety. Those are just three implementations where this is happening. To give you an idea of what we're finding with some of these experiments, and this is just one baseline test I'm using for illustration, there are dozens and dozens of these experiments that have tried to document the differences. In general, if you're dealing with browser-only relative to traditional link extraction only, you're missing about 30% of the content. And the reason is it's really hard to figure out how to tell a machine how to be a person and execute everything that might be happening in every resource across a broad spectrum of resources. It's not so hard to do that if you have the time and you have the mandate to do it on a resource-by-resource basis.  If you're archiving a journal and you have a particular mandate to try to optimize exactly how you need to get in there and collect all of the specific publications, then you invest the human time in order to describe what that process is looking like. If you've got 5,000 seeds of websites that are thrown up only for an election by dozens, maybe more in terms of number of publishers and publishing frameworks, there's no human way possible that in the window of time that these sites appear and disappear that you can provide that manual guidance. So you have to come up with general rules of thumb that you hope to apply across as many of the resources as possible. So that's why you're seeing that degradation in content not found. When you combine something like a PhantomJS implementation, which has the ability to operate as a fully browser instance or a headless browser instance in combination with traditional link extraction, you actually see an increase in the content that's discovered and able to be collected in a timely way. So we're definitely seeing huge benefits from going down this hybrid path with even just these two components in combination. The problem is that the processing overhead is significant. None of us in this room are Googles. We don't have thousands and thousands of servers that we can run crawlers in parallel on on an ongoing basis in a 24-7, 365. So we can't scale rapidly enough or in a sustainable enough fashion to address all of the execution that would have to go into this. So once again, these are not perfect solutions, but they're getting us closer toward at least beginning to be able to collect and have the ability to have representative samples that were at least equivalent to the Web 1.0 days. So I want to talk to you just very briefly about some other techniques that again are being used in combination but are not directly linked to the crawl process. This is happening as a preprocess, as a parallel processor, as a post-process. One of the most significant areas of infrastructure and architecture by far is data mining and analytics. We operate a 1.3 petabyte Hadoop cluster at the Internet Archive. And if you're interested in learning more about that, we publish all of the information about the configurations and how we allocate MapReduce versus other tasks in the system. But the important part to understand about this is this is a piece of infrastructure that's used by every Fortune 1000 company globally. It is a critical piece of infrastructure that's here to stay in terms of the Web in general and how people are interacting with Web data at scale. And Web data at scale could be 10 resources all the way through to the millions that you might see registered at a national domain level. It's frequently used to identify the difference between an embed versus an outlink and to place priorities on collection of those resources and to differentiate those. There's a lot of work that goes into also identifying different MIME types that we can then route through other capture mechanisms. Or in some cases we need to take, for example, an embedded piece of social media and actually connect it to a direct archive of a feed that's completely running separately from sort of a crawl itself. So I guess what I would emphasize from this is there's additional diverse methods that are being used in practice by all of the partners that I mentioned and some innovative up and coming companies that are trying to do this in more of a commercial context. But for anyone engaged in archiving of the Web, there's no one set of techniques that's going to work and unfortunately it's not just the browser crawler integration that I described, it also requires additional forms of capture that would enable us to have additional perspective on the samples that we're collecting and then attempting to make available for research and access. Thanks. Okay, so plenty of time for questions.