What's going on everyone? Sam here with Leighton Sports Cards and I am ripping a full case, three boxes of 2022 Top Definitive Baseball for Chris D. Chris D is in chat, so good luck to Chris, really want to pull him something huge live. Be so awesome, so awesome.  Good luck on that one, Lenny. Hope to see something, man. All right, Chris, before I start, I'm just going to run and I'm just going to re-stop my thick sleeve so I don't run out of them this break and I'm right here. The boxes will obviously stay on screen, but I want to make sure I don't run out of them. All right, let's do it. I'm so pumped for this. Caleb did let me do a case break of this earlier today, but this is like my first true personal of it. So I'm so stoked, so stoked for this. I'll do all the magging at the end of the break too, so this will take a little bit longer, but we're going to have some some cards to be magged for sure. Empty. All right, let's do it, man. Good luck, Chris. Ooh, nice. Two of 15.  How about a green patch of Aranola? That's so sick. Well, Chris, it only took us two cards to pull a one-on-one for you. Only took two cards. One of one looks like the Mother's Day patch for the Astros Jose Altuve. Boom. Congrats, Chris. That is so sick. What a card right there. Wow, man. Such a banger, dude. Oh my lord.  That'll be magged for you at the end of the break. Holy cow. What a way to start, man. Beauty. All right, we've got bookend 40 of 40. How about Frank Thomas? Nice big hurt patch autographed. Wow. Really? Just heating up here, Chris. 14 of 20 for Slim Diego. Bat autograph.  Bat autograph of Fernando Tates Jr. Boom. Let's go, Chris. Keep the heat going because we got a big one coming up next, too.  Holy cow, Chris. Three of 10. Duel. Autograph. Nationals Braves. How about Juan Soto and Rado da Cunha Jr.? Boom. Let's go, Chris. Heck yeah, man. This box just keeps on giving. Let's go, man. What a box. Crazy stuff. All right, we've got gold framed autograph. 25 of 30 for the Reds. Barry Larkin. Nice hit for you there. Part of the big red machine. Congrats on that one, Chris. There you go. There you go, Mike. We've got rookie autograph for a 50 for the White Sox. That's Gavin Sheets. Nice hit for you there. Rats on the sheets. And to finish off, box one, we've got definitive collection, seven-time AL batting champion, to 25, Rod Carew. California Angels. Nice hit there, Chris. Congrats on the bonkers box.  Yeah, and we still got two boxes left here, Chris. Oh man, let's get some more magic out of this. Crazy box. Crazy, crazy, crazy, crazy, craziness. All right, empty. And here we go. Nice. 14 of 30 for the Yankees. How about a Giancarlo Stanton? Nice one there. Dude, I'm going to lose my absolute mind if I pull a wander one of one. We've got 23 of 25. This going to the Angels. That's Albert Pujols. Nice one there on the Pujols. Oh, this is sick. Four of five bat autograph going to the Twins. Paul Molitor. That's really cool. Again, I didn't know really until today he was a twin. Kind of surprised by that, honestly. But I guess he was. Learned something new every day. 30 of 50 jumbo bat autograph. Wow, dude. Holy cow. 30 of 50. Randy Rosarena. Dude, this is so sick. This is one of the coolest cards. This, in my opinion, this next one is one of the most unique cards in this set. Oh my lord. How about 17 of 35 Royals Braves? Take a minute to think of who might be a Royal One guy a Royal, one guy a Brave. Very random combination. Royals and Braves. How about dual autograph Bo Jackson and Dion Sanders? Boom. Let's go, man. Holy cow. What a hit. Good call on that one, Lenny, by the way. Dion Sanders and Bo Jackson. Dude, that's so sick. That's so nasty. Box runs a little under two grand, I want to say. Ray, unreal. We've got 12 of 30 gold frame jumbo patch autograph. Jesse Winker. Nice one for the Reds right there. Isn't that so sick, Vaughn? I saw that on the checklist on release day and I'm like, dude, I cannot wait to see that. Let's go, man. We've got rookie autograph green to 25. This is Jake Myers for the Astros. And to finish off box two to 25, 10 fielding awards, Mike Schmidt for the Phillies. Arguably the best third baseman of all time. I think you can make that argument. Mike Schmidt. That he'd be my pick to be honest, but another killer box, man. Congrats, Chris. Dude, let's carry it into another one here. Heck yeah, dude. And this has been so fun. Thanks again, Chris. Like this has just been such a blaster rip for you, man. So exciting. Such a great product. Just a lot of fun. All right. See some more bangers at the end of this. We've got, wow, that's a dirty patch right there. Seven of 35 Salvador Perez. Nice Royals hit for you. Okay, love will be jealous of this one. God for the brew crew 19 of 35 three colored patch. Christian Yellich. Nice one there. Thank my credit card. Thank you, Chris's credit card. Appreciate you. Nice Christian Yellich for you there, Chris. We've got definitive collection 11 of 40. Jim Tome, holy cow, dude. Wow. That is, oh, man. Nice Jim Tome on the patch auto. All right, guys. This can arguably be the biggest card of the break right here. Six of 10 purple jumbo patch autograph for the angels. Shohei Otani. Boom. Let's go. Heck yeah, dude. Congrats, Chris. That's going in a mag after.  That's so cool. Just wait. Look at the patch on this next one. This is unreal. First of all, six of 10 on the Shohei. How about this next one? 20 of 35 dual patch autograph, Tray Mancini and Ryan Mount Castle.  Oh my God. Look at the patch on the Mancini, by the way. Holy cow. Holy cow. I've got to, I've got to stand up for a second before this one. This is so cool, dude. So cool. So cool. Oh my God. How about Chris? One of one cuts autograph for the Yankees. Joe DiMaggio. Boom. Let's go, man. Heck yeah, dude. What a break. What a break. That is so sick. Holy cow. Kaboom. Oh my God.  Wow, dude. What a hit, man. That is so cool. Joe DiMaggio. Dude, I just like cannot stop just staring at this card.  I still got a couple cards left here. We've got a Jackson Kaur, 16 of 25, rookie autograph green for the Royals. Last card we've got not numbered, Jason Veratek on the on-card insert. Autograph for the Red Sox. Nice Veratek. That's so sick. Congrats on that one. Chris, thank you again so much for this break. Like, absolutely unreal. Absolutely unreal. That's going to do it for your break there, Chris. That was like just absolute bananas, dude. Thank you again. We'll get those cards right out to you.


Hello and welcome to the session. In this session we will discuss constructing a quadrilateral. We shall learn how to construct a quadrilateral when three sides and two included angles are given. Suppose that we need to construct a quadrilateral DEAR in which we have DE equal to 4 cm, EA equal to 5 cm, AR equal to 4.5 cm, angle E equal to 60 degrees and angle A is equal to 90 degrees. First let's draw the rough sketch for this quadrilateral. This is the quadrilateral DEAR where we have DE is 4 cm, EA 5 cm, AR 4.5 cm, angle E 60 degrees and angle A is 90 degrees. Let's construct this quadrilateral step by step. In the first step we draw EA equal to 5 cm and angle E equal to 60 degrees. This is EA of length 5 cm. Now at the point E we will make an angle of 60 degrees. This is the angle of 60 degrees. Now in the next step on the ray EX we will mark a point D of length 4 cm since we know that in the rough sketch we have ED equal to 4 cm. So the next step is mark a point D on the ray EX such that we have ED equal to 4 cm. This is the point D and ED is of length 4 cm as we have that angle A is 90 degrees. So in the next step we make an angle of 90 degrees at the point A. So this angle A is 90 degrees. Now in the rough sketch as you can see that we have AR equal to 4.5 cm. So in the next step we write that we mark a point R on the ray AY such that we have that AR is equal to 4.5 cm. So we have AR equal to 4.5 cm. Then in the next step we join DNR. So in joining the points DNR we get the required quadrilateral DER. So we say that DER is the required quadrilateral. Now let's discuss some special cases. We know how to construct a quadrilateral when we are given 5 measurements be it angles or lengths of the sides of the quadrilateral. Suppose we are given measurements which are less than 5 then also we can construct a quadrilateral. Like suppose we need to construct a square of side 5 cm. Let's name this square ABCD and we are given that the side of the square is 5 cm and we need to construct this square. You will see that only one measurement is given to us but actually you can see that we have to construct a square which is a special quadrilateral. And we know that all angles of the square are right angles and also all the sides of the square are also equal. So first let's construct the rough sketch of the square. This is a square ABCD with each side equal to 5 cm and obviously all the angles are right angles. Now let's construct this square step by step. Now first we construct the triangle ABC using SAS condition. So we have constructed the triangle ABC where we have AB of 5 cm, BC also 5 cm and angle B is 90 degrees. Now in the next step we locate the point D so with A and C as the centers we draw arcs of length 5 cm such that the two arcs intersect each other. So we have drawn the two arcs. Let these two arcs intersect at the point D then in the next step we join AD and BC. So this ABCD is the required quadrilateral where we have AB, BC, CD are all of 5 cm in length. So this completes the session. Hope you have understood how we construct a quadrilateral when three sides and two included angles are given to us and some special cases also. Thank you very much.


