Today I'm going to introduce a library called Rust Prometheus and it's a simple library but you will see how Rust makes this library safe and fast. So let me introduce myself first. I'm Wish, an infrastructure engineer from PINCAP. You may already notice this name if you attend the lectures before. In PINCAP we mainly build two products. One is a distributed transactional SQL database called TIDB. It is written in go long and another one is a distributed transactional key value database called TIDKV written in Rust and TIDB is just a SQL layer built up on the KV database. The key value database is the storage layer. TIDB and TIDKV have many many customers worldwide and we have adopted in banks, internet, enterprise companies for more than 15 gigabytes data. It's pretty large data and these are all used in production cases. So let me introduce the architecture of our product. TIDB speaks MySQL protocol and so your application can just use MySQL drivers to talk to him and TIDB act as a stateless SQL compulsion layer and for the underlayer it is TIDKV. It's a distributed KV storage and this distributed KV storage is building Rust. In PINCAP we also created and maintain a lot of many other Rust crates. For example here the Rust promissures is the library I'm talking about today and Rust RocksDB it's binding and wrapper for the RocksDB database and Rust. It's an implementation for the Rust distributed consensus algorithm and also gRPC. We build it to wrap the gRPC language core to be high performance and also we build FAIL IS. It provides FAIL points. So what is promissures? Oops, so I know this one. It's just a system monitoring and Latin toolkit. Here is a common flow of using the promissures.  Rust promissures is just a promissures client. It is not a promissures implementation in Rust. Sorry for that, but I promise you that you will find many interesting things even in this simple small client library. So let's first get started and take a look at a small example of how to use this library. First of all, you need to define your matrix. There are many kind of different matrix like Cunder, Histogram and Gauge, so on. Here as the code demonstrates, we create a Histogram matrix named HTTP request de-origering using the macro called register HistogramVac. The Histogram has one label called method. As you can see here in the fifth line, there is one label called method. So this is actually a Histogram vector because for each value in the label, it will be different matrix. They are counted independently, so they are Histogram vector. For the second step, you will record the matrix. As an example here, I just use random generators to generate this matrix. In real applications, you should use an instant to record the duration instead of what I did here. It's just for demonstration. Here I will, here the code simulates a request. As you can see, its duration will be randomized from 0 to 2, and its HTTP method will be from one of get, post, pretend, delete. We use this line, requestDuration.withLabelValues method.observeDuration to record this duration. It means that there is a request in a label specified where the method variable takes the time specified by the duration variable. Finally, let's serve the matrix for the promissive server. There are two ways, generally, the pull and the push. The code here provides a matrix service using the hyperlibrary for promissives to pull a matrix from. So here the code is pulling, but the promissive library also provides push functions. To pull a matrix, you just need a tax encoder. As shown here, it's a tax encoder, new. And this tax encoder will encode these gathered matrix to the output response. And the output response, just look like this. So far, you have already collected your matrix to the promissive server, so it's time to visualize it. Here, I use the graphener to display the histogram using the promissive query language, as you can see in the blue text. Then you can see the graph here. Of course, you have to feel to use any kind of other visualization tools, but commonly, graphener is a wise choice. So far, it looks normal. Just simple matrix library provides matrix recording and encoding features. Next, we will see how Rust promissive library provides some unique features by utilizing some Rust advantages. First, Rust makes the library very safe. So while we care about safety, we use Rust promissives in our key value database, as you already know, TypeKV to record and report all kind of matrix. There are hundreds of matrix. And safety is very critical for TypeKV. For example, we don't want crashes. If TypeKV crashed, your service is unavailable. Although TypeKV is distributed and for the tolerance, but we want to minimize this possibility, we don't want to see that happen, so we want to eliminate crashes. And then, for the most important thing, we want to eliminate data corruption. As a key value database, it stores data permanently. So if there is a memory safety issue, normally the memory will be broken. For example, there may be garbage in the buffer that TypeKV is going to flush to the disk or transfer to other peers. In this case, if this data is corrupted, it's horrible. It means that we will lose our data permanently, so we will not let it happen. That's why we very care about safety. So now let's begin our case study to see how Rust enables safety. Let me introduce some background. In the library, you can define the record labels for matrix factors, just like this one. Here is HTTP request. It's method. It's post. It's IP. It's IP. And it's pass. It's slash API. Then, after defining and recording this matrix, you will be able to query a matrix for a specific label. For example, you can know how many requests come from this IP address and how long it takes for request to slash API endpoint for 99% of requests. So as you can see, the label is pretty useful here. In fact, in TypeKV, you heavily use the label feature. When you're defining it, you use countervex. For example, I'm using a counter. So countervex, new. And I provide three label names here. And when I record matrix, I use counter dot with label values and provide three label values here. Here is a restriction. So the number of labels you defined and the number of label values you provided, they must be the same number of values. So how can we do that? Normally, we can just check the length at a runtime. And if the length doesn't match, we can panic or slow errors. But this is very simple, but there are some disadvantages. For example, your code may be hidden in a branch so that your text will not cover it. But you know, in production cases, all errors may happen. And that means if your text does not cover it, this error will be in production. It's very... I can't tolerate that. And also, there will be runtime costs. Because you are just checking the length in runtime, so there will be runtime costs. So how can we fix that in a right way? We can use type systems to enforce label lengths. Here, I first declare a trade called label. Then I implement this label for different kind of string arrays. For example, I implement this label for an array contains one string, and the array contains two strings and three strings. These types are all labels. Next, I will pass this type, some label type in the new function. I just pass some label type in the function and create a kind of act containing this type T. And for the recording pass, when we want to waste label values, we also accept this T. So as you can see in the usage, if you pass an array with two strings, you create a counterfact. It's T as string with two elements, two elements array, string array. And when you use this metric, you also need to pass a string, a two and an array with two strings. If you want to pass an array with one string or three strings or other kind of strings, the compiler will reject your code. So in this way, you ensure that the label numbers you pass when you record the matrix are exactly the same when you created it, while you don't have to check its length at runtime. So it's both safe and fast. And for some improvements, we may also want these features. For example, we want to able to define the label using into string and using the label using as rough string. And also, we may want to be many values. For example, four, five, six, 32, we want these many labels. And we don't want to repeat so many codes here. As you can see here, I repeat three lines for string length one to three. And if we are going to create 62, 62 labels, it will be a lot messy. So this is possible in Rust, but it's quite complicated. So I just paste a link here. You may refer to it later to see how it works. Here I demonstrate a code piece that uses this improved version. As you can see, when we create the counter, we can pass either a string reference or an owner string. It is into string. So if you are passing an owner string, there will be no cost. If you are passing a string reference, there will be string clones. That's what we expected because we will store these strings in a structure. So it must have set owner strings. But when we use the counter, it is as a string. And as you can see here, also you can pass string references or owner strings. It's all fine. And the most fancy way is that if you define a matrix using owner string, you can also use it using a reference string. And if you define using a reference string, you can also use it in owner string. It's all fine. So also it has all the features previously we thought that is to ensure the length at compile time. So if you pass a string, passing an array only contains one string or three strings, it won't compile. There are some other cases in the Prometheus library. For example, we utilize send and sync markers in Rust. What is send and sync? For send, it means that a type can be sent to other threads. It is safe to send to other threads. And for sync, it means that the type can be shared for different threads. So for example, considering thread local variables, it is not sent because if you hold a value in one thread, when you send it to another thread, the value no longer holds. So thread local variables is not sent. And we'll see an sync example soon. And also we utilize must use attribute. Must use means that this type must be used. For example, in Rust, the result type must use. If you have a result type and you don't put it in a variable or don't call its method, the compiler will reject your code. For example, in Rust Prometheus, we provide a timer that records, it laps the time when it is dropped. So if you don't use it, it will be dropped immediately. And this is not normally developer may expect. Developers may expect this timer to run for the whole scope. So it is a must use timer. Now let's see how Rust enables the Prometheus library to be very fast. Sorry, I made a mistake. It should be fast. So you see I just copy it. So why we care about performance? Because we record metrics very frequently. For example, we record a lot of metrics. For example, duration, scan keys, skip keys and so on. And we have hundreds of metrics recording every second. And also we record metrics for all operations Taiki provides. For example, get, put, scan and so on. So the overhead of the metrics should be very minimal so that we can know what is happening without sacrificing the performance. Now let's study a case, which is the local NSYNC metrics. Normally, our metrics is the global metrics implemented using atomic variables, as you can see here. The advantage of using atomic variables is that it can be updated from everywhere, for example, multiple threads. But as you can see, for atomic variables, we need to use atomic operations to modify its value. For example, I use fashat and it's 10 nanoseconds on my laptop. And to improve that, we can introduce some local variables. So this is what local counter it is. So for local variables, they are not NSYNC. And we can flush back to the global variable periodically. So you can both achieve, you can just achieve the speed while not meeting some data race issues. For example, you can just use x plus equal one to increase the local counter. And the counter will be flushed to a global counter. For example, every two seconds, three seconds, although it takes 10 nanoseconds, but it's fine because it only happens every two seconds one time. So in this way, in this way, it is very fast. And for a local counter, it is not NSYNC because you know data race, if you create two threads, update the same counter, you won't get the final counter number you expect. It's a simple data race. And in Rust, it provides NSYNC marker to mark that this is not shareable for multiple threads. So the local counter is NSYNC. And by using this technique, we can both achieve fast and safe. You can use the local counter in a very fast way, and you will never share it in multiple threads. You will never share it in a wrong way. So it's both fast and safe. Let's study another case, which is cache in matrix vectors. Also, let me introduce some backgrounds. As you may already know that matrix with different labels, they are counted independently. For example, here is a code created a counter fact with two labels. And then I used the label, for example, I record with post slash and record using get slash and record using get slash API. And finally record using post slash. So post slash happens two times. So when we want to get this value, it should be two. And for get slash API, only record one time. So when we get it, it should be only one. And for other kind of label names, it should be zero. And of course, get slash is also one. So as you can see, although it is the same matrix called the contests named the name. But it has different label values. So actually, they are counted independently. So what happens inside the function with label values? It actually does these things. First, it will hash your labels. Here, it will just hash your post slash and it will get U64. And then it will perform a hash map lookup. And if you have already used this label value, the hash map entry exists so it can just return it to you. And if this label value is fresh, you have not used it before. It will create a new entry. So it's just an atomic variable with zero initialized. So as you can see, the with label values function actually does a lot of things. For example, hash lookup and also some branching and finally it returns the matrix. You may notice that there is a simple optimize. For example, instead of doing these things, which is accessing a counter, looking up a counter using get and slash API and then increment it for the whole process, we repeat it for 100 times. Instead of doing this, actually, you can lookup for only one time. So you lookup one time and then you increase it for 100 times. This is pretty fast. As fast as the case when you use the counter without any labels. So in Type KV, there are many service endpoints. For example, there are transaction guides, transaction batch guides, pre-write commits and so on. There are so many service endpoints. And we can use this piece of code to accelerate just in this way. We can write it manually to cache these labels. But you can see it is not dry at all. For example, here we have only one label called service. But what about there are two labels, service and status. As you can see, I should repeat for example, transaction gets success, transaction gets fail, batch gets success, batch gets fail. It's a lot of code that even exceeds my screen. So how can we solve it? We can solve it using Rust macros thanks to the powerful Rust. Yeah, I'm pretty a fan of Rust. As you can see in the code, this is the macro provided by the Rust Prometheus library. It's called make static metric. And when using this macro, you can just provide your labels. For example, services, I give it these services and for status, I give them these status and it will take care of you. When you use it, it's pretty simple. You can just m.transaction.get.success. You will get a counter and you can just increase it. So how is this macro actually implemented? It is pretty cool, right? But you may not know how it is written. So let me use some simplified example to illustrate how this, what happened to my laptop? Okay, that's fine. I can use some simplified cases to illustrate how this static metric macro is implemented. So let's take a look at some simple cases. For example, we want some macros that expand these kind of things. We just want, after expanding, we can use it like this. For example, here is a counter with label values four. And this should be something that the macro expanded. And after expanding, I should be able to just increase the macro. And also we can just get the macro or some other functions. So the implementation is pretty simple. I can just create a struct called my static metric and then it has two counters. When you new the struct, you can just cache the metric using counter with label values just like what we did before. So this is the code we write. And this is what we expect. So our macro should expand the code in the left to the code in the right. But as you may know, in Rust permissions, there are more than one labels available. For example, you can supply three labels. For the first one, there are two values. For the second label, there are three values. And for the third one, there are two values. So in order to implement this kind of metric, actually you need some more complicated codes like the code showing in the right. For example, we want to access full.usra.success. So actually you will need three structs. The first struct contains full and bar for the inner two. And for the inner two, it contains three fields for the inner three. And for the inner three, it contains the actual counter. In this way, the iterative macros won't work because they identify a concat here. And also you may notice that the logic, the repeat logic is not the same for every label. For example, for the first label and for the second label, it will expand to a struct we create. But for the third label, or let's say the final label, it will expand the code to some counter. So the character macros won't work. Then let's use procedure macros. So what is procedure macros? Procedure macros allow creating syntax extension as execution of a function. For example, you can create a function like macros using procedure macros. And you can create derived macros. For example, here is the custom mod derived created by me. And you can derive this macro for your own type. And also you can use attribute macros. So to use the procedure macros, first you need to declare an entry in your cargo manifest file. It is stay inside the lab entry. So it's just a procedure macro equals to true. This indicates that your create is a procedure macro and the compiler will recognize it. Then you need to write a function. It's just a steps and parameter, which type is token stream and produce a token stream. So it's just a transform function, setting a token stream and transform it and producing the new token stream. For example, here I didn't write the body for the function. I just print the token stream debug mod. So you will see what token stream it is. And remember that for procedure macros you need to add this attribute procedure macro for it so that your function will be caught when the macro is invoked. So let's see what will happen. In the left side, this is what our macro users will use. It's just write make matrix and pub struct my static matrix for bar. You may notice that the syntax here is very similar to the rust structure, but actually it's different because for full and bar, there are only names and no types. So actually it is an invalid syntax in rust. It's just similar to rust structure. For the compiler output, you can see for this kind of code, it will generate these token streams. The first is identifier pub. The second is identifier struct. And the third is identifier my static matrix. And then there is a brace group. And then here comes inside the group there is an identifier full and comma punks and then identifier bar and also comma punks. So this is what your procedure macro function will get. Now you will write a function to transform these token streams into the token streams you want. So in order to do this, let's first pass it. Normally we use a query called scene to pass these tokens. For example, as you can see in the right, this is the scene parser implemented by ourselves. It's just called a metric definition. It contains visibility that is the pub. If you don't write pub, its visibility is different. And it also needs information about the name you provided and also a list of identifiers. It's just a list of label values you will provide. So here it should be full and bar. So this is the structure that we want to pass from these token streams. And then we will write the parser using the scene facilities. For example, the first, we just input dot pass. We are passing a visibility. So we pass the visibility to the visibility variable. And then we will find a keyword called struct. So we also pass a token called struct. You may ask what will happen if the user doesn't provide some struct. For example, he may write pub in now. In this way there is a question mark here and there are errors. So you can just get what you expected. And next, I expect here to be a name. So I also pass an identifier here. Finally, here is the brace. So I use the brace macro provided by scene. It will pass the brace. And the content inside brace, as you can see, it's just a list of identifiers concatenated by commerce. So I can also use some facilities provided by theme. It is pass terminated. And token is commerce. So it's commerce concatenated. And token inside is an identifier. So finally our pass is tokens into some vectors. So it creates an iterator and collect it into a vector. Let's see what it will happen. For example, I just wrote a puzzle and I will use it in this way. You can refer it to the scene documentation and you will learn more. Here I just demonstrate a simple use case. So in this way it will pass the input token stream using your metric definition puzzle and generate the structure you want. So here is the structure we passed from this input. As you can see, the visibility is pub. And the name is our my static metric and there are two values foo and bar. So right now it's so fine. So for the final step now we already know what user has supplied and we want to reassemble the code, reassemble the token stream to another token stream. So here we can use the code code. For example, I want to reassemble the code for the yellow part. I want to resemble it. So I will write the code in the right. And the most important thing is this piece marked in yellow. As you can see I just write code and visibility, struct, name, and values counter. Since here is a sharp and some brackets, so it's just a repeat list. So actually it will repeat every values and repeatedly produce these tokens. This is pretty you can write it in a way that's much like source codes. As you can see finally I will output this expanded token stream. It's just like this. Although there are different space for example here there are new lines and there are no new lines, but you know it's fine. And if we omit this space you can see they are exactly the same what we want. Now let's generate the rest part. It's implement my static matrix. I want to transform token strings into the this part. So I naively write codes like this. It's just for example the same repeat list. And inside the list there is a double code and sharp values and let's see what will happen. So in the compile output you will find something you are not expected. You will find that with label values its parameter is a string. So you are actually providing this string, right? And it's just to produce the string for you. So what's wrong with it? It's just because your values is an identifier but here you want to produce a string. So you need to transform your identifier to the string than it will work. So let's do it. Let's transform the identifier to the string. Here it is just a simple map. As you can see data.values.daterator.map then so I will get every identifier. Now I will create string literal using little string new. In this string literal I just call the content without modifying it. And actually you can modify the content. For example you can concat or add prefix or suffix everything whatever you want. It's just fine. So you can freely manipulate this identifier and create a string. And finally we will use this sharp value string instead of sharp values to be here. So this sharp value string is a string and it is not an identifier. So now it will work. This is pretty exactly the same what we want.  So it's exactly the same what we want. For more information you can check out these two links. For our toy macro you can check out this gist and for the full implementation using Rust permissions you can check out this link. It's a pretty complex implementation because the macro provided in Rust permissions provides many functionalities. It has a very complex syntax and the syntax is very powerful. So to support all these kind of things the macro itself is very long. But as you can see the code idea is similar. You just first pass it and then manipulate it and finally you will generate a new token string. So finally let me talk about some future plans of this library. Currently this library is not 1.0. It's just 0.5 or 6. I don't remember. But anyway it's not 1.0. But we are planning for the 1.0 release. We will adapt it to the Rust 2018 edition and also we will clean up this API because this create is written several years ago and during this year some functions of permissions has changed. For example there is no product buff anymore so we will also remove the product buff support. We will provide type save labels. So it's actually a prototype but we will provide it. Also we will provide some smaller library size and maybe we will support the no standard library environment. You can use it in web assembly or some embedded service. It's fine. For the future we will also support a metric kind of summary. Also we continuously want to make the metric very fast. So we have already got an idea. It's core local metrics and we are still exploring how we can implement it. By using core local metrics we are expected to have some greater performance. Also we will provide some easier to use polling handler and more to come. Contributions are appreciated. Thank you very much. You may ask some questions but I'm not a native English speaker and I may not understand your accent quite well so please speak slowly and so that I can understand it. I'm very sorry for that. I think maybe there are two questions. If there are more questions you may ask me afterwards. So the type save labels is just okay. He asked what type save labels really is. So let me turn back. Here it is the type save labels. The type save means that the label numbers you provide when you define the matrix will be the same when you use it. It will be checked by the compiler instead of at runtime. So it's type save. When it is chatting the compiler time and you don't need to worry about for example not being covered in tests or something else and there is no cost. We are doing it in a type save way. So there is type save labels. Oh yeah. He asked a question about whether it's possible to just switch off all of these things so that the performance can be greater. It's of course approachable but this is not implemented. It can be approachable by using example config. You can configure a feature gate for these kind of things and you hide it behind the config so you can switch it on and not switch it off. When you switch it off the compiler will not generate these codes so it will be no cost. Are there any other questions? Maybe one more. So you are asking questions about whether it is fast to use atomic variables. You mean other kind of approaches? Do you mean other kind of approaches? Okay so let me show it here. Actually we have benchmarked the performance of using atomic variables. Usually it takes 10 nanoseconds when you use atomic variables in single-threaded environments and when there are more threads the condition may be worse because there may be cache contentions. That's why we introduced local matrix and also we found we are investigating this approach. It's collocal matrix. This collocal matrix is also implemented using atomic variables but it can avoid cache contentions so in practical it will be faster. But we are free to discuss some other implementations. We always want it to be very fast. Thank you.