Right, good afternoon ladies and gentlemen, welcome to this month's non-farm payrolls webinar with me Michael Houston, Chief Market Analyst at CMC Markets and we're coming to the end of what's been pretty negative week for equity markets before I get started on the actual charting and the content. Obviously, I have to do the disclaimers, the risk warnings and what have you, but this payroll support is going to be a slightly tricky one I think in terms of being a directional indicator for what the markets are likely to do going forward simply because I think that even if we get a decent report, it's going to be very difficult for markets to rebound given what we've seen so far this week. We've seen the DAX fall for four days in a row. Potentially today could be the fifth. The FSC 100 has finished yesterday lower for the third straight session, although it was rather notable that we did close well off the loads of the days. The US markets also slipped back for the third day in succession yesterday while the dollar has gone very well bid and this has come against the backdrop of earnings, which by and large, they've been a pretty mixed bag, some good, some bad. Obviously, since the last payrolls number, we've seen central banks hike rates again and the major topic of debate I think really is whether or not we've seen the last rate hikes in this current rate hiking cycle. The main thrust appears to be, could we see a pause in September? I think that's a difficult question to answer. I think the Fed is definitely set up for a pause, the ECB as well. The Bank of England is slightly trickier given the 25 basis point rate hike that we saw yesterday, but I'm still of the opinion that even though markets are pricing in another 50 basis points from the Bank of England, I'm not so sure. There's two more inflation reports out of the UK to come between now and the next meeting. Similarly with the US, we've got US CPI next week. We've got a couple more payrolls reports between now and then, obviously, including the one that we've got today in 15 minutes. And for me, I think the heavy lifting has been done on rates and I don't think we're going to see any more. The Bank of England may do another 25, but really, again, I really can't see what benefit another rate hike would do. As for today's payrolls report, expectations are fairly limited on the headline number. Those of you who follow me and listen to me on a regular basis will know that from my morning reports, I think what we're looking for for today is still a fairly weak number, but relative to obviously previous numbers, 200,000 is not a weak number. But I think in terms of the overall direction of travel, when it comes to the US labor market, a slower weight of jobs growth, a slow rate of jobs growth easy for me to get me to get my words out, would be conducive with the Fed going for a pause in September. But even if we do get a even if we do get a number in excess of, say, 222, 230, 240, I really struggle with the idea that rates above five and a half percent is really going to make that much difference. I think there are significant lag effects. Taking place not only in the US, but also in the UK. An awful lot of US mortgages of fixed rates. So housing costs aren't going to be the issue that they were 20 or 30 years ago in the same way here in the UK. The biggest problem the UK's got is that an awful lot of fixed rate mortgages are rolling off and will be rolling off over the course of the next six months. So you've got a really delayed factor coming in to the credit cycle when it comes for these mortgages to roll over. If you fixed on a five year, you're still pretty OK when it comes to your mortgage costs. If you fixed on a two year in the middle of 2021, then you are in for a very painful shock over the course of the next three to six months when your fixed rate comes up for renegotiation and you have to roll over from a fixed rate, which was around about one or two percent or even lower than that and is now going to be between five and six percent and potentially even higher. And that that effect hasn't filtered through. So that is that is that is the big problem going forward. In terms of what the markets have done this week, let's have a look at the S&P 500. And obviously, we've had to absorb that Fitch credit rating downgrade to the US earlier this week, which people have kicked up a massive song and dance about, but for me, really doesn't matter that much. You know, Fitch cited a number of factors for the reason for the credit downgrade. But you know, what is Fitch telling us that we don't already know and which standard of pause told us over 10 years ago when they moved the US credit rating of triple A to double A plus. There was nothing compelling in Fitch's findings that told us anything we don't already know. You know, fiscal governance in the US, the debt ceiling, political instability. That's been going on for the last 10 years. Where's Fitch been, you know, hiding under a rock? You know, none of none of what Fitch said is really that surprising. And ultimately, if not the US, where else would you put your money if not in the dollar? The dollar actually has gone up this week, despite the fact that Fitch downgraded the US credit rating. So, you know, for me, the biggest concern now is not inflation. It's not higher rates, even though what we're seeing in the bond market does appear to suggest that that is what is spooking an awful lot of the risk of sentiment that we've seen this week. Let's, for example, look at this chart here. Now, this is a spread chart of the 10s, 2s spread. We've seen a massive steepening in the curve here, which would appear to suggest that there are concerns about the direction of long term rates. We can certainly see that based in the US 30 year been seen a big rise in the 30 year 10 year yield. We've also seen a big rise in the US 10 year yield as well. But not back to the levels that we saw in October last year, but we're getting pretty close and a large part of that, the reason for the set off in the longer end of the bond market is because we've got a bond auction coming up or some bond issuance coming up next week in the US, 103 billion dollars of new issuance, which is pushing prices down. And as a consequence of obviously the resolution of the debt ceiling and the fact the US Treasury needs to issue new debt. So what we're seeing at the moment is the issuing of this new debt, pushing the longer end of the yield curve down and driving yields higher. Does that mean that the fundamentals of the US economy are changing significantly? No, they're not. But as a result of this rise in yields, we're seeing down the pressure on equity markets more broadly. So that's essentially because if we actually look at what two year yields are doing, two year yields aren't really moving that much. US two year yields have pretty much done nothing this week. It's the long end of the curve that's moved higher. And as a result, that's put downward pressure on bond markets or stock markets. So what does it mean going forward? Well, you know, we look at the we look at the S&P. We're still in the uptrend. We're still in the uptrend that we've been in pretty much since those lows in October. So it's got the 50 day moving average. We've got the trend line support from the lows back in March. We've got a longer term trend line support here. So for all the concern about the sell off that we've seen thus far this week, we still remain in the broader uptrend that we've been in for US markets over the course of the past six to nine months. And we've seen a regular pullback over the course of that six to nine month period on a fairly regular basis. The one concern that I do have and it's born out here is we've obviously put in this peak back in July. We put in this lower peak on the Nasdaq at the end of July and the beginning of this month. And we've rolled over ever so slightly, but we are still above the 50 day moving average. So there is some evidence that momentum in US markets is starting to tail off. So that could be our first warning sign that we could start to see a little bit of a rollover in terms of what the markets might do next. So the 50 day moving average is the first level of support. We've also got this low back on the 10th of July around about 15,000. So we could see a drift back lower there. So for me at the moment, there is some evidence of waning momentum as we head into the summer months and heading into September. That's particularly prevalent, I think, in terms of how the FTSE 100 has been behaving pretty much since the start of this year. We've seen a lower highs and we've got fairly solid support, 7,200. When I talked to you last month around about the payrolls time, we did see a little bit of a sell-off back to the lows back in March. Those lows held. We've now rallied back towards this line here and rolled over again. What was particularly interesting yesterday was we closed pretty much off the lows of the day, which suggests there is still demand, I think, for buying equities on the dip. The biggest question is how far will this dip last? If we look at the DAX, again, we're looking a little bit soft. Look at this chart here. But overall, every time we've dipped anywhere near close to 15,400, we've found fairly decent buying interest and we are in a fairly decent uptrend from the lows that we've seen back in December last year, but also the lows down here. So at the moment, we remain pretty much range bound, albeit in a fairly decent upward trend. So there's nothing that we've seen over the course of the past few days that leads me to suggest that stock markets are going to start to roll over and sell off quite aggressively. Now, I've just been asked a question. What would a 150,000 number mean for the markets? I think that should be fairly positive for the markets because it will mean that the Fed's rate-hiking cycle is working. It should take some of the heat out of yields and I think really reinforce the idea of the September pause for the US. So it should also take some of the heat out of the dollar. A week number should be dollar negative and should be fairly constructive for risk. But we also have to bear in mind it's Friday. We've seen a big sell-off this week and I think people will be reluctant to take on aggressive new positioning ahead of the weekend. So in answer to your question of a week number, that should be fairly constructive for risk. My view on the FTSE 100 going forward, Richard, is I'm still constructive. It's cheap as chips. We've seen some fairly decent earnings numbers out of some fairly decent companies, Rolls-Royce, posted some really strong numbers this week. Obviously BP and Shell posted some weak numbers. But if we look at the direction of travel when it comes to oil and gas prices over the course of the past few weeks, that's been fairly positive. So I think as from an income basis, BP and Shell should be fairly positive. We have seen a little bit of weakness but my biggest concern I think about the FTSE 100 more than anything else is obviously the outlook for the UK economy over the course of the second half of the year. And we've got GDP, UK second quarter GDP coming out next week, which could be as good as it gets for the UK economy going forward. But ultimately, if you're a long-term investor on the FTSE 100, I struggled to see that much in the way of downside while we're above this series of loads through here around about 7,200. So, you know, it's cheap and there's an awful lot of negativity around the UK, quite rightly, I think, given the political leadership at the moment, but in terms of valuation, you know, the UK stocks are very, very cheap relative to their peers. So I'm still constructive on the FTSE, I continue to remain constructive and it has been my trade for, you know, has been my opinion for most of this year, despite the fact that we've come on from the highs that we saw back in February when we were above 8,000. So I've seen no reason to change that even though we're 500 points below that as I speak right now. Okay, so before I wrap up and stop talking because we've got the numbers coming out in around about less than a minute to recap, we're expecting 200,000 on the headline number. So if we get 250, that's likely to be fairly, it's probably likely to see a little bit of weakness when US markets open in just over an hour. But overall, I don't think it's gonna change and it'll probably keep the pressure towards the downside. But overall, it's likely to, keep the pressure on the euro, the pound and don't push the dollar higher. Let's just change this to a five-minute chart and then we can see the market reaction for the numbers come out. So let's go right now. We've got 10 seconds to go. We've also got the Canada jobs report. So keep an eye on dollar CAD. We're expecting around about 20,000 there. Numbers breaking now. Okay, here we go. So payrolls, 187, slightly less than expected, but broadly in line. Let's have another look at the other numbers. Canada's lost 6,500 jobs and the unemployment rate. Let's get that here. There we go. So these are the numbers. I'm just gonna bring them over. 187,000 on the headline number. 172,000 change private payrolls. Let's see if there are any adjustments to that number. The participation rate has remained constant at 62.6. So I would suggest it's fairly neutral report. The unemployment rate has fallen again to 3.5% from 3.6 and average hourly earnings 4.4. So again, it's a mixed report. We've got a slightly weaker than expected headline number. Wage growth has remained steady at 4.4%. So that's dollar positive, but in the unemployment rate, 3.5%. So pulling those numbers out of the way, dollar's slightly weaker on the back of that number. It sort of buys into the narrative for me that we're on a pause in September. The policy restricted policy for the Federal Reserve is working, jobs growth is slowing and the unemployment rate, the US labor market still remains fairly resilient and we are finding support on Euro dollar at around about this 50 day moving average here. If we look at this 50 day moving average for the last two to three days, we've managed to find fairly decent support in and around 109, figure 20. The dollar should soften a little bit on the back of these numbers and we could we'll see a move back towards 110 on Euro dollar. Similarly on cable, finding a little bit of an uptick there. We have broken below the 50 day moving average on cable. We're struggling to break back above it, but if we look at this candle here, that looks like a little bit of a hammer on the downside would suggest we've probably hit a little bit of a base on cable and could well retest the 127, 50, 128 level over the course of the next few sessions. I'll be surprised if we see a bit of a big sell off on the dollar today, but we have seen a strong move higher. So that would suggest that maybe positioning is probably stretched, but getting a little bit of a rebound on equity and risk more broadly, the S&P's edging higher on the back of those numbers. Bit of a Goldilocks report, going back to the five minute chart. There we go there. So still struggling to make sense of it, but ultimately what I've seen from the numbers today, nothing to worry about normal service being resumed. We may see a little bit of softening when it comes to yields. Let's have a quick look at that on my Bloomberg chart.  There we go. A little bit of a spike lower on yields on those initial numbers. Bit of a spike lower and now retesting higher again. Looking at the two year, quickly switch that over so you can see that. So two year doing, wanna bring that over. Slightly firmer, but not really doing that much. Let me look at those slightly lower on the two year from the peaks that we saw just prior to the price of the numbers. So a pretty Goldilocks report on the back of those numbers. I think we're probably gonna drift into the weekend. We're probably not gonna pair back much of the losses that we've seen so far this week. And the focus will now shift to next week's CPI report out of the US for July, which is due on the 10th. We've also got China trade numbers next week and China inflation numbers next week as well. And I think of the two CPI reports, I'll be paying more attention to the China one because China is probably gonna slip into deflation next week. Getting asked, oh, getting two questions on Aussie dollar. So yeah, let's answer that because I think that'll be an interesting question, particularly in light of the China numbers that we've got coming out next week. China trade, but China CPI. Let's look at the Aussie dollar. That's an interesting chart. So I mean, that chart really speaks for itself. Decent support coming in from these lows back in May, that's 64.50. We've seen a little bit of a move down to around 65. Earlier this month, but for me, I think it's very significant that we've broken below the series of lows through here at 66. I think for Aussie to rally meaningfully, we need to rally back through 66 to signal a return back to this series of peaks through here. I think for Aussie to rally, you've got to see a significant improvement in China data around the moment. Next week's China data is likely to point to an increased deflation re-outlook. PPI has been negative since October last year, November last year. Year on year, it's likely to see a decline of 6% PPI. On the headline CPI number, we're expecting a decline into negative territory of 0.5%. So deflation is a clear and present risk for the global economy. That will potentially be negative for the Australian dollar. US CPI, which is due out on the 10th, could also be significant for the strength of the dollar going forward. So I think for the Aussie, you've got to be aware, you've got to be very, very careful about being overly bullish on it. We could see a move back to 66, 66.20, but if we're unable to get back above that, we could see a broader sell-off on the Aussie dollar back towards these lows down here in May. At the moment, we've seen a bit of a rally off those lows there. We've run into resistance at around about 66, and this is a four-hour chart, if you're asking me. So we need to see a push back above 66.20 to signal that our base is in for the Aussie, and signal a return to 67. But unless we get a bit, unless we get evidence of a recovery in Chinese economic activity, then the risk for Australian dollar is likely to be a revisit of those lows back in May this year. So when you say a long-term basis, I mean defined long-term, are we talking two weeks, two months, or two years? Because I think that's the big problem that you have when you're two years. I'm not gonna predict Australian dollar out to two years. You can't even predict the GDP out that far. So two years is way too long. By definition, my background is FX. I'm a spot trader on FX. It's very, very difficult to predict anything that far out. You might as well flip a coin. So two years, not gonna do that. If you look at it on this particular chart here, you can see over the last two years, we've gone from peaks of 81 to lows of 55. We're right in the middle of that. It's pretty much impossible to predict that far out. What we can do is we can take these fib levels here. So this is the move from the February 21 highs to the lows that we saw in October 2022 and we've rebounded almost 50% of that particular move. So if you're gonna ask me what I can do with fib levels here, I can take these lows here, I can take these highs here, calculate the fibs on that and we retraced a fairly good proportion of that down move there. And then we can then drill down into this move here. But the fact that we've been unable to break above the 68, 90 level, what appear to suggest that we're probably gonna retest at some point the lows that we've seen back in May. But over two years, I might as well flip a coin. Because who knows where the world global economy is going to be in two years time. Who knows whether or not the Fed is gonna start cutting rates towards the end of 2024 and the beginning of 2025. So predicting that far out is a very, very difficult thing to do. And it's not something I'm prepared to do. Now, if you're asking me the next two months, there's a slightly higher degree of certainty in that for two years now, sorry, Mustafa, but I can't give you an answer to that particular question. Does anyone have any other questions? I'm gonna quickly look at dollar CAD on the basis of that Canada jobs report. And it was a fairly weak jobs report. If we can just look back at it, just need to dig out the calendar numbers again. So the net change in employment was negative. That was disappointing. We're expecting a 25,000-derm gain in Canada. Canada jobs report, we saw a 6,400 decline in those numbers. Full-time employment change saw a gain of 1.7, 1,700. But we've also seen a 49,000 negative decline. And we saw an adjustment lower on the June number of 24,000. So jobs growth is slowing when it comes to U.S. jobs. Let's just get rid of that line. It's no longer relevant. So we're looking for, we're seeing a bit of a retest of the highs in dollar CAD earlier this month. So 1.34 is gonna be a fairly decent level on that. We could we'll see a break higher if we break through 1.34 on dollar CAD. Any other questions on anything that I haven't already covered on this month's payrolls report? As I say, it's a bit of a nothing report. The FTSE 100 appears to be stabilizing around 7,500. We've seen a little bit of choppiness in terms of currencies, a bit of dollar weakness there. But overall, for me, it keeps alive the idea of a Fed pause in September. Obviously we've got upcoming events, our US CPI report next week. We've got Jackson Hole Symposium at the end of the month. That could give some clues as to what the Fed is gonna do in September. But ultimately for me, the narrative for this report is the Fed pause is still alive. US rates are probably peaked. UK rates, we'll have to wait and see on that. But I think there's a good chance they could have peaked as well. Getting asked about Canada Yen. It's an interesting one. Let's have a look at that. Okay, that's interesting. I think we could have peaked on Canada Yen as well. Let's have a look at the key support level on that. This level stands out, 104.38. We're starting to see lower highs on that. I think much will depend on what happens with Dolly Yen on Canada Yen. So bit of a top at the moment of 108 on Canada Yen. If we look at Dolly Yen, this is my Dolly Yen chart, we could have seen a reversal here on the Dolly Yen. Big level is 145, the lows back in June, July. But this price pattern here is particularly interesting after the rally that we saw off the lows at 136, it's in the 200 day moving average. This looks like a potential evening star candle formation. If we drift back below 142, which is so far held the sell-off from the peaks just below 144, we could see prices move back into the cloud, retest the 50 day moving average and then test the bottom end of this cloud, which is currently around about 139. My longer term view on the Dolly Yen is that we'll see a move back towards 140 towards 135 by year end, I haven't changed on that. So if that plays out, then Canada Yen should drift lower. So hopefully that helps you in the context of your view on Canada Yen, but certainly in terms of Dolly Yen, I'm still very much of the opinion that by the end of the year, it'll be lower from what it is now. So hopefully that helps you in the context of your directional view or your directional bias when it comes to Canada Yen. Getting asked about gold, that's slightly trickier because obviously gold has been impacted quite a bit by the directional bias of long-term yields on US treasuries. But ultimately, I think the biggest concern I have about gold is the higher for longer narrative when it comes to US rates. And that's really what's borne down on gold prices over the course of the last few sessions. We've come in with lower highs and lower lows. We are starting to see a little bit of a rebound today. The big level for me, I think the gold is this series of lows down here. So let's quickly draw them in for you. So anywhere around 1890, 1900, I think as long as we can stay above them, then we should continue to remain fairly well supported. But at the moment, gold seems stuck in a range between 1900 and $2,000 an ounce. And I would expect that to continue. 1900, $2,000 an ounce. We're not getting rate cuts anytime soon. They're not being priced. And until such times as we do, I think it's unlikely that the gold is gonna be able to break out of that range. So we'll certainly look for any depths to be bought anywhere near towards 1900 and any upside to be contained by any moves towards $2,000 an ounce. So hopefully that helps in terms of gold going forward. I'm just making sure that I haven't missed anything else in terms of questions that I've been asked. Okay, right. Okay, so before I sign off, I just wanna bring your attention to some key events for next week. I've already mentioned them. USCPI, my big concern about USCPI is we've been falling pretty much every month since June last year, falling from 9.1% to 3% in June. The big concern I have with the July numbers is we could see headline CPI tick higher to 3.2, 3.3%. How will the market react to USCPI starting to tick higher again? Will we start getting a new bid come into the US dollar? Could we see yield start to continue to push higher? We've also got new issuance of bonds next week of around about 103 billion. How does that go? When it comes to the directional bias of what we've seen in yields this week. We've also got China trade on the 8th of August. Got China, CPI and PPI. What will that do to yields if that falls into deflationary territory? And we've got UK second quarter GDP on the 11th of August. So those series of macro announcements could dictate the direction of the dollar. But I would expect the dollar to weaken a little bit next week. Euro dollar to push higher. Cable to push back towards 1.28 and a half going forward and the dollar yen to slip back lower. In the absence of any further questions, ladies and gentlemen, thank you once again for your time this week. Thank you very much for listening. Obviously tune into my weekly video. That should be up on the news and analysis section of the website later today, where I'll talk about some of the things I've talked about in slightly greater detail. Otherwise, thank you very much for listening. Hope you all have a great weekend and speech all same time, same place next month. Thanks a lot. Bye for now.