One day night football coming your way from Gosford as the Central Coast play their final home game of the season against the Western Sydney Wanderers. Mariners fans are brave, wintry, wet conditions here. Chris Bief, the man in charge tonight. Lovely little nutmeg from Nicolai Muller, not too many options, waits for Tate Russell to bomb on down that right hand side. Tate Russell tries to blast it in, Birriguetti got a little fingertip on that one to tip it over. Not a super save. That was a fantastic save, third time in the space of about five minutes down. Western Sydney Wanderers right, Mariners left, and we spoke about that, they're overlading this left side. Stands this, content. Silvira, Zurich, capable of hitting them from here and onto the crossbar via the deflection. It's out for a corner, Krendegast trying to react in time, but it's his woodwork that saves him. Such a danger when he plays. Every time when I come up here and I see him on the bench, I just think to myself, why? Whips it back post, great delivery, Matt Simon, 20-20. They take the lead and deservedly so, wonderful play, very, very simple. Great cross in here from Tommy Yor. Matt Simon cuts it back and tapped in by that man, Zurich. Pass, led along the deck for Duke. He changes the point of attack. Tate Russell, Wanderer should be able to keep it in. Now they're captain, Duke, back into the area. Kwame Yabawa on the turn, one Mariners slipped. Duke can have another go. The combination between Duke and Simon Cox at your service says the Englishman to those Wanderers fans on the far side. Mariners fans throw their heads back in frustration. No win in their final home game of the campaign, but another point earned and a point scrapped by the Wanderers as well. They want to win games, but in the end, that point keeps them in the mix for a spot in the finals this season. Hello and welcome to Wanderers Live. I'm Michael Turner, your host, and it's great to be with you this evening. We're here at Bankware Stadium for the first time in a long time as the Wanderers prepare to take on the Wellington Phoenix in an important clash in the race for the finals. As we open, we saw some footage of the disappointing draw against the Central Coast Mariners up in Gosford earlier this week. Hopefully a different result for the red and black tonight. We're also talking to broadcasting legend Tim Gilbert about what he's been up to with the club, as well as Wanderers Chief Executive John Thatsomus, as well as Rob Shahady. But most importantly, we're talking all things Wanderers related. Now let's talk a little bit about our opponents, Wellington Phoenix, here tonight. They've only lost one in seven. Their last match was a one-all draw against Adelaide. That was actually here the other week. A two-one win over Perth the week before that, and of course a three-one loss to Sydney FC before the break. Now on your screens, we're about to see the last matches up against the Knicks. The Knicks are actually looking to complete the clean sweep. They had a two-nil win in January at Sky Stadium, as well as a two-one win in December at Edom Park. Now let's talk a little bit about the stats between the two sides. Now between the two in the league, there's been 28 goals for the Wanderers. The Knicks more prolific in front of goal with 37 shots on target. The Wanderers with 41.2%. The Wellington Phoenix with 45.7%. Big chances, 43 for the Wanderers with 53 for the Wellington Phoenix. Big chance conversion, 37.2%. And 47.2 for the Wellington Phoenix. Now they are the more prolific side out of the two, the Wanderers, and of course the Wellington Phoenix. But of course they are currently second, and it is their best ever finish to a season. Let's talk about their last match, of course, one-one at Bang West. Marinovic made a number of key saves for them, but he did lead the counter-attack for Wellington's goal. They are very good at passing out from the back, and of course that was Josh Satire, a former Wanderer, coming ahead with that goal. They did have a chance to win it, but Sevilla wasn't able to convert the penalty. Unfortunately for the Knicks, and they had to take the points against Adelaide United. Let's look at the match tonight. Of course, it is all to play for. Last ditch play for finals for the Wanderers. The Wanderers are currently ninth with 27 points. The Jets are in eighth with 28 points. Western United seventh with 30 points, and Adelaide sixth with 34. Of course, all to play for. Let's see what it means for the Red and Black, and of course, let's review the season that's gone past. With a brand-new headquarters and a state-of-the-art stadium, the 2019-20 season was a real homecoming for the Wests and Sydney Wanderers, and didn't it start out with a bang? After three rounds, the Red and Black sat top of the table with an opening win at home against the Mariners and a way win against the Victory, and for the first time in two years, a Mitch Duke Thunderheader gave the Red and Black the win in the Derby against Sydney FC. At the rebound! It was all coming together, and everything was right in Wanderland. But the good times did not last. Heartbreak ensued for the Wests and Sydney faithful, with late goals against City, Wellington and Western United. Would you believe it? Swan won! It cost the Wanderers pivotal points as the final series began to slip away. A glimmer of hope with a chaotic and passionate win away against Adelaide United did not last, and after one win in 11, a sole fornaroli goal at home resulted in the departure of Marcus Babel. J.P.D. Marini was then handed the Reigns' interim, with the uphill task of resurrecting the season. New signing Simon Cox got on the score sheet with a 3-1 win over the Mariners, followed by an emphatic 5-2 win over Adelaide before a historic second Derby win gave the Red and Black hook. Duke! And after a few months in the wilderness, we returned in a new world and a new lifeline. Now we face a resurgent Wellington side looking to complete a clean sweep. We returned to Banquet Stadium as underdogs, down but not out for the counts. The Knicks sit second, their best ever finished to an A-League season, and it's time to spoil the party. At 7.30 Friday, our season is on the line. A spot in the finals is on the line. Our pride is on the line. Well, yes, it is all on the line for the Red and Black tonight. The race for the final series heats up, it's a race for six, and let's see who's going to do battle in that one. Let's look at tonight's starting 11 for the Western City Wanderers. The line-up's coming up on your screen right now. In goal number 50 is Tristan Prendergast, defences number six, Matt Jerman, alongside Dilla McGowan and Patrick Ziegler. On the wide flanks, number five, Daniel Giorgeski, along with Tate Russell, number 33 in the midfield. We've got number 17, Keanu Bacchus, number eight, Jordan O'Doherty. And up the top, we've got Nikolai Muller, Simon Cox, and of course, the captain, Mitch Duke. On the bench, we've got number 11, Bruce Kamau, number 13, Tas Mordekutis, number 19, Shveggler, number 22, Sullivan, number 27, Kwame Yabawa, number 30, Mo Adam, and number 40, Nick Suman is the second keeper. Now, we've just had the players come up and they're just warming up behind us. Of course, one of the key items to mention is that Simon Cox returns to the starting line-up, he came off the bench last week. Women's Shveggler is still on the bench for this game, but a strong line-up all up for the Western City Wanderers. They look raring to go. We're going to take a quick break and we'll be back to you guys shortly after this. Welcome back to Wanderers Live. We'd also like to take this opportunity, of course, to thank our major partners, co-major partners, Centuria and JD Sports, along with senior partners, Mitsubishi Electric, Pepper Money, Nike, Herbalife Nutrition, Westfield, EISS Super, McDonald's and Blacktown City Council. Thank you also to our category partners, Club Marconi, Intermain, Mates, The Coffee Emporium, Transport for New South Wales, Ola Cabs, Turner Freeman Lawyers and Western Sydney University. We'd also like to acknowledge our Foundation, Business and Charity partners. Don't forget, of course, to join in the conversation tonight using the hashtag WSWLive. Thank you everyone, of course, who's got involved so far. We've got some of the best of those coming up on the screen. Thank you to user at Sprin98. He's obviously in the game. The first game back here at Bank West. Thank you very much for sending that in. A great view, of course, from that eastern grandstand there, of course. There's not a bad view in the house here at Bank West. Hopefully you enjoy the game. Now, we've got a special guest joining us tonight. Please welcome the illustrious broadcaster and Wanderers fan, Tim Gilbert. Tim, welcome to the show. Michael, nice to be here. How are you? I'll come in a bit. We've got to make sure we social distance. A bit about there, right? That's perfect. A bit of space between us, of course. But Tim, now, first things first, the Wanderers are launching a new podcast. And, of course, it's something you're involved in. Tell us a little bit about this new show. It's really exciting, actually. Over the next few weeks, we will launch We Are the Wanderers of Western Sydney. And we're going to talk to, look, a whole stack of people, really, from the players to the coaching staff, to those in and around the Wanderers, those high-profile people that love this team. I've already done one with the... We just saw her up on the mix-run, actually, Kirsten Hamilton, live from North Carolina. And it's a really interesting discussion with her about her life, her career, her ups and downs, her challenges. And quite often, when people see sportspeople like her who are the player of the year, they think, oh, things are always fantastic. But she spoke to us about some of those moments in her career where she thought, is it worth it? Should I toss it in? She had a wonderful time out here in Australia. We talk about her favorite restaurant. So, look, yeah, Kirsten is the first. There's so many people to talk to over the course of time. And we'll just peel back the surface on the Wanderers, which is essentially one big family. It's a big family club. And we will go and have a chat with all members. So all the big stories behind the scenes. So really, the members get a real good chance to actually see what makes the players tick and the staff tick and what happens with the red and black. Oh, absolutely. And it won't be just a five-minute interview. You're talking about 25 minutes. We'll talk to members of the women's team, the coaching staff, the men's team. And we've got a quite a pronounced list. It's about who we don't talk to rather than who we do talk to, because there's so many people that have got great stories to tell. And over the course of the next little while, we'll bring them to our members. All about this wonderful club. We've actually told a few stories already for us. Now, some of the fans would have seen the interview we did with JP DeMarini, the big boss, and of course, Mitch Dukes, the one coming up. But I want to talk a bit about the boss first. Now, what is the target for him for the rest of the season based on your conversation? For Jean-Paul to keep winning. I spoke to Craig Foster about Jean-Paul and he said he's a killer. And look, I know him personally, obviously, like a lot of us do. And he's one of those competitive guys that has winning around him. And that's what he wants to do. Obviously, it's a huge game tonight. One will draw the other night. They just want to keep winning. And if the team keeps winning, it's congested, isn't it? I mean, the whole world has been wobbling on a taxes. So everyone needs to try and deal with what's going on. And the Wanderers, for the next few weeks, days, whatever it is, just got to keep winning. And I'm sure that that's what his mindset is. As the coach, he'll just want his team to get out there and finish on the scoreboard. Well, that's great news for all Wanderers fans to hear. Now, you did also speak to the captain, Mitch Duke. Now, that's coming up, of course. But what was the focus for the boys and the feeling in the camp now that they're returning to live football? I think they're all very excited. They know they're all very excited. And he spoke for the team, spoke about the challenges of dealing with the period where they weren't playing it. I don't think that period was easy for anybody, no matter what job you did or what age you were. So he gives a really interesting insight into that period. One of the things I've really found interesting about Mitch, too, is he's one of nine kids. So as the captain of the Wanderers, it's not always easy to get everyone tickets. So they've got to go on a bit of a ballot system. But, look, a fascinating individual went to Japan, went to the coast, and he's back here, a Western suburbs boy captain, a Western suburbs team, which we're all very proud of. And, yeah, it's a fascinating discussion because, yeah, but to answer the first part of your question, they're all very excited about being back playing what they love. Excellent. Well, that's great to hear. And it sounds like the boys are raring to go. Tim, thank you very much for joining us on Wanderers Live. You can, of course, catch that full interview with Mitch Duke on Facebook, Instagram, Twitter, and, of course, the Wanderers website. So definitely check that out. But in the meantime, we've got a quick snippet for you. Tim, thank you very much again. Thanks, Michael. Cheers. Mitchell Duke, the captain of the Western Sydney Wanderers, a Socaroo, and the Duke of Parramatta, known for his leadership, flexibility, and being able to rise to the occasion when it matters most for the red and black. He first joined the Wanderers midway through the 2018-19 season, scoring second into his debut against the Newcastle Jets. Into the near post. How about that? And was named captain six months later. Since then, he's starved for the Wanderers, hitting the back of the net 11 times this season and doesn't plan on slowing down any time soon as the Wanderers charge full steam ahead for a final series berth. Tim Gilbert sat down with Juki through the week at the Wanderer Football. How good is it to be playing again, Mitch? Mate, unbelievable to be fair. Like, as a footballer, you want that stimulation. You're used to a routine. And just to be able to do what you love again is the best feeling in the world. I think it's probably the longest break any footballer's had from the game. Something new for me, but you kind of use it as a learning experience. You know, so I've been learning on the way and making sure I can better myself, not just on the pitch, but off the pitch with the boys and that communication side of things and the mental side of things to better everyone and make sure, you know, I'm doing right by them. It was a learning experience, but not easy for sure. What about when COVID-19 hit? It sideswiped everybody. Yeah, with how unpredictable the scenario was with things changing every day, was a hard adjustment to deal with, but lucky enough, I have a small family that kind of kept me through it. But yeah, it definitely sideswiped us all and I think everyone's in the same boat all across the world. So it was a bit of an adjustment, but in saying that, I also turned it into a positive and enjoyed that extra family time. That extra time that I had with my four-year-old was a massive enjoyment for me. Back to Wanderers Live. I'm joined by Wanderers Chief Executive, John Satzimus. John, welcome to the show. Great to be here, Michael. Now, before we get into it, football fan to football fan, I have to ask. Now, I guess I'm throwing a little bit under it with this question, but how do you think we'll go tonight against such a strong Nick side? Well, Quillerton had been exceptional this year and it's certainly been a good challenge for our boys. We had a game the other day and there was a bit of rust in the performance and we anticipate them being showing a better performance tonight. Yeah, well, that's good. Hopefully I share your optimism and hopefully we will come over the three points. It is very important tonight, of course, to race to the finals. Now, COVID, of course, has been tough for everyone, but what has been a bit glossed over is how it is for you guys at the club and, of course, the staff and the effect of that. How difficult has it been for you guys at the club going through this period? Yeah, it's a good question. It certainly has been challenging in terms of no difference to everyone else in society. Business is any organisation and society in general has been affected. Staff have been, it's been tough for them. It's been tough for the players, but we've got a good group of staff and a good group of solid group of players and they understand what the scenario was and we worked through it together and the product is that we're here tonight. And I'm thankful for that and hopefully looking forward to the future. And hopefully things improve, of course, as in general society so that we don't have to make some of these tough decisions and go through these tough times. Now, there have been some speculation about some of the players and, of course, contracts. Now, what are some of the complexities that the club are actually having to go through with respect to contracts and transfers in this current climate? Yeah, it's an interesting situation at the moment and we've just touched upon the future. We don't know what the season next year may look like at this stage. We're in discussions at the moment. We're in discussions with the PFA, the FFA and a number of parties, including the broadcaster. And there's a number of elements that are crucial to this and no less important is the salary cap and what that may be in the revised competition. We're hopeful that we'll get some resolution to that very soon and that we'll understand. We've got some players in the contract at the moment and we understand what the space is so we're able to embark on our recruitment for next season. That's full of excitement. We've announced the coach and we're certainly looking forward to whatever the season may be to be very favorable. Very good insight for all Wanderers fans a little bit behind the scenes there. JT, thank you very much for joining us again and enjoy the game. Thank you very much, thank you. Now, let's look at the key matchups tonight. Going head to head is Davia and Nikolai Muller. Let's look at the key stats between the two. Nikolai Muller has six successful crosses equal with Davia's six for the Wellington Phoenix. Now, don't forget Nikolai Muller has spent a little bit under half the amount of time in the A-lig as Davia has. In terms of crossing accuracy, Nikolai Muller sits at 40% while Davia a little bit lower with 17.1%. In terms of assists, he's on with three assists. Davia with five. So a little bit more prolific up the top there. Now tonight's player to watch is of course Nikolai Muller. Let's check out this short clip. Yes, of course. It was a long time without football and now we are back and it feels good. Physically it was okay, but I think we are not happy with the result and our performance and we can do it better. But it feels good that I can play again on the pitch. And for us it's clear that this is the final for us. We have to win the next game to happen for the finals and we have nothing to lose and we have to give everything 100%. And yes, we have to win this. This is clear and that just these three points bring us better in the table and this is the most important thing to win this game. For me at the moment, I think it's the best team in the league and I don't know, they lose maybe one game. It's against Sydney FC, but they have a long streak, win streak or don't lose games and they play a very good ball. And I think they're for me the best team at the moment. We have to do everything 100% and stay together as a team and we show these last games against Sydney FC. We can beat everyone, but we can lose everyone. So yeah, we have to put everything in the game and help the team. And I give everything to help my team and that we win the games. Yeah, I can't wait, looking forward to be back in the Benko Stadium and with our fans and crowds. And yeah, it feels good to come home. It was a long time, the last game and yeah, it feels good. Welcome back to Wanderers Live. I've got one final guest last, but certainly not least. I'm joined by Rob Shahadi. Rob, welcome to the show. I'm loving it, man. I was just walking past the stadium and someone hooked me up. One of my cousins with tickets, so here I am. Oh, that's awesome, mate. Very lucky opportunity. I'm sure one of the many cousins hooked you up there. Now, it's great to see the unofficial mayor of Parramatta, gracious with his presence. How good is it to see live football back in your home city? Yeah, I love it. I've been a Parramatta boy all my life. I have not left the area. And to see live sport again is very exciting. It's good for the mental health. Being shut down wasn't really good and it's good to have it back. And being the unofficial mayor of Parramatta, you know, I'm hoping to get a bronze statue outside the Banque West Stadium. Do you think there's an... I mean, I don't know if your view is there. If you think I should have a statue of myself outside the stadium, I know there's one of Ray Price out there, but, you know, I reckon I could have a kebab in my hand or something. I don't know, what do you reckon? I definitely think it's a chance. I think there are some very worried club executives standing behind, walking away, shaking their heads. We've got a thumbs up. I think you've got the go ahead. Johnny's Greek is Greek. He understands. He'll call it a Eros. There's a debate there who actually invented it. There's the Baclava Wars who invented that. I mean, there's a lot of things, you know. So what's your background? My background? Half Asian, half English. That's a mix to get your head around, isn't it? Jeez. We don't have... I just call it a kebab. So I'm with you, I'm in that camp.  I'm neither. That's why I'm here.  Yeah, pretty much, pretty much, yeah. My parents are very unhappy with me, but... Can I sell it to my aunties and uncles? Feel free. Hi, everyone. Hi, good thanks.  Because I'm pretty sure I've seen you at... I won't name the teams here, but I've seen you at so many different sporting events. Is there any sport you don't even watch? I actually like it all. I actually used to play sports. I was like a... I don't know if you want me to say the sport. Go for it, go for it. I used to play rugby union, so I was like one step from Wallabies. So not many people know that. They probably think I'm telling a joke, but I did play rugby. I played for Australia, I played for New South Wales in juniors under 19, 21. So, you know, it's... I love it. I love sports. What about golf? I don't like... I'm too tall for golf. I actually have a golf club in my boot of my car. Oh, yeah, just in case you want to go for the occasional driving rain. Oh, OK. Well... Just for security reasons, you know what I mean? Let's go back on topic. What do you think tonight's score predictions? We're playing the Knicks. They're right up there at the top of the table. They're doing well, but we're the underdogs. The plucky underdogs, the pride of Western Sydney. Yeah, I'm going for a 2-1 win for the Wanderers, and because I'm here. Yeah. You're the Lucky Charm. That's right, so I think we can take them tonight. I'm really excited about it and up the Wanderers. Yeah, unofficial mirror parameter, future bronze statue out the front of Bank West Stadium and Lucky Charm to the Western Sydney Wanderers. I like the sound of that. Hopefully three points for the Wanderers. Hopefully three points in the next game, of course. Members can redeem tickets to our next home match, versing the Perth Guard, of course. Tuesday the 4th of August. Visit tickettech.com.au to redeem tickets. You need a valid 2019-20 membership to download your mobile ticket. For more information, you can contact the club. Visit wanderland.com.au. Was there something on that desk before? Thanks for having me. See you later, everyone. Enjoy the game. Up the Wanderers. Of course, thanks, everyone, for tuning in to Wanderers Live. Thank you, Rob, for joining us. Of course, thank you, Tim and John for jumping on the show as well. Thanks to all our loyal members and fans for tuning in. Don't forget, there is a match to watch, so tune in Fox Sports 507 KO or the My Football Live app. You can also follow all the action on Twitter. Use the match, the hashtag, WSWV, WEL. I'm looking forward to seeing you guys all back here next Tuesday. Thanks for watching.


Hey guys, welcome back to my youtube channel Little cozy up here today cuz it's freaking cold out and I hate the cold So today I'm gonna do a short video with you guys on It's kind of like Kind of like a hack, but like not like it is and it's really Something I've learned over the last few years that have drastically improved my life And I just want to share it with you if you're new here I'm Sarah and I help teach people how to find inner happiness through fitness and spear duality So let's get right into it All right, so this channel is all about happiness right like let's be happy. Let's live a happy fulfilling life Let's be positive.   So really all it is is Doing the little things that will make yourself happier down the road Whether that's an hour from now or a day from now or whatever and usually it's a very short-term thing And that's why I've seen such a drastic change with it over the years.  I should have been this So just do it and do it in the moment that you were thinking about it. That's another key here. So For example, right before I started filming this video I knew that I threw laundry into the washer earlier And I don't know if you guys do this like I do but I often forget that my laundry is in the wash and Like a day will go by and then I'm like crap and then you have to rewash it and put it in the dryer So I didn't feel like going down and putting my laundry in the dryer. I know it's super lazy. Whatever, okay? I know I know you don't tell me and I did it.  There is nothing nicer than coming home After a long day to a nice freshly made bed that you can climb into like am I right? I'm right. You only have to tell me I'm right. I know so it's all of these little tiny things that you do for yourself that Will accumulate in snowball before you know it you're constantly doing things for yourself You're not even thinking about because you know it'll make you happier and then to even make it better Once you do that thing and it pays off in a few hours or the next day or whatever Like find the gratitude in that so going back to the phone charger example Okay, so I wake up in the morning and I look over and grab my phone from the alarm off whatever and the phone's fully charged I'm like, yes, actually I'll tell you guys a little secret. I pat myself and I say good job So I'll be like good job Sarah.   It's just but it's the little things just remember that it's the little things in life that matter It's not the big vacation you take once a year like yeah, that's great for the week that you're there but what about the other 358 days, you know Like you should be taking care of yourself and showing up for yourself at every point of your life And this is the easiest Simplest least time-consuming way to do it. So that's all I have for you guys today. I love you so much I hope you try this if you do let me know in the comments below how it goes I just want you to live happy lifestyle. I love you Please don't forget to like and subscribe if you haven't already so we can hang out again next week I love you guys and don't forget Be limitlessly yourself


Do you sometimes lack confidence when in a position? Perhaps you snatch early profits as price approaches prior resistance. I'm going to show you how to use absorption to keep you in your trades for longer. First, we turn on the liquidity heat map. This shows the position and size of limit orders in the order book over time. Next, let's swap candlesticks for a more precise best bid and offer line. Finally, we're going to swap aggregated volume bars for volume dots that show the exact location of transactions. Now check this out. As price hits prior resistance, liquidity is added to the bid. Now observe how aggressive sellers are completely absorbed by this resting liquidity and are unable to push price lower. This order flow phenomenon is called absorption and can help confirm bullish momentum. Can you spot absorption anywhere else in this move?