Five, four, three, two, one, go. So, welcome to our talk. Catching at the edge, CDNs for everyone. So far, the first and most important question. Did you have a great DrupalCon today so far? The other thing that I would like to know, because from the level here, this was said as an advanced DevOps talk. Who of you has used a CDN so far? That's great. Who of you would say they are advanced level? Okay, some here in the front. Intermediate, cool. Any beginners? You'll learn something too. Are there any users of OSCache? Is iModule, perhaps there's Drupal6 there? Okay. Who of you uses static HTML like that, 80%? No one, okay. It's a DrupalCon, that's good. So, at least we're here all and now let's start. We'll today show you what nice and things you can do with different CDNs and how Drupal8 will totally revolutionize what you can do, be prepared. So Fabian didn't introduce himself, he's Fabian Frans from Tag1. I'm Wim, Wim Leers, I work at Acria. And let's get started. So for me, personally, it is actually more than just about CDNs and making a particular website fast. I personally would like to see that the entire web is able to be fast because what we see today and the last few years is that silos are increasingly awesome, like Facebook is very fast, Google is very fast, but many others, many big companies, small sites, local community websites, they're slow or they can easily go down or they're only slow on mobile connections. But why? Is that really necessary? Can we not fix that? Can we not try to fix that? So this is what we try to set out to do. And first of all, a very quick reminder, but since all of you are using CDNs already, I think this is completely pointless, but let's do it very quickly anyway. The Edge, that's what it was in the title. The Edge is service close to the end user, not the origin, which is where your triple site is hosted because for many sites it is true that the end users are very far from where your origin, where your triple installation, where the data center, where your triple installation lives is running. So the latency between talking to triple and the end user is rather large. The Edge is about providing servers to bring that distance down and bring the content close to the end user. So that's the whole point. That's what we gain by using a CDN. And there's two main ways of using a CDN, using it for assets only, so static things, such as CSS files, JavaScript files, images. And I would like to ask how many of you have used CDNs already solely for this? Okay, so like 30% probably. You are definitely going to learn something new then because the other way of using a CDN is to use it for your HTML as well. So your actual content, a dynamic content that is served by a triple. The problem with using it for HTML is that it's much more tricky because you have to deal with invalidation. The contents on the CDN needs to be invalidated so that it is kept in sync with what triple actually contains. The other problem is authenticated users. Very often when a CDN is even used by a site to make the anonymous experience much faster, nothing happens at all for the authenticated user experience. So we will show something for that as well. So the answer to why use a CDN at all because it's close to the end user and we can massively reduce the latency. So this talk is solely about caching the HTML. So well, the entire website really. It's not about just caching it for assets, using it for assets because that is a solved problem. It is simple. This is the real challenge. And this is what can make a sizable change in making many, many websites much faster. And he must know he's also the CDN module for Drupal. Yeah. So yeah, I maintain the CDN module for Drupal which is just for assets but this is completely not about that. And that is simple. This is much more complex and that's what we're trying to solve. So in Drupal 7, the situation was a bit like this. For invalidation, we had two big problems, invalidation and authenticated users. The simple way of going about invalidation, this is a way that most sites do it or very many sites do it, is by using Mac Sage. You specify how long a piece of content can be cached and the CDN respects it just like any other proxy. But the problem is that you then still have still content. And for many use cases that is actually acceptable but is it ideal? I would say not. I would say that it's much better if you make a change on your website, you change a piece of content, you create a new piece of content. It appears immediately for all users, also anonymous users, that are getting a fast experience thanks to it being cached on a CDN. But that was not possible with this simple solution. So there is also an advanced solution. You can purge the affected URLs meaning that when you make or modify a piece of content, you have to know all of the URLs that that piece of content does appear on. But that is very brittle because it is so very easy to miss one URL and forget to invalidate to purge that one URL. So this is also no ideal. And this is kind of the best way, the best solution that we have in Drupal 8, is a screenshot of the Acria purge module. And it automatically figures out which URLs to invalidate and it shows a UI that shows a progress. But let's be honest, it's not ideal that we're showing a bit of UI to show the progress of how the CDN is being updated, how things are being purged. Ideally, this would be completely transparent. And even this sometimes misses some URLs where it doesn't know that the content appears in that place as well. So this is the best Drupal 7 can do, but it's not ideal. So in practice, what we see in Drupal 7 is we have a combination of both. We use MagSage because sometimes it is acceptable. We use purging of specific URLs. But then because that still doesn't always result in a perfect solution, we very often have to do the very annoying and pesky thing of allowing content editors to purge things manually, which is utterly awful. How many of us have used manual purging for content editors? Yeah, a whole lot. That's not great. That's a very bad authoring experience. And so on top of that, what we had is some site-specific hacks, maybe some heuristics to automatically figure out that in some cases, oh, that's special page. It always needs to be instantaneously updated. Let's always purge that. Maybe something like that. So very clearly, this is not ideal. And it's also impossible for less advanced users than the ones in this audience probably to even set up. So for authenticated use, then the second problem, we had also two possible solutions. You could use a separate domain for logging in and doing authenticated user stuff, like creating content and modifying contents, or you could use a CDN as a pass-through. So the CDN would just talk to the origin, not make any changes, not make, not do any caching, and just relay it to the end user. But that is also not ideal because it means nothing is cached. It's just providing some level of benefit, but it's very limited and it's not what we would like to see happen. So in Drupal 8, we set out to solve these problems because we were, the hacks are not nice. We want to solve it by having less hacks and having a better architecture. And so the two things that are key in validation and authenticated users have also very clear solutions. For invalidation, we have cached tags. And for authenticated users, we have cached contexts. And cached tags are data dependencies. They declare, they declaratively state what's a piece of content depends upon. So that when that thing it depends upon is modified, we know which responses are affected because cached tags bubble from the actual content up to the response level. So for a given response, we know all of the cached tags, all of the things it depends on, and therefore we can invalidate by it. Cached contexts are different, but kind of similar in that they also capture dependencies, but it's not dependencies on a particular bit of data. It is dependencies on a aspect of the requests on a request context.  It is important to vary by those different levels of permissions because they are supposed to get different responses because you have different capabilities, different permissions. And so that's what cached contexts set out to solve. And so cached tags allow you to invalidate a certain tag and when Drupal does that, we can relay that to the CDN so that the CDN also invalidates it. Cached contexts, on the other hand, allow us to know what's to vary by. It may be it is permissions, maybe it is a query argument in the URL, maybe it is the current interface language, it's lots of things, and we need to know the things it varies by. And if it varies too much, because sometimes if something is specific to the current session or the current user, then it's not really worth caching, right? Because we would end up creating a million variations of the exact same response and nobody is actually going to benefit from that. So in that case, what Drupal-8 is capable of doing is automatically extracting that part of the page that is too dynamic, not cached, but put a placeholder in instead, then the entire page is cachable again. Doesn't need to vary by user but can be cached across users. And that allows us to then replace the placeholder at a later stage, and Fabian will be demoing that later. So cached tags and contexts are the two key things that allow us to do very interesting things. And they are exposed on every Drupal response as the extraable cached tags and contexts headers. So let's dive into a demo right away. I'm going to be demoing CDNs plus anonymous traffic, and that uses just cached tags because Drupal assumes, and it's true for probably the vast majority of all websites, that all anonymous users get essentially the same responses. So there is no variation, so there is no need for cached contexts. There's only a need for cached tags so that we know when content has changed. Fabian is going to be demoing authenticated user traffic. So this demo is built using Drupal-8-beta-15, so the previous one, the one that cut out some time ago. The Cloudflare module, which is sadly not yet on Drupal.org, it's currently on GitHub. It will be moved to Drupal.org as soon as the current project owner responds. The Cloudflare SDK, do we able to talk to Cloudflare? And the Cloudflare account. So let's dive into it. So I'm installing, this is really from scratch just to show you how fast it can go. So first off, we install Drupal. I don't think I need to explain much here. If you haven't seen the Drupal-8 installer yet, here you go. Just creating a site, filling out some defaults, and here we go. We have Drupal-8 installed. The next step is to use Composer to pull in the libraries that Drupal-8 uses, using Composer so that we can also require, which is what I'm doing here, the Cloudflare SDK. So this is basically using Composer with Drupal-8 and so all our libraries we have now using Composer. And currently that still requires us to update the other loader with this very minor change so that it uses Composer's libraries instead of Drupal's. That's all of the basic stuff. Next we install the Cloudflare module, which is also nothing new. If you haven't seen the Drupal-8 module installation UI yet, here you go. Configuring it, there's two tabs there, API credentials and zone settings, but we don't care about the second thing, only the API credentials matter. So we go get the API key, copy that over, and enter the email address for the account and hit save and we're done on the Drupal site. This is all you have to do. The next thing we have to do is on the Cloudflare site, go and create a page rule. And the page rule tells Cloudflare how to deal with incoming requests and how to cache them. So in this case I'm using the domain cache tags on demo.wimliers.com. It's important that you add a slash asterisk there because otherwise it will only cache your front page. We wanted to cache the entire site. We wanted to cache everything, so including dynamic content, so HTML. We wanted to respect our existing headers, the headers that Drupal emits. And we wanted to make sure that users can actually log in, which is pretty important. So we go into our Drupal installation and figure out the name of the cookie that this Drupal site uses because every Drupal-8 site, our previous version, uses a unique session cookie name. And so we just have to tell Cloudflare, this is the name for the session cookie that my site uses. And I disable all of the other special sauce, which dynamically and magically enhances performance or responsiveness and so on. I prefer to disable them so that they can't possibly interfere. So here we go, that's all. And the four things that mattered most are the ones at the very beginning. So that's custom caching, make sure to cache everything and make sure that the headers are respected that we send and that's it. And so next we wanna make sure that the configuration is actually working because that's quite important. We have to verify our understanding of how it is working. And right now it shouldn't actually be doing anything yet because we haven't enabled it yet. So let's check and we don't see any Cloudflare-specific headers in there right now. So that's good. We go back to Cloudflare to the DNS panel, our configuration page and enable it. So make the clouds turn orange. That's it. Now it's enabled. And now we can verify that it is doing something. So we still see that the cache control header is bad but the server is saying Cloudflare nginx. But this means currently that it cannot be cached. So we wanna configure a max-h so that Cloudflare, just like any proxy, is told that it is allowed to cache it at all. So in Drupal we wanna go and configure the performance settings page, the max-h for caching in the browser or in a proxy. So right now we can cache up to five minutes. And next we wanna verify that this is working. So we hit save and immediately we see that there is a cache miss and indeed that it's showing up. And so if we had a cache miss, another request should make it into a cache hits and it is. So right now we're already up and running. But let's verify that really everything is working. So let's quickly log in. And yes, Lamas are awesome. And so you could see that I was able to have the log out and log in links and the common form is personalized. So I'm actually logged in. So logging out again for the next part. So we now wanna verify that it actually works well. Now it's working to some extent already but that's not really impressive yet. So let's go and edit some contents and change the llama for an even nicer one. Rainbow llamas are the best. Yeah, and I forgot to enter alternative text. Alternative text is important people. And so now when we actually hit save, it's talking to the CDN and making sure that the cache tag on the CDN is also purged. And if we go to the node page, then we see, indeed we have our rainbow doing something llama. And now we wanna verify that it works very well. So right now we see that we have instantaneous invalidation already. But let's check that it's actually doing what a CDN is supposed to do, which is provide faster responses all around the world. So I went to Turbobytes pulse, which allows me to perform a DNS query or an HTTP query from many locations around the world, 88 currently. So I'm hitting my demo site from this service from 88 different locations around the world. And it's a regular get request to the front page. So right now the response time on average around the world is half a second, which is not bad, but not amazing. And let's take a quick look at the headers in Australia. I was in Belgium, so I definitely was not there. But because of a period previous tests, I already had filled the cache previously, but it had expired. So you saw the expired header. But now when hitting it again, it should show a cache hit. And it should in theory be faster because it's a CDN and it's supposed to cache things. And there we go. It's twice as fast now on average around the world. And it's a cache hit. And now let's do the very important test, which is we're going to modify our view and make sure that it emits something that we can easily detect in that tool, which is we're going to modify the status codes to the most awesome status code there is, which is for 18, I'm a teapot. And hit save. And again, because I'm saving something, the cache tag is being invalidated both on the site of Drupal and on the CDN. Let's run the test again. And let's see whether it's updated everywhere. So we're waiting for the results from all those locations. And there we go. We see that in the middle column, everything is, or most of the things are turning red. So everything or almost everything has been invalidated already. There is a cache miss as expected. And 86% was updated within about a second. So very fast invalidation all around the world thanks to cache tags of just the things that you need to be invalidated and nothing more. So there is no more need thanks to cache tags for having to purge every individual URL. You don't have to figure out the individual URLs anymore. It just works. It's transparent simply because of a tool, a bit of metadata that we didn't have before. And I cannot go out of full screen mode. That's awesome. So this you can do today. It is simple as was hopefully clear in this demo video. I didn't do anything complex. I clicked a few things together. I entered an API key, I entered a few bits of information. It's cached worldwide. And you can do this today with Acura Cloud Edge or Cloudflare Enterprise. But that's today. This is not something that is limited to any specific service, any specific CDN. So in the near future, we should expect this to become trivial as hosting providers step up and make this more integrated, make this even simpler. It should be affordable for all. Definitely for all in the sense that you can replicate the same system in Varnish. So if you have a Varnish instance because you're a smaller website and many sheep hosting providers are stepping up and providing Varnish, then all of this can happen within Varnish. You don't have the global network then, but it's still going to be much faster. You're not hitting Drupal every single time. And that is something that is affordable for all, but for many CDNs are also becoming more and more affordable. So many sites will be able to use a worldwide CDN and make their sites fast around the world, which is something that some years ago was unthinkable. And now you don't have to know, you don't need a whole lot of technical knowledge anymore nor a whole lot of infrastructure to figure out which URLs to invalidate, which URLs to purge, because that was a painful bit. Also for people who are deeply technical, it was just purely painful and that is a solved problem now. So invalidation is now a solved problem and it benefits everyone, small and big sites. And now it's time for something even cooler that Fabian is going to show you. Yeah, so this was unanimous traffic mostly, as Wim said, that's also possible to do this fastly with another CDN, but that's even also working with the Amazon cloud. So there's lots of possibilities and really cash tags are making it possible to do many things. With Wim, a little underestimated was like, he worked two years on Drupal 8 to ensure that everything, every object, everything that's rendered is having these cash tags. So if you're speaking with developers you're working with, tell them if you're developing for Drupal 8, make sure to ensure that everything that is in any way rendered is having the right invalidation information. That is very, very key. On the other hand, if you forget, you will get bugs because caching is so much ingrained in the system that now you'll find the bugs kinda at day zero of development and not when the site has gone live, has performance problems and then you're like, now we need to enable caching here and then it doesn't work. So that's great. So the motivation for authenticated user caching is the following. We have the very common scenario that Wim just showed. We have only anonymous users. We have a varnish or a CDN and it's fast. That looks like this. And we have a web server. Oh, we have a CDN. We have people from all around the world. They are going to the varnish and we have two happy web servers, even better. So everything is great. The company is flourishing, making good sales. Everything is perfect and they lived happily ever. Oh, wait. Because one fateful day, a shopping cart was onto the site. And then it looked like this. So the site is slow. The web server is really, really unhappy and runs away screaming in terror. And the web server ran away screaming in terror and was never to be found again. Hopefully that didn't happen to you. So you don't believe me that that's realistic? Let's test that. I'm gonna show you. So we have triple eight authenticated users. We're using CDN, fast as CDN, but it's only pushing data through to my server because it's not catchable by default. There's no specialties like that. And we'll see how that looks. Again, I'm using here this turbo bytes, which will allow to see that. And here I've put in the host name of that. And here we can see the server and you can see county it's really bored. Shopping cart was just added. And now we are running the test. And yeah, there's going some traffic coming in. And there's coming a lot of traffic in. And now we have like lots and lots of Apache processors. The Lord would go way up. And but what's the most important thing is we have a response time of on average 3.7 seconds. And there's time to first buy times of like five seconds, four seconds, four seconds, five seconds. That's overall not great user experience in that. And we can do an even better test. We can use the AB tool for testing the performance. And again, we had to doing 100 concurrent requests, so 100 different users coming at the same time, 300 of those. And you can again see that the server is really starting to sweat under that with Lord average of 1.12. And fortunately I have enough rhyme and that works. But you can see that's an even worse user experience. Some are getting like maximum of nine seconds. But what you can also see is that the minimum time is 186 milliseconds. So the site should be fast. It's fast, but it's served by Drupal. And that's a problem here in that. That's not the problem of Drupal, but that's just that the infrastructure I've provided here is I could put in five servers, 10 servers or whatever, then I could probably easily hold the Lord. So it's a scalable problem in that. But in this case, we have the shopping cart, and we have a bad user experience because we were relying on our CDN. So the site is fast, around 180 milliseconds, but the user experience is poor. So I don't want that. I really don't want that. So let's ask a question like Dries today in the keynote. We need to talk. Why does that happen? So in general, pages can be split up in two different sections. And the one section is static parts that are seldomly changing or that are maybe changing, but that are mainly variating by the page they are on. Like, if you're reading an article, that would obviously be the article. And then there's this very, very highly dynamic things like dynamic blocks, personalized content, dynamic command forms where the user name is even in, hey, user, have a great experience, please command. And that is what's slowing the whole page down. Obviously, you could now go to JavaScript frameworks, React, whatever the newest password is, and do that in JavaScript, but then you again has a big investment to do that. So, and also pages are way too dynamic. So if you think you have 100,000 pages, no problem, fits and varnish, but then you have 100 users and then you have 10 million combinations. And that means that users have a cache hit is very, very improbable in that. So, so many combinations, bad cache hit ratios, that's not what we want. So, we make the pages less dynamic and the problem is solved. Wait a minute, not really. The web 3.0 is all about the personalized experience. It's all about content directly tailored to the user's needs. It's about authenticated users. It's about product placement. It's about related articles. That's very important, but that is that dynamic content that is slow, that is providing value to the site. And also, I need dynamic pages. I use a CMS or as I'm just going back to the 80% of using plain HTML. And please don't forget about my shopping cart. So, fortunately, Drupal 8 has a solution for that. And it's already in core. This is in core, placeholders and auto placeholder ring. That means no more of this, no more dynamic blocks that are making things bad and static content because Drupal 8 knows your page. When Drupal 8 is rendering a page, it knows for everything that it's rendering that how it can be cached. So, the main content can be cached by user permissions and the URL because it varies on those two things. There's a normal block that just varies on the user permissions so we can directly include that with the rest of the content. It doesn't matter if that's redundantly on many URLs. It doesn't matter. But there's this one shopping cart and that's user cached. It's just for the user. And because Drupal 8 knows your page, it can do something cool. It can just placeholder it. And that's happening automatically out of the box. No configuration needed. You are getting placeholder ring and the rest is cached transparently. So, whenever something declares itself at the moment as max H0 of what is in Drupal 8 had or uncacheable, it's cacheable only by user, then we don't even need to render it because whenever we retrieve it from the cache, we see, oh, we see that's not cacheable. We directly put a placeholder in there. And we've given great tools to the developers that are using that system to be able to specify things. So, performance tuning could be in a way as simple as, oh, let's configure that and this needs this dependency and then Drupal 8 can figure out the rest. So, it's both automatic and tunable. And that means we can now use ESI. And then we can use the ESI 8.x 1.x. That's a fork that's not yet released. Hoping it will come out around the time that 8.1 comes out or maybe it will even be an 8.9. We are still discussing that. There's edge side includes ESI replace placeholders at the edge. So, it's using oscache ESI modules. Now that it just means we have some very special tags. In this case, it's using hashes. And then wherever that placeholder is, it's doing that. So, it says doing the same thing as Drupal did. Drupal created a placeholder. Standard from a standard perspective of what Drupal at the moment does is, it's just replacing those placeholders transparently. So, you never see that except that the pages get a little faster thanks to dynamic page cache. But if we transfer this placeholder ring from Drupal out to the edge, then we can totally cache all those things at the edge as well. And we can use ESI with the CDN2. So, the demo two is authenticated traffic, Drupal 8 beta 5, 15, Fastly module, Fastly account provided by them over there. Fastly is from the community perspective, mostly well-known for powering fdpdrupal.org. So, whenever you download a file that's currently going via Fastly. And Fastly very, very much gave us help in optimizing the VCL, getting all this code written and there will be easy for you. Fastly is very simple to set up. You just fill out those three things, configure your site, the site name, server address, like an IP address, the domain name you wanna use, then you need to set up some DNS as Wim has showed and that it's working with Drupal 8 by standard out of the box. In that you don't even need any custom VCL. But if we want to have authenticated user caching then you need to upload a custom VCL. And that's currently something where you need to raise the support to gain that capability. But they've provided us with that functionality so we were just uploading our Fastly VCL and then it was working. So, let's see how that's working then. So, this is again my server here over there and Turbobytes again and I've put a little catchable one there which is saying to my ESI strategy to actually work and before that just so that it was easier to demo and now we're running the tests. And as we can see, we need a moment to wait for the test results but on the server side, nothing is happening. It's all kind of in the CDN. We have like response time of 248 milliseconds and we have responses that are as low as like eight milliseconds time to first byte. So, there's a huge opportunity in using also indicate user caching at the edge to really not only being able to just use one server instead of many, many, many but also to really put the latency down we are using there. And the other one is again, AB in that. So, also we have a before, after thing and oh, already finished. So, we have 0.443 seconds before it was like something like 14 seconds and we have a time per request of 1.46 476 milliseconds time per request and a total min of 45 time to first byte. So, that's totally great in that. And for that, how that does work is we now have a happy web server again. So, we have the authentication cache per session. So, it's kind of the standard practice we're doing it. We are asking Drupal for all the cache contacts that have anything to do with the user or the session. And because Drupal has not only cache contacts but also a cache context hierarchy we are able to reduce everything to just the user or the URL. There was a very important architectural decision made in Drupal 8 and because we have that we can now cache the cache contacts which sounds a little funny but it means that whenever we are coming into Varnish we are kind of doing a little round trip to the server but because that round trip is cached it takes less than one millisecond. And then we have all the information available within Varnish. We have the UID, we have the permissions hash, we have the roles and now let's say you are building this one of those personalized sites and you have a block that is different based on the user's interests but you have a lot of users like 100,000 millions of them and user interests can overlap so you want them to get the same content. And then it's very simple. You just declare a new cache context user interests. It will automatically get exposed to Varnish. Varnish will be aware of it and when that block is rendered all it says is very ex-Drupal user interests and that's it. Then it works out of the box. So we have the static content, the dynamic content and we have the authentication cache per session and obviously our heavy web server. So yeah, and with that we have a standardized solution for complex problem. It's within reach for 99% still working out the last little details but this could really make it possible to kind of run almost all sites especially those are syndicated. Directly on CDN, no configuration needed. And hopefully some hosting guys will step up using these standard VCL. I always like to see one VCL to rule them all and yeah, with that we have another problem solved. So I would like to call out one thing that Fabian didn't explicitly mention. So the dynamic bits like for example, a block that shows user interests or whatnot those are rendered via ESI. ESI of course uses requests. So it's just reusing Varnish and Fastly which is Varnish as a service essentially. It is reusing its capability to cache a response with metadata in Varnish and that's all it is. So basically Varnish is just assembling several responses. One is the actual response and then the various parts that are personalized that are dynamic, those are separate responses that we can retrieve automatically within the cache of Varnish and that's why it's able to answer within 1.4 milliseconds. So I think we have demonstrated how Drupal 8 can be super fast even for authenticated users and as a previous slide said, as far as I know, this is not matched by any other system. And so Drupal 8 is really the first one that can be properly cached at the edge and it doesn't have the painted other CMSs or other non-CMSs, other web frameworks bring including Drupal 7 which was totally not able to do this. So in order to get to what you just saw what we just demonstrated, it just requires some level of thinking while developing custom modules and contributed modules because we mentioned cache tags and cache contacts several times but they have to come from somewhere, right? So we need developers when they're generating outputs to actually provide that metadata because otherwise we can't know. So the thought process that I would like to teach you in the sense that please remember this and if you remember this, it's just a few steps and it actually makes a whole lot of sense. It is not something that is very Drupal specific, it is just about thinking about dependencies. Dependencies are super important because dependencies are what determine what the end result, what their response is. It depends on a whole lot of things but very often we have not been so honest about the actual dependencies. Very often we pretend, oh we give some input and this is the output, well that makes sense but actually very often we've been relying on global states and there are a few very good examples and Drupal 7 really didn't track any dependencies especially a good example is Drupal at CSS and Drupal at JS. You're able to use these functions to add a CSS file or a JavaScript file to the current page but that's already where it goes wrong is adding it to the current page but what is the current page? It is just being called from somewhere so how can it associate it with the current page? So what it did was it used global state. It just was all the function calls that happened when building a page, those ended up somewhere and then we mapped that to a bunch of HTML statements to import CSS and load some JavaScript and in Drupal 8 we solved that by only allowing to use pound attached and attaching asset libraries so that we know what markup needs which assets. We have a clear connection, we have the dependencies and that's what's super important. Another very clear example of Drupal 7 not tracking any dependencies is the URL function. I'm sure that almost all of you have used that at some points and actually that depends on a whole lot of things including the configuration for what the front page should be, whether the current site is or should be using HTTPS, whether clean URLs are being used, whether the current site is in a multi site and so many more things. So really there were a lot of hidden dependencies that were just actually being implicitly applied and so really actually this was impossible to catch. Well, it's possible to catch it, we can't prevent that so it wasn't possible to invalidate but we still did it anyway because what we did in Drupal 7 very often was clear all the caches. How many times have we cleared all the caches? There's so many places we clear all the caches, it's terrible and in Drupal 8 that's no longer necessary. So in Drupal 8 what we have is these three concepts, these three bits of metadata that are super important, cache tags which are about data dependencies so declaring what data you depend on, cache contexts which are about the request context. So for example, a specific query argument, the current user role or all its roles, the current user permissions, the negotiated interface or content language, those kinds of things and max age which is the time dependencies in the sense that how long can this possibly be used for some things that are very time sensitive. This is one you will probably use the least but it's still very essential for some use cases. So these three bits are the things that matter, stacks, context, and max age and these are bubbled while rendering to the top level of the response so that the response knows what things apply to it, its dependencies, it knows how long it can be cached, it knows when it should be invalidated and it knows what to verify. So in practice all we need is for everybody to make this thought process a habit. First realizing that you are rendering something, when you are rendering something, so creating a renderer array in Drupal, that means you must think of cacheability. Remember that you have to think of cacheability in the first place and then when you are rendering something, you may want to wonder, is this something very expensive? Would this be worthwhile to cache on its own? If yes, use cache keys and that's something that also exists in Drupal 7, this is nothing new. So cache keys specify the, end up specifying the ID that should be used, it's just a unique identifier. So it looked somewhat like this. The next question is, does it vary? Does it vary by permissions, per URL, per interface language, per something else? Maybe something custom like user interests, because you can specify your own cache context to match your site's needs, which is very important for more complex websites. And so if the answer is yes, it varies by something, then we need to specify cache context to capture those dependencies as well. For example, indicate that this renderer varies by user permissions and by URL. And this is very similar to the HTTP very header, very similar in meaning and semantics. And so the next one is, is there something that can cause the thing I'm rendering, the renderer that I'm building to become outdated? Is there some change that should also cause a change in the thing I'm rendering? If yes, the answer is use cache tags. So for example, you can specify that your renderer depends on node five, user three, and exotomy term 23. That's just a bunch of quantities, but you can specify dependencies on a lot of things. And then finally, does this become outdated automatically after some period of time? If the answer is yes, then use cache max age. By default, we assume that it's permanently cacheable because most things are permanently cacheable and tag invalidation will make sure that you can cache something forever, but as soon as it is changed, the cache tag invalidation will make sure that it's invalidated anyway because that's the whole point of cache tags. It should change immediately. And that's very close obviously to the HTTP cache control headers max age property. Now it may seem very painful to have to deal with all of those cacheability metadata bits manually. So to help address that of course, we have an interface that is implemented by very many things that provides that cacheability metadata that says for a given object, this is the metadata that I vary by that this is the dependencies for this object. So for example, it's implemented by all configuration by all entities, every access result has it. Block plugins, context plugins, condition plugins, some of those you may not even ring a bell because they're relatively deep into the Drupal architecture. But the point is everything that you use while rendering something while building something in Drupal already provides the necessary cacheability metadata. So you only have to use it. And this makes it very easy. And that was really the key part of the talk. We've demoed it and we've explained how it's possible and how you can make sure that this keeps working. But an ESI caching on the edge in CDN, anonymous caching is really not the only thing that this cacheability metadata enables. It also enables other interesting things like hybrid alternative render strategies such as big pipe. And we have a session about that tomorrow. So if you find that interesting and if the demo I'm about to show you for that is interesting, then I would say come by because Fabian is going to do a fabulous demo there too. This is a very short version of big pipe. So what you're looking at is a awesome music website, as you can tell. And so I've got some content on the right-hand side and on the left-hand side, I've got a few blocks. And the first block is personalized. It's slow, it takes three seconds and it's personalized per user. This one is also slow and it is not cacheable at all. It's super dynamic, it's live data. And this thing at the bottom is also personalized, but it's not quite as slow. So the two next to each other called caches and voila, that's the difference. The two blocks each take three seconds, but big pipe is still able to send the majority of the page immediately. As you saw, we finished at the same time actually. The final block showed up at the same time, but big pipe shows interesting, relevant, important things much, much faster. Even with warm caches, the difference is enormous. So on the left-hand side was had basically, so Drupal 8 as it currently is or Drupal 7 rendering. It's the same thing, everything is built and everything is flushed in one go. And big pipe is able to flush the non-super dynamic things immediately resulting in so much faster perceived performance because you see something useful, you can actually start doing what you wanted to right away instead of having to wait for the server to generate every single bit, which is a very big difference. Finally, a quick peek at the future. Service workers, how many of you have heard of service workers? Okay, like 5% maybe, 10%. Service workers are still in development, so it links to a spec there. The slice will be up soon after this talk. And what it really is is simply a client-side reverse proxy. You could think of it as varnish on the client side and you could think of it as a VCL in JavaScript because the logic for this reverse proxy is defined in JavaScript. And that means, because it's on the client side, that we can have zero latency. So instead of even having to go to a CDN, you can just cache it locally, right on the browser, right on the client that is trying to visit your site or your app. And it will be insanely fast because there is no latency. Of course, there is still considerable problems then because we have to make sure that that cache keeps in sync as well. So that is then a different problem to solve, keeping those in sync, but having those new possibilities and capabilities is going to be very interesting. And Drupal already has the metadata, as shown by the fact that it can integrate with CDNs automatically, transparently without having to go through a whole lot of pain. That metadata we will be able to use to make sure that those client-side caches stay in sync as well. Currently, browser support looks like this, so it's definitely not close around the corner, but it is getting there. It is being adopted. So hopefully some time from now we will start, we will be able to start using that as well. And this feels kind of strange to say, but I feel it's worth calling out this time because Acvia has allowed me to work on this and everything leading up towards it because as Fabian mentioned, it was a whole lot of work to make every single entity and config and so on specify the necessary cacheability metadata. And Fabian was also given grants in order to be able to work on the ESI stuff that was demoed and big pipe. And so Acvia has made it possible for us to work on those things and it benefits all of us, which is what I think matters most. It's not just big clients, it's everybody in the community. And so that was it. Do you have any questions? The docs are at the bottom. Those are the ones that are most relevant and should be very interesting. Thank you. Thank you for a good presentation. Very interesting. And I have only worked with Drupal 7 for so far, but I made a small module for caching stuff in varnish, small parts, blocks, mini panels, whatever, using Ajax calls. So I can track them across page view, different pages. So for instance, I have a right column that is more or less the same. I just get the same Ajax call on every page. Can you foresee something where this can sort of? Yes, so because we have placeholder strategies now, all you would need to do is you would use an alter hook. You would specify create placeholder true. You would register your custom placeholder strategy for Ajax and it work out of the box. I don't mean I want to keep using Ajax, but... Yes, yes, it would work with Ajax out of the box. Yeah, but I don't really want to use Ajax. I would rather use ESI, for instance. Okay. But I don't want the same, well, yeah. It's completely interchangeable. As long as you have a placeholder, you can use ESI, Ajax, client-side rendering, Node.js, React, even whatever. And those placeholder strategies are already in core. So you would do that for Drupal 7. Okay, for Drupal 7, for Drupal 7, it will still take a while, but we are porting the render caching from Drupal 8. Well, I'm porting the render cache from Drupal 8 back to Drupal 7 using the service container module, which will allow to kind of run most of the same code in Drupal 7 as well. With the exception of cache tags, we need to specify and cache context. You will need some more manual work, but it might be easier than what you need to do with your module now. I think it'll just drop great to Drupal 8. Okay, perfect. Perfect, yes. Oh, you answered my second question. So any timeline on the Drupal 7 render cache work? When Drupal 8's work is done. Just then, because again, porting does not make sense before, probably when big pipe is in, and probably when Drupal 8 is out, that's when work on render cache where we start, so. Okay, my other question was, I kind of missed in the first example. In Drupal 7, you would queue up a whole list of URLs and send out the purge request. What exactly were you sending to the CDN with the cache tag metadata? To the CDN, we were just sending every quest to purge a special key. So in this case, I think when you add a comment, we would invalidate the note and the comment itself. And in this case, we would then just send out something that would invalidate this special, yeah. In a sense, just what we showed the node five and user three. Yeah, so basically you send purge towards the URL with as you say purge URL as in the CDN URL. You talk to the CDN, you just say purge and then node colon five or purge user colon three. You just specify the exact same cache tags and the CDN invalidates that across all of its responses that whose X Drupal cache tags header contains exactly that and that's it. So it just does string matching essentially on all of the responses. So do you need a custom VCL for that or? Nope. Well, for Fastly, they actually provide that out of the box. You just, the Fastly module automatically maps the X Drupal cache tags header to surrogate key, which is what they call it, but it's just a name. It's the same exact principle. But in pure varnish, yes, you need a few lines, like two, three lines of VCL to make it react through those purge or ban requests and that's it. Okay, thanks. Hi, we have a website where the front page has content pulled in from other systems and these other blocks are user dependent content. So for you could imagine, for example, a web shop basket is pulled in from another website. So the content of this block, this HTML, is user dependent. So that comes into Drupal as a piece of HTML. So we have a REST interface on Drupal calling another website and we pass across a user. How would we, because I'd love to kind of then cache that, so I don't have to go back through my REST API every time we call. You would just take the HTML you were getting back. You would put it in a render array and you would add attached cache context users and that's it. So REST Drupal would do automatically. It would make a placeholder. It would be kind of outside of the main page thing and then you would need like this ESI strategy and boom, it would be ESI. Okay, great. The question is about the size of HTTP headers. So because you had a huge amount of information now, is there a way to reduce the size of it or do we just have to take it? So there's two things about that. I don't think the HTTP header matters too much between web server and Varnish in that case or web server and CDN in that. It might matter a lot more for the end user. In there, what probably should be in the standard, new standard VCL, both those for new only anonymous users and those for authenticated users is to just strip those headers out. We actually have an issue to make sure that it no longer emits those headers by default unless you have a reverse proxy setup. So that would actually completely solve that but as Fabian indicated, the header size is only relevant towards the end user because then sending many, many hundreds of bytes in the very first part of the response that is going to slow down the perceived performance on the client because it takes, for example, an edge connection or 3G, it may take a while and that would slow it down but between the server and the CDN, it doesn't matter anyway but we were working on making that better. Does Acquia Cloud Varnish currently or will it soon support cache tag invalidation? We're working on that. I don't know the exact time when it will be available but yeah, it's definitely coming. Yeah, and we are also working on the, I will be working with an Acquia Cloud engineer on the cache context thing so that that's potentially for some customers, first experimental should also be available and then hopefully later be standard. Could you tell us more about the place-holding policy? Sure. What more? Development side? On the conditions of placing a place-holder. Okay, so the auto place-holder currently works in the following way. There's two possibilities. Either something declares its dependencies automatically but then whenever it started to be rendering, then we detect, oh, this is rendered by user for example and in this case, we create, we replace it with a place-holder and we put the actual data that we wanted to render in the attached array. So the same as libraries, HTTP hats, things, et cetera, the place-holders are actually gonna end up in the attached array. So they are additional metadata that's available and transferred and retained from different stages. The other point is the place-holders when you already have rendered it, then we detect after rendering, oh, this was per user and again, we are putting a place-holder but we are saving whatever we have computed so far and then we later have that available for rendering. What is key to that is that the place-holders allow us to cache every page in a kind of like internal page cache called dynamic page cache where everything except the place-holders with the raw place-holder data that can be recreated is stored in this internal page cache and that allows what we have showed tomorrow more to kind of have response times to the first byte of like 20 milliseconds. And so this is auto place-holding. We can continue to make auto place-holding better. I think we have two-thirds or around 50% in-of-the-auto place-holding things. Currently, what is not yet possible is to say this block varied once by users who we wanna always vary it by user but so that it would never be but on the other hand, we have great alter hooks where you can just say, I'm a site builder. I know what I do. I want to optimize this site and you can always declare all dependencies upfront. So as a site builder, developer, performance engineer, you can tune your site very simple to ensure that the auto place-holding is better. And if you want, you can always specify hash create place-holder fold to not create a place-holder or hash create place-holder true to create a place-holder and force creating a place-holder. So it's automatic out-of-the-box, tunable and turn-offable. Great, thanks. And we'll probably deal with place-holders a little more tomorrow too. So another one about our place-holder, let's imagine we have a big render array and a little part of that is a shopping cart and most part of it can be cached for everyone anonymous and now we go through this render array and say, okay, this part should be in a place-holder and then the next request just wants to shopping cart because the rest is already in the cache but the shopping cart was only built as part of this huge render array and at this point we don't know that there's maybe a function or something that took just get the shopping cart. We've solved that. Because we have enforced an API called lazy-builder and lazy-builder means that a block or an entity must not have any external dependencies. If you have that, you just need to say, this is not place-holderable, this is not lazy-builderable. You can kind of opt out of that but your shopping cart needs to be independently buildable and if you don't do that, your site will break. Let's duplicate. It's as simple as that. That sounds a little harsh but these kind of restrictions of ensuring that everything has dependencies, everything is cacheable, everything is independently buildable that needs to be independently buildable is what makes all of this possible. But is this visible in the render array? Is there in the render array some key that says how to make this block? Yes, lazy-builder equals that but all blocks are automatically lazy-buildered. That's transparently in core. Okay, so I see this in the render array, in some sub-array. Yes, you would see that. Yes, he would see that. How to make this thing standalone? It is standalone by default. It is already in Drupal 8 core that every block is lazy-buildered. Yeah, sorry. Did you mean a blocker? I think you meant somewhere deeper. It's not so far as I understood this correctly that most of it just starts with a Drupal render or the Drupal 8 equivalent of Drupal render. Mm-hmm. And so it goes through the render array recursively and then it says this should be a placeholder. Okay, there's two things to that. First of all, there's a possibility to also auto-placeholder things that are cacheable and not auto-placeholderable that I have working in a proof of concept but we've not yet gotten that into core. The other thing is when you want to do something like that, like we had a great example today, you have a solar page and on that solar page you never want to cache those solar things. So all you need to do is you return from your controller, you return instead of the regular content, the render array, you just return hashLazyBuilder equals callback plus some functions. Gonna talk about that more tomorrow. And then you specify like the search arguments and that's it. And then when the page is built, it will detect, oh, this is not cacheable. So it will put a placeholder at that point in the page so it's not only blocks, it can work everywhere on the page as long as you're using a lazy builder. That's a moment of saying, but as a developer you can easily switch that over. So at this point you don't really build the complete error with all the sub-arrays like for the shopping cart and for the search but you just leave this as an empty in there. Placeholder. It's just saying how to get this stuff but it doesn't build the error yet. Exactly, yes. That's a trick. Yeah, that's exactly what placeholders are. All right. Any more questions? It's linked from the slides that will be up shortly but it's 1415 in this room tomorrow. So hope to see you all there and have a great evening.


Josh, you guys managed seven straight singles off of Corey Kluber in that first inning that led to six runs What was it about the approach today that led you get to Kluber in that first inning? You know, I felt like we were jumping on pitches that we were, you know looking for, you know, he made You know for myself try to throw a sinker in middle-end was able to kind of stay inside and stay away from the ground ball poolside Glaver had a great at bat. Judgy gets his going on early. Big G. I mean, you know a lot of guys contributed to that It was nice.  You hadn't seen live pitching in five days. How were you able to lock in like that? Yeah, I don't know.  Yeah, you know I got halfway there and for some reason my legs were like no, we're gonna stop running right now So I was trying to stay up as long as I could and you know, no joke with the guys in there You know, I needed a wheelchair to score right there And I was able to get through you guys know how important this series are with the where the rays are in the What did you think of the job that Jameson Tyone did this afternoon of really keeping that raise offense at back? Yeah, I mean hey that's a team over there. They're aggressive. They like to try to jump on you early I felt like he was dictating the contact defense played good for the most part But you know, he kept them swinging and I was able to get some big punch outs and also, you know Defense was able to pick him up as well. Josh. Thanks for the time. Thank you set it back to you